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

 
SanSanych Fomenko:

Je ne vois aucune preuve que NS a fait face à quoi que ce soit.

Le sur-apprentissage est un mal mondial en science et en particulier dans la construction de modèles.

Une erreur est donc nécessaire pour trois ensembles :

  • des ensembles d'apprentissage. La façon dont Rattle le comprend (OOB, test, validation) fera l'affaire.
  • un ensemble qui est en dehors, en termes de dates, de l'ensemble d'apprentissage.
  • Un autre ensemble qui se trouve en dehors, au sens des dates, de l'ensemble de formation.

Les deux dernières séries ne sont pas mélangées lorsqu'elles arrivent dans le terminal, les bases derrière le bar.

Il devrait y avoir à peu près la même erreur sur les trois ensembles. Ce faisant, vous devrez fixer l'ensemble des prédicteurs que vous prenez lors de la formation du modèle.

Au début, je n'ai pas envisagé de me recycler dans cette tâche, ce n'était pas nécessaire. La première fois, le neuronc était avec un seul neurone dans la couche interne. J'ai maintenant vérifié, l'erreur pendant une longue formation est d'environ 45%, et ne descend pas plus bas. Le réseau donne à ces entrées 1,3,5,7,9,11 des poids plus élevés lors de l'apprentissage, mais il ne peut pas vraiment s'entraîner en raison du manque de neurones. L'idée était d'en tirer le maximum de résultats corrects, dans des conditions très limitées, et de voir à quelles entrées il donnera plus de poids.

Maintenant, avec le dossier de validation, je peux travailler plus sérieusement. Maintenant j'ai divisé le fichier source en 2 parties (85% et 15%), j'ai fait l'apprentissage sur la première partie, j'ai parfois arrêté l'apprentissage et j'ai mesuré l'erreur dans les deux parties. Les exemples du fichier de 15% n'ont pas été intégrés à la formation, mais l'erreur qu'ils contiennent a diminué de la même manière que dans la partie formation. Quand elle est devenue 0% dans les deux parties du fichier, j'ai arrêté l'entraînement et testé la neuronique sur le second fichier, l'erreur était alors de ~0%. Il s'avère que pour cette tâche, le surentraînement n'a même pas été atteint, c'est drôle.


Mais la neuronique sur le forex est pire que dans ce problème. Au début, l'erreur diminue sur les échantillons de formation et de validation. Ensuite, l'erreur continue à diminuer sur l'échantillon d'entraînement, mais commence à augmenter sur l'échantillon de test, à ce stade, il est temps d'arrêter l'entraînement. Ensuite, je teste généralement le résultat sur l'historique du pré-échantillon et à nouveau sur l'historique du post-échantillon. Pour moi, c'est trois séries de données, comme les vôtres. Mais l'erreur dans les trois ensembles est différente jusqu'à présent (et importante en dehors de la période de formation).

J'avais différentes idées pour améliorer les résultats, par exemple en les lissant ou en ajoutant un filtre (<0,1 - vente, >0,9 - achat, et tout ce qui se trouve entre les deux - période sans transaction). Vous pouvez améliorer les résultats en ajoutant un filtre à la sortie du neurone et en l'optimisant également, mais pour le fronttest, cela n'a pas du tout aidé. Une autre bonne idée est que si le neurone a été formé sur une certaine période d'histoire, alors vous pouvez optimiser le filtre sur l'histoire antérieure à cette période. Car une erreur avant la période d'optimisation est probablement associée à une erreur après la période d'optimisation. Mais cela n'a pas fonctionné - s'il y a trois périodes d'histoire - "avant le neurone" - "neurone d'apprentissage" - "après le neurone", alors les trois auront leurs filtres optimaux qui ne sont reliés d'aucune façon.

Jusqu'à présent, j'ai conclu que le modèle devait avoir une faible erreur (<10%) pour les échantillons d'entraînement et de test. N'appliquez pas de filtres aux résultats du modèle, et pas de conjectures du type "inversez le résultat toutes les quatre semaines". Ne pas tomber dans des périodes inférieures à M15. J'essaie différentes nouvelles idées et c'est bien si au moins une sur dix d'entre elles améliore le résultat. Et d'une certaine manière, cela devrait aboutir à un modèle rentable.

 
Dr. Trader:

