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

 
Dr. Trader:

Merci, j'ai essayé. Je vois que vous avez fait beaucoup pour sélectionner les prédicteurs, car les neurones se sont facilement entraînés sur eux, et ont stocké le résultat sur l'ensemble de données de test également.

Les résultats ci-dessous se réfèrent à la formation sur R1.F3

1) Il y a un résultat amusant avec Rattle. HH avec la configuration standard a montré des erreurs de formation/validation/testing de 30%/29%/33%. L'erreur sur R2.F3 est de 35%. Mais tout ceci n'est qu'un cas de chance, en réalité. Dans une autre configuration, il aurait facilement été sous-formé ou surformé, ici il a juste eu de la chance.

2) J'ai ensuite adopté une approche simple et grossière avec un apprentissage non supervisé, 200 neurones cachés, le réseau a été entraîné jusqu'à ce qu'il cesse de s'améliorer. Erreurs former/valider/tester/R2.F3 - 2%/30%/27%/45%. En clair, le réseau est réentraîné.

3) L'apprentissage supervisé. C'est différent des arbres, mais vous devez toujours faire cela avec un neurone pour ne pas le surentraîner. Il s'agit essentiellement d'interrompre l'entraînement de temps en temps et de vérifier les résultats de l'entraînement/de la validation/du test. Je ne connais pas la règle d'or en matière de collationnement des résultats, mais il est tout à fait normal de s'entraîner sur l'ensemble de données d'entraînement, puis de rechercher les erreurs dans les ensembles de données de validation et de test, et d'arrêter l'entraînement lorsque les erreurs dans la validation et le test cessent de diminuer. Cela donne une sorte de garantie contre le surentraînement. R2.F3 est considéré comme indisponible pendant tout ce processus, et le test n'est effectué qu'après la fin de la formation. Dans ce cas, les erreurs train/validation/testing/R2.F3 sont de 27%/30%/31%/37%. Là encore, il y a surentraînement, mais pas beaucoup. Vous auriez pu arrêter le processus d'apprentissage dès que l'erreur de formation est devenue nettement inférieure aux erreurs de validation/testing, mais c'est une supposition... pourrait ou ne pourrait pas avoir aidé.

La variable cible "R1.F1" a trois valeurs, Rattle ne peut pas faire cela avec la neuronique et vous devez écrire votre propre code en R, j'ai ignoré cet ensemble de données.

"R1.F4" "R1.F5" "R1.F6" a donné à peu près les mêmes résultats pour les 4 erreurs dans Rattle neuronka, je pense qu'une approche adéquate avec neuronka donnera aussi à peu près les mêmes résultats, je ne les ai pas traités plus avant.

J'ai des chiffres similaires pour Forest et Ada.

Maintenant, si nous revenons à nos "béliers" - comment éliminer le bruit d'une liste arbitraire de prédicteurs ? J'ai un algorithme empirique qui a sélectionné mes 27 prédicteurs parmi 170. Je l'ai également utilisé pour analyser les ensembles de prédicteurs d'autres personnes, avec succès également. Sur la base de cette expérience, je soutiens que toutes les méthodes de R qui utilisent des variables "d'importance" dans leurs algorithmes ne peuvent pas débarrasser l'ensemble des prédicteurs du bruit.

Je lance un appel à tous les lecteurs de la branche : je suis prêt à faire l'analyse appropriée si les données brutes sont présentées sous forme de RData ou d'un fichier Excel qui ne nécessite pas de traitement.

A part ça.

Je joins un certain nombre d'articles qui sont censés résoudre le problème de la suppression du bruit de l'ensemble original de prédicteurs, et ce avec une bien meilleure qualité. Malheureusement, je n'ai pas le temps de l'essayer pour le moment. Peut-être que quelqu'un va essayer et poster le résultat ?

 
SanSanych Fomenko:

Vous trouverez ci-joint un certain nombre d'articles qui sont censés résoudre le problème de la suppression du bruit de l'ensemble original de prédicteurs, et ce avec une qualité bien supérieure. Malheureusement, je n'ai pas le temps de l'essayer pour le moment. Peut-être que quelqu'un fera un essai et postera le résultat ?

