L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 28

 
mytarmailS:
Je l'ai déjà fait, le réseau neuronal n'apprend pas sur un horizon plus grand avec la cible que je lui ai donnée.

Je souris à vos paroles.

Ce n'est pas un réseau neuronal qui n'apprend pas, mais vous faites en sorte qu'il n'apprenne pas, littéralement. Le réseau neuronal apprend lorsqu'il y a du signal à côté du bruit, mais votre tâche consiste à séparer ce signal du bruit à l'aide du grand réseau neuronal, sans le laisser sur-apprendre.

 
Alexey Burnakov:
C'est une réponse plus correcte). Je vais essayer différentes méthodes.

J'ai un jour suggéré cette approche.

Nous prenons un Conseiller Expert, il peut être de kodobase. L'essentiel est qu'il soit de plein droit et peu importe s'il est perdant. Vous pouvez définir les exigences préliminaires. Par exemple : trending, trois fenêtres, sans SL et TP, MM, récupération d'erreurs d'états...

Nous devons chercher la raison de la perte et essayer de la résoudre en utilisant R. Résoudre les problèmes dans les fenêtres basses en extrapolant, dans la fenêtre haute nous prédisons la prochaine barre par classification.

 
Alexey Burnakov:

Mon article sur la sélection des caractéristiques.

https://habrahabr.ru/company/aligntechnology/blog/303750/

C'était intéressant à lire, merci pour le travail accompli. Je ne comprends pas l'expérience 6 - pourquoi les prédicteurs Y et Z ont-ils été sélectionnés à la fin ? Z est la variable cible, elle n'aurait pas dû figurer dans la liste des prédicteurs.

J'aime l'idée de prendre un graphique de lapin en 3D et d'entraîner le modèle sur ce graphique. Pour être honnête, j'ai d'abord pensé que le "lapin" était une sorte de donnée pseudo-aléatoire qui a une belle apparence sur le graphique et qui n'a de sens que pour un humain capable de voir le lapin dans un tableau de chiffres. Mais il n'y a pas de fonction qui décrit le lapin, pour n'importe quel modèle, c'est juste un ensemble de points qui forment des groupes de formes spéciales dans l'espace tridimensionnel. De mon point de vue, les trois coordonnées de chaque point n'ont aucune relation ni dépendance entre elles, je m'attendais à ce qu'aucun algorithme ne puisse les gérer. A la fin de l'article, j'ai été surpris.

J'ai tenté la même expérience avec PCA, et les résultats sont les suivants :
J'ai besoin d'un composant pour une précision de 95%, il utilise X et Y. Mais l'algorithme de prédiction ne fonctionne pas avec un seul composant, il m'en faut au moins deux. En fait, ils utilisent tous deux X et Y (ce n'est pas indiqué dans le code, mais vous pouvez le voir dans le graphique), donc tout va bien.
Entraîner le modèle sur l'échantillonA, puis prédire Z pour l'échantillonA : R^2 = 0.04759303
Entraîner le modèle sur l'échantillon A, puis prédire Z pour l'échantillon B : R^2 = 0.05325888

J'ai dessiné un graphique 3D de la prédiction Z pour l'échantillon B, c'est mal parti. Le modèle n'a pas vraiment trouvé de dépendances, il a juste calculé la moyenne de tous les Z sur un seul plan. Le lapin est sorti à plat. Avez-vous essayé de former quelques modèles, et de dessiner un lapin prédit ? Je me demande comment cela fonctionne pour les différents modèles.

Ci-joint le code pour le lapin et le pca y-aware. Il y a un petit bug, le graphique des charges des prédicteurs trie les composants pour une raison quelconque. C'est-à-dire qu'ils sont 1,10,11,12,2,3,4,5,... mais par ordre d'importance nous devrions regarder dans cet ordre : PC1, PC2, PC3,....

Dossiers :
bunny_pca.txt  5 kb
 
mytarmailS:
Je l'ai déjà fait, le réseau neuronal n'apprend pas sur un horizon plus large avec la cible que je lui ai fixée.

Je n'ai pas encore essayé d'entraîner le neurone au-delà d'une barre, mais je suppose que le principe sera le même. Je le travaille comme suit :

1) recueillir autant de données brutes que possible de mt5 - ohlc, temps, indicateurs. Comme je ne sais pas ce qui est utile et ce qui ne l'est pas, je prends tout et j'essaie de trier les déchets. Je ne peux pas tout envoyer à neuronka, parce que neuronka se réapprend sur des déchets et dans ce cas, il fait une erreur dans le fronttest. Il n'est pas facile de trier les déchets. En fait, les 28 pages de ce fil de discussion portent sur la manière de le faire, et jusqu'à présent, tout est ambigu. J'ajoute une variable cible aux données - 0 ou 1 selon la baisse ou la hausse du prix pour la prochaine barre.