Au début, je n'ai pas envisagé de me recycler dans cette tâche, ce n'était pas nécessaire. La première fois, c'était avec un seul neurone dans la couche interne. J'ai maintenant vérifié, l'erreur pendant une longue formation est d'environ 45%, et ne descend pas plus bas. Le réseau donne à ces entrées 1,3,5,7,9,11 des poids plus élevés lors de l'apprentissage, mais il ne peut pas vraiment s'entraîner en raison du manque de neurones. L'idée était d'en tirer le maximum de résultats corrects, dans des conditions très limitées, et de voir à quelles entrées il donnera plus de poids.

Maintenant, avec le dossier de validation, je peux travailler plus sérieusement. Maintenant j'ai divisé le fichier source en 2 parties (85% et 15%), j'ai fait l'apprentissage sur la première partie, j'ai parfois arrêté l'apprentissage et j'ai mesuré l'erreur dans les deux parties. Les exemples du fichier de 15% n'ont pas été intégrés à la formation, mais l'erreur qu'ils contiennent a diminué de la même manière que dans la partie formation. Quand elle est devenue 0% dans les deux parties du fichier, j'ai arrêté l'entraînement et testé la neuronique sur le second fichier, l'erreur était alors de ~0%. Il s'avère que pour cette tâche, le surentraînement n'a même pas été atteint, c'est drôle.


Mais la neuronique sur le forex est pire que dans ce problème. Au début, l'erreur diminue sur les échantillons de formation et de validation. Ensuite, l'erreur continue à diminuer sur l'échantillon d'entraînement, mais commence à augmenter sur l'échantillon de test, à ce stade, il est temps d'arrêter l'entraînement. Ensuite, je teste généralement le résultat sur l'historique du pré-échantillon et à nouveau sur l'historique du post-échantillon. Pour moi, c'est trois séries de données, comme les vôtres. Mais l'erreur dans les trois ensembles est différente jusqu'à présent (et importante en dehors de la période de formation).

J'avais différentes idées pour améliorer les résultats, par exemple en les lissant ou en ajoutant un filtre (<0,1 - vente, >0,9 - achat, et tout ce qui se trouve entre les deux - période sans transaction). Vous pouvez améliorer les résultats en ajoutant un filtre à la sortie du neurone et en l'optimisant également, mais pour le fronttest, cela n'a pas du tout aidé. Une autre bonne idée est que si le neurone a été formé sur une certaine période d'histoire, alors vous pouvez optimiser le filtre sur l'histoire antérieure à cette période. Car une erreur avant la période d'optimisation est probablement associée à une erreur après la période d'optimisation. Mais cela n'a pas fonctionné - s'il y a trois périodes d'histoire - "avant le neurone" - "neurone d'apprentissage" - "après le neurone", alors les trois auront leurs filtres optimaux qui ne sont reliés d'aucune façon.

Jusqu'à présent, j'ai conclu que le modèle devait avoir une faible erreur (<10%) pour les échantillons d'entraînement et de test. Aucun filtre ne doit être appliqué au résultat du modèle, et pas de devinettes du type "inverser le résultat toutes les quatre semaines". Ne pas tomber dans des périodes inférieures à M15. J'essaie différentes nouvelles idées et c'est bien si au moins une sur dix d'entre elles améliore le résultat. Et d'une certaine manière, cela devrait aboutir à un modèle rentable.

Tout est dans les données)

Les données de tous les ensembles doivent contenir des observations mutuellement indépendantes. Mais même dans ce cas, la validation donnera le pire résultat.
 

J'ai essayé différents modèles de Rattle, la forêt a également donné de bons résultats.

Étape 1 - la forêt a appris quelque chose, et dans les statistiques, les entrées 1,3,5,7,9,11 semblent en quelque sorte séparées. Erreur sur le fichier de formation 0%, sur le fichier de validation 46%.