Merci, j'ai feuilleté le document, mais je n'ai pas trouvé ce dont j'ai besoin. J'essaie d'entraîner mon modèle pour le forex, quelque part entre M15 et H4. Il ne me suffit pas de prendre les données de la dernière barre, je dois les prendre pour des dizaines de barres à la fois et les placer les unes après les autres dans un long tableau pour les entrées du modèle. Par exemple (open_bar1, close_bar1, hh_bar1, open_bar2, close_bar2, hh_bar2, open_bar3, close_bar3, hh_bar3,...). Si une méthode de sélection me dit de supprimer le temps de la deuxième barre, cela ne m'aidera pas, la méthode devrait me dire de supprimer par exemple toutes les données concernant le temps (indices 3,6,9...).

Ai-je bien compris que dans votre fichier ALL_cod.RData, vous pouvez également utiliser Rat_DF1 pour la formation (en spécifiant la cible nécessaire) et ensuite utiliser Rat_DF2 et Rat_DF3 pour la vérification ? J'ai joint mon code en R pour ceux qui sont intéressés, il met en œuvre la formation de réseaux neuronaux contrôlés par les erreurs. Pour sélectionner une autre variable cible, vous pouvez simplement remplacer "Short_Long.75" dans le fichier par quelque chose parmi "Short_Long.35", "Flet_Long", "Short_Flet", "Flet_In". C'est plus pratique que de substituer des ensembles de données différents.

Dossiers :
 
Dr. Trader:
J'essaie d'entraîner mon modèle pour le forex, quelque part dans la gamme M15-H4. Il ne me suffit pas de prendre les données de la dernière barre, j'ai besoin de les prendre pour des dizaines de barres à la fois, et de les mettre les unes après les autres dans un long tableau pour les entrées du modèle. Par exemple (open_bar1, close_bar1, hh_bar1, open_bar2, close_bar2, hh_bar2, open_bar3, close_bar3, hh_bar3,...). Si une méthode de sélection me dit que je dois supprimer le temps de la deuxième barre, cela ne m'aidera pas, la méthode devrait me dire que je peux supprimer par exemple toutes les données de temps (indices 3,6,9...).

mmm Des données temporelles peuvent être nécessaires, car les marchés fonctionnent différemment selon les sessions.

Regardez l'ensemble des fonctionnalités de mon forex :

> names(sampleA)

  [1] "lag_diff_2"        "lag_diff_3"        "lag_diff_4"        "lag_diff_6"        "lag_diff_8"        "lag_diff_11"       "lag_diff_16"     

  [8] "lag_diff_23"       "lag_diff_32"       "lag_diff_45"       "lag_diff_64"       "lag_diff_91"       "lag_diff_128"      "lag_diff_181"    

 [15] "lag_diff_256"      "lag_diff_362"      "lag_diff_512"      "lag_diff_724"      "lag_mean_diff_2"   "lag_mean_diff_3"   "lag_mean_diff_4" 

 [22] "lag_mean_diff_6"   "lag_mean_diff_8"   "lag_mean_diff_11"  "lag_mean_diff_16"  "lag_mean_diff_23"  "lag_mean_diff_32"  "lag_mean_diff_45"

 [29] "lag_mean_diff_64"  "lag_mean_diff_91"  "lag_mean_diff_128" "lag_mean_diff_181" "lag_mean_diff_256" "lag_mean_diff_362" "lag_mean_diff_512"

[36] "lag_mean_diff_724" "lag_max_diff_2"    "lag_max_diff_3"    "lag_max_diff_4"    "lag_max_diff_6"    "lag_max_diff_8"    "lag_max_diff_11" 

 [43] "lag_max_diff_16"   "lag_max_diff_23"   "lag_max_diff_32"   "lag_max_diff_45"   "lag_max_diff_64"   "lag_max_diff_91"   "lag_max_diff_128"

 [50] "lag_max_diff_181"  "lag_max_diff_256"  "lag_max_diff_362"  "lag_max_diff_512"  "lag_max_diff_724"  "lag_min_diff_2"    "lag_min_diff_3"  

 [57] "lag_min_diff_4"    "lag_min_diff_6"    "lag_min_diff_8"    "lag_min_diff_11"   "lag_min_diff_16"   "lag_min_diff_23"   "lag_min_diff_32" 

 [64] "lag_min_diff_45"   "lag_min_diff_64"   "lag_min_diff_91"   "lag_min_diff_128"  "lag_min_diff_181"  "lag_min_diff_256"  "lag_min_diff_362"

 [71] "lag_min_diff_512"  "lag_min_diff_724"  "lag_sd_2"          "lag_sd_3"          "lag_sd_4"          "lag_sd_6"          "lag_sd_8"        

 [78] "lag_sd_11"         "lag_sd_16"         "lag_sd_23"         "lag_sd_32"         "lag_sd_45"         "lag_sd_64"         "lag_sd_91"       

 [85] "lag_sd_128"        "lag_sd_181"        "lag_sd_256"        "lag_sd_362"        "lag_sd_512"        "lag_sd_724"        "lag_range_2"     

 [92] "lag_range_3"       "lag_range_4"       "lag_range_6"       "lag_range_8"       "lag_range_11"      "lag_range_16"      "lag_range_23"    

 [99] "lag_range_32"      "lag_range_45"      "lag_range_64"      "lag_range_91"      "lag_range_128"     "lag_range_181"     "lag_range_256"   