2) Tamisage des débris proprement dit. Il devrait y avoir une fonction qui analyse les données initiales et leur attribue un score. Plus l'estimation est élevée, moins il y a de déchets. Nous essayons d'alimenter la fonction d'évaluation avec diverses combinaisons de prédicteurs sources (colonnes du tableau de formation) et tentons d'augmenter le résultat. On finira par trouver un certain ensemble de prédicteurs qui, en théorie, n'entraîneront pas de surentraînement.

3) Supposons que les ordures soient éliminées. Il est maintenant temps de former le réseau neuronal. J'utilise le paquet nnet de R, il a des avantages sous la forme de l'absence d'hyperparamètres comme la vitesse d'entraînement, l'accélération, le retard, les types de fonctions d'entraînement. Moins d'hyperparamètres signifie moins de problèmes. Vous devez vous entraîner avec une validation croisée. Je prends le tableau initial et le divise en trois lignes avec un ratio de 70%/15%/15% (les nouveaux tableaux s'appellent train/test/validate) (le code peut être pris dans le journal du hochet, j'ai commencé à partir de celui-ci). Ensuite, je fais par exemple 10 itérations de formation de neurones sur la table de formation. Je calcule l'erreur de prédiction R^2. Je prédis les résultats pour les tableaux de test et de validation et je calcule le R^2 pour eux aussi. Je fais 10 itérations supplémentaires d'apprentissage, je répète la prédiction pour 3 tableaux et je regarde le nouveau R^2. Arrêtez l'entraînement lorsque le R^2 sur certaines des tables commence à baisser (il ne croîtra toujours que sur la table d'entraînement). C'est fait. Vous pouvez maintenant répéter tout cela, en utilisant un nombre différent de neurones cachés et un nombre différent d'itérations d'apprentissage entre les validations croisées, dans l'espoir que le R^2 minimal des trois tableaux à la fin soit plus élevé que la dernière fois.

Tout cela peut sembler un peu compliqué, mais en fait c'est encore plus compliqué :), il y a un tas de problèmes dans chacune de ces étapes. Mais il donne des résultats cohérents.

 
SanSanych Fomenko:

C'est une bonne chose que tu n'aies pas appris, parce que tu enseignes sur le bruit. Mais si tu le faisais, tu apprendrais sur le graal, sur le réel.....

Je suis occupé ici à essayer d'éliminer le bruit. C'est pourquoi nous prenons tant de prédicteurs dans l'espoir qu'il reste au moins quelque chose.

Vous essayez d'utiliser le bruit comme entraîneur, vous devriez comprendre que si le stochastique (par exemple) avait le chiffre magique 90 et que le marché chutait lorsque l'indicateur avait une telle valeur, nous n'aurions pas besoin de réseaux, ce serait visible.

1) Au mieux, ce que vous faites est de sélectionner les 10 meilleurs indicateurs sur 100 possibles selon certains critères, et l'indicateur a une gamme de valeurs, disons 100 sur ces 100 valeurs, seulement 3 fonctionnent et pas toujours mais dans certaines situations.seules ces 3 valeurs ne sont pas du bruit et seules elles devraient être conservées à la place de l'indicateur car les autres valeurs sont du même bruit, donc tous ces rejets ne sont pas qualitativement profonds et donc pas très efficaces.

2) De plus, il existe une notion d'incohérence des attributs, par exemple, prenez le prix, il est objectif et non contradictoire, c'est-à-dire que si le prix monte, il monte et il n'y a pas de seconde (si on ignore les nuances de la force de la tendance, etc.), prenez la même stochastique, elle peut prendre 90 valeurs lorsque la tendance est plate et ascendante et descendante, soitQuant à l'autre côté, cet indicateur n'aide pas le réseau, au contraire, il embrouille toujours le marché car ses lectures sont incohérentes, donc les indicateurs ordinaires ne sont pas applicables au marché , et vous n'y pensez même pas, vous remplissez tout, et ensuite vous me parlez du bruit.

Je ne suis pas satisfait de l'horizon de prévision comme je l'ai écrit ci-dessus.

 
Dr. Trader:

C'était intéressant à lire, merci pour le travail accompli. Je ne comprends pas l'expérience 6 - pourquoi les prédicteurs Y et Z ont-ils été sélectionnés à la fin ? Z est la variable cible, elle n'aurait pas dû figurer dans la liste des prédicteurs.