Étape 2 - n'a laissé que les entrées 1,3,5,7,9,11 dans le fichier et le résultat. J'ai entraîné la forêt à nouveau sur le nouveau fichier, maintenant l'erreur est de 0% sur les deux fichiers d'entraînement et de validation, tout est cool. La seule nuance est que Rattle, pour la deuxième étape, a fixé le paramètre "Nombre de variables" à 2, probablement parce que le fichier est de plus petite taille. Je l'ai changé en 4 comme dans la première étape.

 

Dr. Trader

C'est agréable de voir un frère d'esprit basé sur le hochet. Au moins, nous pouvons comparer les résultats.

Ainsi que ma propre expérience.

Nous en tirons des hochets et des modèles.

Sur l'onglet modèle, nous apprenons, en obtenant la valeur de l'AOB, et sur l'onglet évaluer, nous évaluons sur les ensembles de validation et de test. Nous avons trois chiffres.

Je soutiens que les résultats obtenus, si l'ensemble de prédicteurs n'a pas été préalablement débarrassé des prédicteurs de bruit - ces résultats ne représentent rien, très probablement juste un ensemble de chiffres.

Dans l'onglet Evaluate, en plus d'obtenir les résultats listés, l'ensemble doit être placé dans la fenêtre R Dataset. Il est très important que cet ensemble soit obtenu en divisant mécaniquement le fichier original, c'est-à-dire le premier fichier pour les trois chiffres, par exemple du 1er janvier 2014 au 1er janvier 2015.

R Dataset nécessairement après le 1er janvier 2015 sans aucun échantillonnage aléatoire et autres astuces utilisées dans R. C'est juste brutal, mécanique.

Je ne connais pas d'autres moyens d'évaluer le succès de la séparation des prédicteurs significatifs des prédicteurs bruyants, car la méthode que je propose imite le commerce réel.

Pourriez-vous afficher les quatre chiffres ? Y compris le résultat sur le fichier à partir de la fenêtre R Dataset ?

 
Dr. Trader:

J'ai essayé différents modèles de Rattle, la forêt a également donné de bons résultats.

Étape 1 - la forêt a appris quelque chose, et dans les statistiques, les entrées 1,3,5,7,9,11 semblent en quelque sorte séparées. L'erreur sur le fichier d'entraînement est de 0%, sur le fichier de validation elle est de 46%.

Étape 2 - n'a laissé que les entrées 1,3,5,7,9,11 dans le fichier et le résultat. J'ai entraîné la forêt à nouveau sur le nouveau fichier, maintenant l'erreur est de 0% sur les deux fichiers d'entraînement et de validation, tout est cool. La seule nuance est que Rattle, pour la deuxième étape, a fixé le paramètre "Nombre de variables" à 2, probablement parce que le fichier est de plus petite taille. Je l'ai changé en 4 comme dans la première étape.

Intéressant... La profondeur doit être fixée à 6 variables pour que toutes les variables pertinentes soient prises en compte.
 
Dr. Trader:

J'ai essayé différents modèles de Rattle, la forêt a également donné de bons résultats.

Étape 1 - la forêt a appris quelque chose, et dans les statistiques, les entrées 1,3,5,7,9,11 semblent en quelque sorte séparées. L'erreur sur le fichier d'entraînement est de 0%, sur le fichier de validation elle est de 46%.

Étape 2 - n'a laissé que les entrées 1,3,5,7,9,11 dans le fichier et le résultat. J'ai entraîné la forêt à nouveau sur le nouveau fichier, maintenant l'erreur est de 0% sur les deux fichiers d'entraînement et de validation, tout est cool. La seule nuance est que Rattle, pour la deuxième étape, a fixé le paramètre "Nombre de variables" à 2, probablement parce que le fichier est de plus petite taille. Je l'ai changé en 4 comme dans la première étape.

Dans la première, la forêt a utilisé des bruits pour la formation, ce qui n'est pas bon.
 
SanSanych Fomenko:

Pourriez-vous afficher les quatre chiffres ? Inclure le résultat dans un fichier à partir de la fenêtre R Dataset ?