[106] "lag_range_362"     "lag_range_512"     "lag_range_724"     "symbol"            "month"             "day"               "week_day"        

[113] "hour"              "minute"            "future_lag_2"      "future_lag_3"      "future_lag_4"      "future_lag_6"      "future_lag_8"    

[120] "future_lag_11"     "future_lag_16"     "future_lag_23"     "future_lag_32"     "future_lag_45"     "future_lag_64"     "future_lag_91"   

[127] "future_lag_128"    "future_lag_181"    "future_lag_256"    "future_lag_362"    "future_lag_512"    "future_lag_724"

Je prends les deux données des moyennes mobiles, et les hauts et les bas, et les écarts de prix dans la fenêtre. Et le temps, les jours et même les mois).

Mes algorithmes peuvent, de manière réaliste, laisser 10 ou même 5 prédicteurs sur 114. C'est normal. Dans de telles données, il existe une forte corrélation entre les PRÉDICTEURS et donc une forte redondance.

 

Je vais vous donner un bref aperçu de ma méthode de sélection des éléments informatifs. Le code est joint.

La question comporte deux aspects : comment sélectionner les sous-ensembles et comment mesurer la pertinence des prédicteurs sélectionnés par rapport à la variable de sortie.

La première question. Je le résous par une énumération stochastique de combinaisons de prédicteurs en utilisant la méthode du recuit simulé. Résultats similaires à ceux de la génétique et de la descente de gradient non déterministe. Le côté positif est qu'il sélectionne à partir de minima locaux et fonctionne selon le principe de la nature. Peut fonctionner avec une surface d'erreur non lisse, mais ici tout est conditionnel.

Pour de nombreux problèmes, les partisans de la méthode la considèrent comme meilleure que la génétique, par exemple. Il est mis en œuvre par le biais d'un paquet dans R comme un standard presque. L'astuce est que c'est pour des données continues, et j'ai des indices de prédicteurs, donc je fais un vecteur continu de la longueur du nombre total de prédicteurs et quand un scalaire dépasse le seuil donné l'indice du prédicteur devient un.

Ladeuxième question est encore plus subtile. Fonction de fitness.

Comment mesurer que le prédicteur (et l'ensemble des prédicteurs) affecte la sortie. La dépendance peut être non linéaire. La régression standard peut obtenir de grands retards sur certains problèmes non linéaires. Je ne parle pas de la formation en boîte noire et de l'utilisation d'un estimateur d'importance intégré. Je parle d'une méthode distincte.

Vous devez comprendre que la dépendance peut être très complexe et impliquer des interactions, des redondances, la non-linéarité encore. Toutes ces choses peuvent être appliquées aux données catégorielles comme aux données numériques.

J'ai opté pour des données catégorielles, car il existe de bons outils de théorie de l'information pour cela. Pour le dire simplement : il y a une entrée et une sortie. Si l'état de la sortie dépend au moins un peu de l'entrée (de manière probabiliste), alors ils sont dépendants. Il y a une chose appelée information mutuelle. Il mesure ceci.

Maintenant, va plus loin. VI mesure quelque chose sur la distribution observée sur un échantillon de taille finie. Il s'agit bien entendu d'une estimation ponctuelle.

Nous devons donc estimer les limites statistiques de l'information dans le cas d'une paire indépendante d'entrées-sorties. Ceci est fait par une fonction auto-écrite utilisant des méthodes numériques.

Encore plus profond. Si nous avons deux prédicteurs ou plus - que faire avec eux ?

Premièrement, ils peuvent eux-mêmes être apparentés et plus ils sont apparentés, plus il y aura de redondance dans leur ensemble. Cette redondance est mesurée par ce qu'on appelle la multi-information. Mais la multinformation est aussi une estimation ponctuelle sur un échantillon. Pour cela, le quantile de distribution est également calculé numériquement par une autre fonction auto-écrite.

Deuxièmement, le nombre de niveaux de catégories de prédicteurs peut être si grand (disons, 2 ^ 15) que l'on ne peut rien dire de la dépendance à ces niveaux. Il y a très peu d'observations par niveau.

Enfin, lorsque tout cela est fait et mis ensemble, nous pouvons mesurer n'importe quel type de dépendance sur un nombre arbitraire de prédicteurs et de résultats, sur un échantillon de taille arbitraire avec une signification statistique prédéterminée. Les fonctions sous-jacentes elles-mêmes sont tirées du paquetage de la théorie de l'information.

Tout est dans le fichier joint. Bien sûr, il n'est pas facile de le comprendre sans 100 grammes. Il existe également un code complet pour la création de règles de trading et leur validation. Tout cela pour votre information et pour approfondir vos connaissances.

En gros, le résultat est comme d'habitude :

[1] "1.69%"

> final_vector <- c((sao$par >= threshold), T)

> names(sampleA)[final_vector]

 [1] "lag_diff_23"      "lag_diff_45"      "lag_mean_diff_2"  "lag_mean_diff_8"  "lag_max_diff_11"  "lag_max_diff_181" "lag_min_diff_3"   "lag_min_diff_724"

 [9] "lag_sd_724"       "lag_range_32"     "symbol" "future_lag_181"  

Après un jour et demi de travail et l'énumération de dizaines de milliers de combinaisons de prédicteurs, la fonction produit une valeur de fonction de fitness - il s'agit d'une information mutuelle significative pénalisée pour la redondance dans l'ensemble des prédicteurs. Et les prédicteurs eux-mêmes.

Tout ceci, je le répète, est catégorique et permet la construction de règles lisibles par l'homme. Permet d'interpréter le motif trouvé.

Par exemple, ci-dessus, j'ai 1,7% de déterminisme complet (ce qui n'est pas mal pour le Forex) et beaucoup d'entrées qui, ensemble, déterminent de manière significative au niveau de confiance de 0,1 (j'ai présenté l'expérience de cette manière) l'état de sortie (binaire). C'est-à-dire que les informations contenues dans les données forex sont clairement présentes. La question est prouvée expérimentalement.

Après cela, nous pouvons évaluer sur validation la rentabilité et coder le système de trading.

Alexey

Dossiers :
 
Dr. Trader:


Ai-je bien compris que dans votre fichier ALL_cod.RData vous pouvez également utiliser Rat_DF1 pour l'entraînement (en spécifiant la cible souhaitée) et ensuite utiliser Rat_DF2 et Rat_DF3 pour la vérification ? J'ai joint mon code en R pour ceux qui sont intéressés, il met en œuvre la formation de réseaux neuronaux contrôlés par les erreurs. Pour sélectionner une autre variable cible, vous pouvez simplement remplacer "Short_Long.75" dans le fichier par quelque chose parmi "Short_Long.35", "Flet_Long", "Short_Flet", "Flet_In". C'est plus pratique que de substituer des ensembles de données différents.

Oui. Exactement pour la commodité du cliquetis.

Encore une nuance.

Toutes les variables cibles sont dérivées de deux ZZ : ZZ(35) et ZZ(25). Et voici une nuance très désagréable qui résonne avec la vôtre.

La variable cible est une séquence de 0 et 1, qui correspond au bras ZZ. Mais nous prédisons TOUJOURS un seul élément du bras ZZ, pas le bras lui-même. Il est donc incorrect de dire que nous prédisons les tendances. Il est correct de dire que nous prédisons un élément d'une tendance. Et si vous additionnez tous les éléments de tendance prédits, la tendance ne fonctionnera probablement pas.

 

Merci pour feature_selector_modeller.zip, je vais y réfléchir.

SanSanych Fomenko:

Je m'adresse à tous les lecteurs de la branche : je suis prêt à faire l'analyse correspondante, si les données initiales seront présentées sous forme de fichier RData ou Excel, qui ne nécessite pas de traitement.

J'ai joint le fichier, c'est un ensemble de données provenant du forex. Introduisez RData avec deux jeux de données, pour la formation et pour la validation. Physiquement, les données des deux ensembles de données se suivent, elles sont divisées en deux fichiers juste pour la commodité du test du modèle. Le modèle sur cet ensemble de données peut être formé, j'ai manuellement trié les prédicteurs et formé le neurone, à la fin l'erreur minimale sur l'ensemble de données de validation était de 46%, ce qui n'est pas vraiment rentable. On peut penser à un véritable bénéfice si l'erreur tombe en dessous de 40%. Essayez d'extraire les prédicteurs de ce fichier, s'il vous plaît.