J'aime l'idée de prendre un graphique de lapin en 3D et d'entraîner le modèle sur ce graphique. Pour être honnête, j'ai d'abord pensé que le "lapin" était une sorte de donnée pseudo-aléatoire qui a une belle apparence sur le graphique et qui n'a de sens que pour un humain capable de voir le lapin dans un tableau de chiffres. Mais il n'y a pas de fonction qui décrit le lapin, pour n'importe quel modèle, c'est juste un ensemble de points qui forment des groupes de formes spéciales dans l'espace tridimensionnel. De mon point de vue, les trois coordonnées de chaque point n'ont aucune relation ni dépendance entre elles, je m'attendais à ce qu'aucun algorithme ne puisse les gérer. A la fin de l'article, j'ai été surpris.

J'ai tenté la même expérience avec PCA, les résultats sont les suivants :
Un seul composant est nécessaire pour une précision de 95%, il utilise X et Y. Mais l'algorithme de prédiction ne fonctionne pas avec un seul composant, il faut en prendre au moins deux. En fait, ils utilisent tous deux X et Y (ce n'est pas indiqué dans le code, mais vous pouvez le voir dans le graphique), donc tout va bien.
Entraîner le modèle sur l'échantillonA, puis prédire Z pour l'échantillonA : R^2 = 0.04759303
Entraîner le modèle sur l'échantillon A, puis prédire Z pour l'échantillon B : R^2 = 0.05325888

J'ai dessiné un graphique 3D de la prédiction Z pour l'échantillon B, c'est mal parti. Le modèle n'a pas vraiment trouvé de dépendances, il a juste calculé la moyenne de tous les Z sur un seul plan. Le lapin est sorti à plat. Avez-vous essayé de former quelques modèles, et de dessiner un lapin prédit ? Je me demande comment cela fonctionne pour les différents modèles.

Ci-joint le code pour le lapin et le pca y-aware. Il y a un petit bug, le graphique des charges des prédicteurs trie les composants pour une raison quelconque. C'est-à-dire qu'ils sont 1,10,11,12,2,3,4,5,... mais par ordre d'importance, vous devez regarder dans cet ordre : PC1, PC2, PC3,...

Alors, avez-vous X et Y dans les composants principaux ? Il serait important de le comprendre.

Deuxièmement, à propos de l'approximation du lapin. Bien sûr qu'elle doit l'être ! C'est un modèle linéaire. Il dessinera simplement un plan (si X et Y) avec un peu de pente, ou une ligne (si un prédicteur). C'est tout le modèle linéaire du lapin) C'est pourquoi j'essaie d'utiliser des modèles non linéaires.

Voici comment reconstruire le lapin en utilisant une autre méthode (basée sur des valeurs discrètes).

 
Alexey Burnakov:

Alors, est-ce que X et Y apparaissent dans les composants principaux ? Il serait important de le comprendre.

Oui, seulement X et Y. Je n'ai pas encore trouvé comment faire cela via le code, tous les articles à ce sujet fonctionnent avec des graphiques. Le nombre de composants à prélever peut être consulté dans la variable componentsToUse. Dans ce cas, componentsToUse = 2, cela signifie que vous devez prendre uniquement les prédicteurs qui ont des lignes horizontales larges sur le graphique pour PC1 et PC2.