Je l'ai fait avec neuronka - dummy_set_features.csv est divisé en 3 parties 70%/15%/15% ; dummy_set_validation.csv utilisé dans l'onglet evaluate comme "fichier csv" (c'est essentiellement le même que R Dataset, juste un format de fichier différent).

J'ai pris le journal de Rattle, j'ai supprimé les deux limitations de l'appel neuronique, sur lequel j'ai écrit plus tôt, je l'ai exécuté dans R, mais le modèle est toujours sous-entraîné (35% d'erreur sur l'échantillon d'entraînement). Il arrive donc que si vous réduisez l'échantillon de formation, le résultat de la formation est moins bon. Mais vous pouvez augmenter le nombre de neurones dans la couche interne, cela devrait améliorer l'apprentissage.

J'ai changé le nombre de neurones de 10 à 20, j'ai relancé la formation, maintenant l'erreur dans la formation est devenue 0%. L'erreur sur l'échantillon de validation est de 0,6%, l'erreur sur l'échantillon de test est de 0,1%. L'erreur sur le fichier dummy_set_validation.csv est de 0.3%. Tout est bon, R dans l'application.

Intéressant, il s'avère que les problèmes de formation des neurones sont très différents de ceux des arbres. Pour moi, le problème avec nn est de prendre le bon nombre de neurones internes, et de suspendre l'apprentissage avant que le réseau ne commence à se recycler. En principe, plus il y a de neurones, mieux c'est, mais cela affecte considérablement la mémoire vive requise et le temps de formation. Les prédicteurs superflus ne sont pas un grand obstacle à l'apprentissage, les neurones apprennent généralement aussi bien avec eux, mais ils augmentent le temps d'apprentissage, et il est préférable de s'en débarrasser pour le rendre plus rapide.

Une fois que j'ai utilisé le réseau mt4 auto-écrit, un EA pouvait apprendre et trader immédiatement. Il y avait des problèmes avec la vitesse d'apprentissage, l'initialisation des poids, les algorithmes d'apprentissage. Il y avait trop de petits problèmes, il était difficile d'obtenir de bons résultats même avec un échantillon d'entraînement, alors j'ai finalement abandonné et je travaille maintenant en R. Le paquet nnet peut être entraîné par l'algorithme bfgs, ce qui élimine tous ces petits problèmes. Mais le paquet est limité à une seule couche intérieure. Je veux avoir au moins 3 couches internes, mais avec l'algorithme bfgs, sinon il y aura beaucoup de problèmes pour réapprendre.

Dossiers :
r_nnet2.txt  10 kb
 
Dr. Trader:

Je l'ai fait avec neuron - dummy_set_features.csv est divisé en 3 parties 70%/15%/15% comme standard ; dummy_set_validation.csv utilisé dans l'onglet evaluate comme "fichier csv" (c'est essentiellement le même que R Dataset, juste un format de fichier différent).

Non, ce n'est pas la même chose.

Chose étonnante, je discute de cette question avec de nombreuses personnes et PERSONNE ne le fait de la manière dont je l'écris. Et je sais ce que j'écris, car j'ai passé une demi-année sur des exercices comme le vôtre, et en dehors de rattle(). Ce que je ne mets pas dans le testeur, j'obtiens une erreur complètement différente. J'ai ensuite fait ce que j'ai décrit ci-dessus et l'erreur dans le testeur coïncidait pratiquement avec l'erreur dans le fichier R Dataset.

J'ai donné à Alexey trois fichiers, qui sont obtenus en divisant mécaniquement un gros fichier en trois parties. Dans la première partie, nous nous exerçons, apprenons, évaluons... Et sur les deux autres, on vérifie les chiffres obtenus sur le premier. Si les trois fichiers ont des erreurs supérieures à 20%( !), ou plus précisément, plus proches de 40%, le modèle n'est pas réentraîné et vous pouvez travailler avec lui.

Les 3 fichiers ci-dessus ont 27 prédicteurs et 6 variables cibles. Les 27 prédicteurs ont été sélectionnés parmi 170 prédicteurs par mes propres algorithmes. À ce jour, ces 27 prédicteurs ne conduisent pas à des modèles surentraînés. Mais les 143 prédicteurs restants de mon jeu sont du bruit et sur ce bruit, vous pouvez facilement obtenir une erreur comparable à la vôtre, mais le modèle est surentraîné et n'est pas adapté à une utilisation ultérieure.

Pourquoi y a-t-il moins d'erreur sur les prédicteurs de bruit que sur les prédicteurs significatifs ?

De mon point de vue, puisque l'algorithme d'ajustement du modèle cherche à réduire l'erreur d'ajustement, il est toujours capable de trouver quelque chose parmi les valeurs bruyantes et aléatoires qui est meilleur que les prédicteurs significatifs. Par conséquent, plus l'erreur est faible, moins il y a de prédicteurs significatifs dans la construction du modèle !

PS

A en juger par l'erreur, soit NS est surentraîné à 100%, soit il regarde devant lui.

 

Le "fichier CSV" et le "jeu de données R" de l'onglet "évaluation" sont simplement des façons différentes de spécifier la source de données. Si vous y introduisez les mêmes données, vous obtiendrez le même résultat lorsque vous testerez le modèle.

Si avant le hochet exécuter

dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

alors ce dataset_validate sera maintenant disponible dans l'onglet evaluate comme dataset R. Mais le résultat du contrôle de modèle sera finalement le même que si vous sélectionnez simplement l'option de fichier csv et spécifiez le fichier C:/dummy_set_validation.csv, les données pour le test seront identiques dans les deux cas.

L'entraînement lui-même s'est déroulé sur un fichier différent, dummy_set_features.csv, donc il est impossible de faire des prévisions, car les données des deux fichiers sont différentes et ne dépendent pas du tout du temps (mais de la formule). Je pense que la neuronique a fait un excellent travail et a trouvé 6 entrées qui déterminent le résultat, a réduit l'influence des autres entrées et a décrit la formule souhaitée avec une certaine logique neuronale propre.

Juste au cas où, j'ai vérifié les deux fichiers pour trouver les chaînes dupliquées s'il y en a. Voici le code en R :

#читаем  данные из файлов для обучения и валидации
dataset_train <- read.csv("file:///C:/dummy_set_features.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")
dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

anyDuplicated(dataset_train) #количество  повторных строк в первом файле - 567
anyDuplicated(dataset_validate) #количество  повторных строк во втором файле - 202
#  это покачто просто повторные строки в обоих файла по отдельности. Это не вредит, но и ничего не улучшает, лучше их убрать.
dataset_train <- unique(dataset_train)
dataset_validate <- unique(dataset_validate)

#Теперь  можно узнать сколько строк из dataset_train повторяются в dataset_validate
dataset_combined <- rbind(dataset_train, dataset_validate) #Объединяем  оба файла в один
nrow(dataset_combined) - nrow(dataset_combined[!duplicated(dataset_combined), ]) #количество  повторенных строк - 23. Таких повторов быть не должно, их надо удалить.
#Удаление  повторенных строк из dataset_validate
dataset_validate <- dataset_validate[!(tail(duplicated(dataset_combined), nrow(dataset_validate))), ]
#Удаление  из памяти объединённого файла, он больше не нужен
rm(dataset_combined)

Si cela est fait avant le cliquetis, les deux tablesdataset_train etdataset_validate sont disponibles pour la formation et la vérification du modèle, et il n'y aura pas de doublons. Glory R.

le fichier de validation du modèle contenait 23 répétitions de l'échantillon d'entraînement, mais en plus de cela il a 3000 autres lignes uniques, donc l'évaluation du modèle ne pouvait pas être affectée de manière significative.

 
C'est comme ça que ça doit être. Le fichier est généré par des nombres aléatoires.

En général, j'ai surestimé la complexité de la tâche. Le problème est déjà résolu par la forêt, en fait. Vous pouvez vous demander comment cela est possible compte tenu de la façon dont la forêt fonctionne.