SanSanych Fomenko:

La variable cible est une séquence de 0 et 1, ce qui correspond au levier ZZ. Mais nous prédisons TOUJOURS un élément individuel du bras ZZ, pas le bras lui-même. Il est donc incorrect de dire que nous prédisons les tendances. Il est correct de dire que nous prédisons un élément d'une tendance. Et si vous additionnez tous les éléments de tendance prédits, vous n'obtiendrez probablement même pas une tendance.

J'ai essayé différentes variables de cible. D'une part, vous pouvez prédire le prix une barre à l'avance et la variable cible sera alors 1 ou 0 selon que le prix de la barre suivante est à la hausse ou à la baisse. Je n'ai jamais obtenu de résultat sur les petites échelles de temps, le prix de clôture semble être un nombre plutôt aléatoire sur celles-ci. Mais à partir de H1, il y a déjà des résultats positifs.

Une autre variante est le zigzag ou d'autres indicateurs de tendance. J'ai obtenu des résultats positifs avec elle, mais à condition que le résultat de la neuronique passe par le filtre. Par exemple, pour prendre la moyenne des résultats des dernières barres ou utiliser les résultats uniquement au-dessus d'une certaine valeur seuil. À mon avis, ce n'est pas la peine d'appliquer tout cela, c'est plus des suppositions que des calculs précis. Le problème est que le modèle doit donner uniquement des signaux d'achat pour les 10-20 prochaines barres, alors qu'il donne parfois des signaux de vente parmi celles-ci. Dans ce cas, la transaction est inversée, la commission et le spread sont payés, et ainsi de suite plusieurs fois par tendance. Par conséquent, nous devrions soit obtenir une grande précision, soit lisser les résultats pour éviter de telles inversions d'une seule barre. En effet, comme vous l'avez dit, seul un élément d'une tendance est prédit ; la tendance elle-même ne peut être composée de tels éléments.

Dossiers :
set56.RData.zip  525 kb
 
Dr. Trader:


J'ai essayé différentes variables de cible. D'une part, vous pouvez prédire le prix une barre à l'avance et la variable cible sera alors 1 ou 0 selon que le prix de la barre suivante a augmenté ou diminué. Je n'ai jamais obtenu de résultat sur les petites échelles de temps, il semble que le prix de clôture soit un nombre plutôt aléatoire sur celles-ci. Mais à partir de H1, il y a déjà des résultats positifs.


Mes résultats sont systématiquement à l'opposé. Je peux facilement prédire l'évolution des prix quelques minutes à l'avance (jusqu'à une heure) avec une précision de 55 % (Ask to Ask). Meilleur résultat pour 23 minutes. C'est une classification binaire sur des échantillons de validation.

Et au fur et à mesure que l'horizon de prévision augmente, la précision chute lentement jusqu'à 51% à 12 heures d'avance. Et cette dépendance est présente tout au long de l'histoire. Mais la précision doit être encore plus élevée pour atteindre le côté positif (pour surmonter la distance Ask - Bid).

Nous en discuterons plus tard.

 
Dr. Trader:

Merci pour le feature_selector_modeller.zip, je vais l'examiner.

J'ai joint le fichier, c'est un ensemble de données forex. Introduisez RData avec deux jeux de données, pour la formation et pour la validation. Physiquement, les données des deux ensembles de données se suivent, elles sont divisées en deux fichiers juste pour la commodité du test du modèle. Le modèle sur cet ensemble de données peut être formé, j'ai manuellement trié les prédicteurs et formé le neurone, à la fin l'erreur minimale sur l'ensemble de données de validation était de 46%, ce qui n'est pas vraiment rentable. On peut penser à un véritable bénéfice si l'erreur tombe en dessous de 40%. Essayez d'extraire les prédicteurs de ce fichier, s'il vous plaît.


Je n'ai pas trouvé de prédicteur unique - tous sont du bruit. Vos prédicteurs n'ont pas de pouvoir prédictif pour votre variable cible. Quelques conseils 54,55,56. Vous pourriez être en mesure d'en tirer quelque chose... Sinon, en ce qui me concerne, tout peut être jeté.
 
Je vois, merci, je vais chercher d'autres entrées.
 
Dr. Trader:
Je vois, merci, je vais chercher d'autres données brutes.

Attendez. Je vais aussi analyser vos données pour les dépendances.

Une question avant de commencer. Vos données comprennent-elles toutes les barres d'une rangée, ou bien les barres ont-elles été éclaircies avant de constituer les échantillons ?