Dans le graphique ci-dessus, regardez les colonnes PC1 et PC2 (les première et deuxième composantes principales), puis les lignes horizontales vertes. Si la ligne s'éloigne de 0 (qu'elle soit positive ou négative), alors ce prédicteur est utilisé dans la composante principale correspondante. PC1 utilise y_clean ("_clean" est automatiquement ajouté lors de la mise à l'échelle des données pour éviter toute confusion avec le prédicteur original), PC2 utilise x_clean. C'est le résultat de l'analyse en composantes PCA - vous devez prendre x_clean et y_clean.

Pour aller plus loin, PC3 utiliserait input_noise_3_clean. Ceci est juste un exemple, PC3 n'est pas nécessaire dans ce cas.

En fait, ça a très bien marché. X et Y se détachent clairement sur le graphique. J'ai déjà publié le même graphique pour le forex où tout est mauvais.

 
Dr. Trader:

Oui, seulement X et Y. Je n'ai pas encore trouvé comment faire cela en code, tous les articles à ce sujet fonctionnent avec des graphiques. Le nombre de composants à prélever peut être consulté dans la variable componentsToUse. Dans ce cas, componentsToUse = 2, cela signifie que vous devez prendre uniquement les prédicteurs qui ont des lignes horizontales larges sur le graphique pour PC1 et PC2.

Dans le graphique ci-dessus, regardez les colonnes PC1 et PC2 (les première et deuxième composantes principales), puis les lignes horizontales vertes. Si la ligne s'éloigne de 0 (qu'elle soit positive ou négative), alors ce prédicteur est utilisé dans la composante principale correspondante. PC1 utilise y_clean ("_clean" est automatiquement ajouté lors de la mise à l'échelle des données pour éviter toute confusion avec le prédicteur original), PC2 utilise x_clean.

Pour aller plus loin, PC3 utiliserait input_noise_3_clean. Ceci n'est qu'un exemple, il n'est pas nécessaire d'utiliser le PC3 dans ce cas.

En fait, ça a très bien marché. X et Y ressortent clairement du graphique. J'ai déjà publié le même graphique pour le forex, mais il n'est pas aussi bon.

La sélection du prédicteur s'est avérée ici se faire par la méthode linéaire. Eh bien, je suis heureux que vous soyez surpris. Cela signifie que vous avez vu quelque chose de nouveau.)
 
Dr. Trader:

Je n'ai pas encore essayé d'entraîner le neurone au-delà d'une barre, mais je suppose que le principe sera le même. Je le travaille comme suit :

1) recueillir autant de données brutes que possible de mt5 - ohlc, temps, indicateurs. Comme je ne sais pas ce qui est utile et ce qui ne l'est pas, je prends tout et j'essaie de trier les déchets. Je ne peux pas tout envoyer à neuronka, parce que neuronka se réapprend sur des déchets et dans ce cas, il fait une erreur dans le fronttest. Il n'est pas facile de trier les déchets. En fait, les 28 pages de ce fil de discussion portent sur la manière de le faire, et jusqu'à présent, tout est ambigu. J'ajoute une variable cible aux données - 0 ou 1 en fonction de la baisse ou de la hausse du prix pour la prochaine barre.

2) Tamisage des débris proprement dit. Il devrait y avoir une fonction qui analyse les données initiales et leur attribue un score. Plus l'estimation est élevée, moins il y a de déchets. Nous essayons d'alimenter la fonction d'évaluation avec diverses combinaisons de prédicteurs sources (colonnes du tableau de formation) et tentons d'augmenter le résultat. On finira par trouver un certain ensemble de prédicteurs qui, en théorie, n'entraîneront pas de surentraînement.

3) Supposons que les ordures soient éliminées. Il est maintenant temps de former le réseau neuronal. J'utilise le paquet nnet de R, il a des avantages sous la forme de l'absence d'hyperparamètres comme la vitesse d'entraînement, l'accélération, le retard, les types de fonctions d'entraînement. Moins d'hyperparamètres signifie moins de problèmes. Vous devez vous entraîner avec une validation croisée. Je prends le tableau initial et le divise en trois lignes avec un ratio de 70%/15%/15% (les nouveaux tableaux s'appellent train/test/validate) (le code peut être pris dans le journal du hochet, j'ai commencé à partir de celui-ci). Ensuite, je fais par exemple 10 itérations de formation de neurones sur la table de formation. Je calcule l'erreur de prédiction R^2. Je prédis les résultats pour les tableaux de test et de validation et je calcule le R^2 pour eux aussi. Je fais 10 itérations supplémentaires d'apprentissage, je répète la prédiction pour 3 tableaux et je regarde le nouveau R^2. Arrêtez l'entraînement au moment où le R^2 de certaines tables commence à baisser (il ne croîtra toujours que sur la table d'entraînement). C'est fait. Vous pouvez maintenant répéter tout cela, en utilisant un nombre différent de neurones cachés et un nombre différent d'itérations d'apprentissage entre les validations croisées, dans l'espoir que le R^2 minimal des trois tableaux à la fin soit plus élevé que la dernière fois.

Tout cela peut sembler un peu compliqué, mais en fait c'est encore plus compliqué :), il y a un tas de problèmes dans chacune de ces étapes. Mais il donne des résultats cohérents.

J'ai un point de vue différent et vous ne le comprenez pas.
 

SanSanych Fomenko:
Et si on prenait les 10 premiers (en quelque sorte) avant l'étape, et qu'on écartait le reste ?

J'ai dessiné un graphique du R^2 et du pourcentage de cas gagnants en fonction du nombre de composants utilisés. Le meilleur résultat du fronttest a été obtenu avec 41 composants (gain d'environ 70%, très bon). Mais on ne peut pas le voir sur les graphiques de backtest, ils ne cessent de monter. Si nous nous basons sur l'importance des composants, nous aurions dû prendre 73, ce qui n'est pas le meilleur résultat du fronttest.

Le R^2 du fronttest peut être négatif même s'il gagne >50% des cas, en raison du déséquilibre des résultats requis, le nombre de classes "0" est différent de "1", donc leur moyenne n'est pas de 0,5, et le R^2 en est légèrement plus mauvais.

Raison: