L'Apprentissage Automatique dans le trading : théorie, modèles, pratique et trading algo - page 78

 
Mihail Marchukajtes:
Non, les gars, le système a disparu, ça n'a même pas de sens de le montrer.

Serait-ce parce que j'ai oublié de prévenir que le classificateur ternaire a changé de logique ?

Le binaire a la même logique : si la valeur de sortie est inférieure à zéro, c'est comme un 0 dans l'échantillon. Si c'est plus, c'est 1 dans l'échantillon.

Et ternaire si la sortie est : 1 comme 1 dans l'échantillon, 0 comme 0 dans l'échantillon, -1 comme "-" dans jPrediction.

 


fait un comité de 8 modèles d'intérêt et simulé sur validation une séquence de 4000 trades (5,5 ans de trading). Il s'agit d'une simulation de Monte Carlo afin de se faire une idée de l'ampleur possible de la croissance des dépôts, sans tenir compte des points de transaction initiaux (qui donnent lieu à une exécution dans le testeur de stratégie). Ici le MO sur la validation est de 0.00026 pips. Le quantile inférieur est évidemment supérieur à zéro, ce qui est ce que je voulais obtenir.

Nous allons ensuite analyser la distribution du facteur de recouvrement pour ces séries.

Il s'agit de la distribution du facteur de récupération. La médiane de 3,7 est en quelque sorte la valeur cible (plan). Le quantile inférieur n'est pas mal non plus...

Nous devons encore attendre un cycle d'entraînement sur 80 échantillons d'entraînement supplémentaires et former un comité plus important.

 
Yury Reshetov:

Serait-ce parce que j'ai oublié de prévenir que le classificateur ternaire a changé de logique ?

Le binaire a la même logique : si la valeur de sortie est inférieure à zéro, c'est comme un 0 dans l'échantillon. Si c'est plus, c'est 1 dans l'échantillon.

Et ternaire si la sortie est : 1 comme 1 dans l'échantillon, 0 comme 0 dans l'échantillon, -1 comme "-" dans jPrediction.

ҮNon, j'ai compris, c'est bon avec ça..... Il y a autre chose. Le fait est que l'Optimiseur est très bon pour trouver des données contenant des informations de sortie. Une fois que les données sont trouvées avec une généralisation supérieure à 80%. Ces données peuvent être utilisées avec succès dans n'importe quelle autre topologie de réseau et le résultat de l'apprentissage sera parfait, sans ré-entraînement, etc. Ceci est pour ceux qui ne veulent pas utiliser l'optimiseur directement dans le trading. Dans mon cas, il s'est avéré que les données utilisées pour la classification des sorties n'étaient pas tout à fait réussies, de sorte que les résultats des transactions du vendredi n'étaient pas ceux que j'aurais souhaités. Cependant, je ne me suis pas découragé et j'ai trouvé un autre ensemble de prédicats qui, lorsqu'ils ont été construits de manière répétée, n'ont pas conduit à un état de déchet à l'entrée et à la sortie....... de toute façon voici quelques recommandations pour utiliser le classificateur comme un filtre de signal intelligent pour votre TS (pas la prévision)

1. Séparer les signaux d'achat et de vente séparément. Si vous utilisez des données de valeurs antérieures et qu'une telle séparation confond l'ordre des données, alors nécessairement l'un des prédicats doit être le signe du signal. Acheter=1, Vendre=-1, c'est-à-dire que l'un des prédicats sera la direction du signal.

2. Les prédicats doivent être liés d'une manière ou d'une autre au système de prédiction. Je l'ai sous forme de Zscore du signal, Kelli du signal, ordre du signal (le système n'est pas réversible, il peut donc y avoir plusieurs signaux consécutifs dans une direction). Fondamentalement, l'information qui se rapporte d'une manière ou d'une autre au système. Vous pouvez même prendre le Momentum, séparément dans l'optimiseur MT4 j'ai sélectionné un paramètre qui donne le profit sur une période de test, lorsque le trading par les signaux du système. C'est-à-dire que le Momentum est optimisé pour les signaux du système sur la zone d'entraînement, etc.

3. Sortie. C'est la partie la plus importante, car j'avais sorti un bénéfice de 100 pips qui donnait 50% de généralisation, et je l'ai changé pour 10 pips et la généralisation est passée à 65%. Dans le TS de Demark, c'est assez difficile à faire. Je dois souvent le regarder manuellement, parce que la formalisation de l'approche dans ce cas ne passe pas........ Dans la zone de formation, il vaut mieux faire des erreurs dans les signaux, mais obtenir quand même un modèle avec un haut niveau de généralisation. Disons que le signal a gagné 100 pips à l'entraînement et que nous l'avons quand même marqué 0 parce que le marché était enclin à l'inverse du signal. C'est-à-dire que nous laissons délibérément le TS perdre afin d'augmenter le niveau de généralisation et ainsi faire en sorte que le TS fonctionne mieux à l'avenir. Après tout, notre production est idéale, qu'elle soit un peu moins idéale, mais correcte.....

4) Utilisez les volumes de transactions du CME dans les prédictions. Cela fonctionne vraiment et augmente le niveau de généralisation du modèle de façon SIGNIFICATIVE....... Je prends de l'amas delta, donc c'est comme ça......

 
Alexey Burnakov:

Il s'agit d'une simulation de Monte Carlo afin d'avoir une idée de la fourchette possible de la croissance des dépôts, sans ajustement pour les points de transaction initiaux (qui donnent une exécution dans le testeur de stratégie).

J'espère que, quelle que soit la façon dont vous déplacez les points de départ des métiers, ils se situent tous après la période de formation. Par exemple, si vous avez entraîné le modèle sur des données de janvier et mars 2015 (en supprimant les données de février), vous ne devez pas effectuer la validation finale en février, même si ces données ne faisaient pas partie de l'échantillon d'entraînement, car de tels résultats ne seront pas fiables. La validation ne montrera les résultats adéquats attendus dans le trading réel que si vous la démarrez en avril 2015, après toutes les dates qui auraient pu être utilisées par le modèle dans l'entraînement ou les validations croisées pour ajuster les paramètres du modèle.

Ma deuxième tentative (régression arrondie à [0;0.5;1]) sur vos données n'a pas abouti. Le modèle et la génétique ont à nouveau choisi l'option de classe constante "sans échange".
Apparemment, pour prédire trois classes, le neurone doit nécessairement avoir 3 sorties, sinon il ne peut pas faire rentrer trois classes dans une sortie avec des niveaux. Ou bien j'ai dû supprimer la classe "ne pas échanger" et laisser deux classes et travailler avec elles.

Afin de vérifier quelque chose sur le fronttest j'ai pris une liste de prédicteurs sélectionnés par la génétique, entraîné un neurone sur eux (tout est correct, avec trois sorties et avec un facteur en entrée) à travers caret avec des validations croisées (méthode = "repeatedcv"). Le résultat est médiocre, la précision, même sur les données d'entraînement, n'est que de 40 %.
Je viens de remarquer que le fichier de validation comporte des chiffres réels sur ses sorties, et non des classes. Je les ai juste remplacés par +1 pour tout ce qui est positif, et -1 pour tout ce qui est négatif.
De plus, nous avons obtenu deux précisions pour le test frontal :
1) étant donné qu'à prediction=0 le modèle ne devrait pas trader, alors le résultat correct n'est pas pertinent, car le trade ne sera pas ouvert et n'affectera pas les statistiques finales. Dans ce cas, les prédictions -1 et 1 sont correctes 51% du temps (en ignorant tous les exemples où la prédiction=0).
2) Prenez toutes les prédictions, comparez avec tous les résultats corrects. Dans ce cas, la précision est de 14 %, ce qui est encore pire que le hasard.

Je me demande quel sera le résultat du modèle de trading dans votre émulateur de trading, pourriez-vous s'il vous plaît faire un graphique comme ci-dessus mais avec le modèle que j'ai joint ?
Le fichier RData était trop gros et le forum ne l'a pas accepté immédiatement. J'ai fait deux archives vinrar et les ai mis séparément dans des archives zip. Vous devez extraire les deux archives zippées, puis ouvrir la première archive zippée, extraire les données, la deuxième archive zippée se connectera d'elle-même et, surtout, elles doivent se trouver dans le même dossier.
Ou vous pouvez exécuter le script r ci-joint, il contient une liste de prédicteurs sélectionnés, et générera un modèle avec eux. Vous devriez avoir le fichier csv original que vous avez posté, il est utilisé.
Le même script peut également être exécuté après avoir ouvert RData à partir de l'attachement, le script prendra le modèle prêt au lieu d'en créer un nouveau, il y a un exemple de prédiction et d'estimation de précision dans le code. Le fichier RData que vous avez posté plus tôt est nécessaire pour le test frontal.

Compte tenu des erreurs passées, j'entame ma troisième tentative.

 
Dr. Trader:

1) en considérant qu'à prediction=0 le modèle ne devrait pas trader, alors le résultat correct n'a pas d'importance, car le trade ne sera pas ouvert et n'affectera pas les statistiques finales. Dans ce cas, les prédictions -1 et 1 sont correctes dans 51% des cas (en ignorant tous les exemples où la prédiction=0).

Pour une réponse incorrecte, je donnerais -2 points, pour une absence de réponse -1, pour une réponse correcte 1. La proportion de points attribués aux réponses peut être modifiée dans un sens ou dans l'autre, mais il est important que le réseau ne s'égare pas inutilement, c'est pourquoi vous devez pénaliser l'"abstention".

Le comité de deux réseaux a donné chacun 1 signal, -1 (ou 0) aucun signal, si les signaux étaient contradictoires le signal final était 0. Ainsi les signaux des réseaux ont été combinés en un signal total de [-1, 0, 1].

 

Dr. Trader:

J'espère que, quelle que soit la façon dont vous déplacez les points de départ des métiers, ils se situent tous après la période de formation. Par exemple, si vous avez entraîné le modèle sur des données de janvier et mars 2015 (en supprimant les données de février), vous ne devez pas effectuer la validation finale en février, même si ces données ne faisaient pas partie de l'échantillon d'entraînement, car de tels résultats ne seront pas fiables. La validation ne montrera les résultats adéquats attendus dans le trading réel que si vous la démarrez en avril 2015, après toutes les dates qui auraient pu être utilisées par le modèle dans l'entraînement ou les validations croisées pour ajuster les paramètres du modèle.


Oui, bien sûr, vous pouvez être inflexible. C'est exactement la validation. C'est juste que les séquences de transactions sont échantillonnées de façon aléatoire à partir d'un grand volume d'observations. La méthode de Monte Carlo est nécessaire pour comprendre où pourrait se situer la courbe commerciale. Tout déplacement des échanges de quelques minutes dans un sens ou dans l'autre génère ses propres courbes. Dans le testeur MT, je vois une courbe - une mise en œuvre. Si je crée une condition avec un générateur de nombres aléatoires sur chaque transaction et que j'ouvre avec un nombre aléatoire, je peux exécuter le testeur de stratégie 500 fois et obtenir les mêmes courbes. Mais à MT, cela prendrait beaucoup de temps. Et j'en ai besoin dans 30 secondes.

Ensuite, lorsque je ferai l'EA sur le comité, je lancerai la validation dans le testeur de stratégie. La courbe devrait entrer dans un éventail et j'obtiendrai une valeur unique du facteur de récupération et de l'espérance mathématique. Mais vous ne pouvez pas tirer de conclusions à partir d'une seule course. Pas souhaitable.

 
Dr. Trader:


Je me demande quel sera le résultat de la négociation du modèle dans votre émulateur de négociation, pourriez-vous faire un graphique comme ci-dessus, mais en négociant avec le modèle que j'ai joint ?
Le fichier RData est trop gros et le forum ne l'a pas accepté tout de suite. J'ai fait deux archives vinrar et les ai mis séparément dans des archives zip. Vous devez extraire les deux archives zippées, puis ouvrir la première archive zippée, extraire les données, la deuxième archive zippée se connectera d'elle-même et, surtout, elles doivent se trouver dans le même dossier.
Ou vous pouvez exécuter le script r ci-joint, il contient une liste de prédicteurs sélectionnés, et générera un modèle avec eux. Vous devriez avoir le fichier csv original que vous avez posté, il est utilisé.
Le même script peut également être exécuté après avoir ouvert RData à partir de l'attachement, le script prendra le modèle prêt au lieu d'en créer un nouveau, il y a un exemple de prédiction et d'estimation de précision dans le code. Le fichier RData que vous avez posté plus tôt est nécessaire pour le test frontal.

Compte tenu des erreurs passées, entamer une troisième tentative.

Et quel modèle apprenez-vous, un réseau neuronal?

Laissez-moi essayer ça plus tard. J'ai un modèle qui apprend sur tous les cœurs 24 heures sur 24.

En fait, je pensais que c'était à vous d'en juger. Il suffit de substituer les prédictions du modèle dans le fichier de validation que j'ai donné au lien. Il devrait s'agir de directions de la forme +1 / -1 / 0. Il y aura une nouvelle colonne de prédiction. Multipliez la colonne de prédiction par la colonne cible. Soustraire 0,0001 de l'écart. Supprimez les entrées où la sortie du modèle est 0. Prenez la fonction cumsum :

plot(cumsum(your_data$trades_simulated_after_spread), type = 'l')

 mean(your_data$trades_simulated_after_spread)

En gros, il s'agit de représenter graphiquement le commerce sur toutes les observations et de calculer le MO. C'est simple.

 
Alexey Burnakov:

Et quel modèle apprenez-vous, le réseau neuronal ?

...

Multipliez la colonne de prédiction par la colonne cible.

Oui, je suis en train d'apprendre un réseau neuronal, le paquet nnet. Dans ce cas, j'entraîne le modèle avec caret, qui récupère quelques paramètres du modèle.

J'ai regardé à nouveau la colonne des résultats dans votre fichier RData, et j'ai immédiatement vu qu'il s'agissait de gains de prix. La dernière fois, je pensais que c'était une sorte de probabilités.
J'ai aimé la façon dont vous stockez l'incrément de prix dans la variable cible, si nécessaire vous pouvez facilement les convertir en classes pour la formation, ou calculer le bénéfice. C'est ce que je vais faire aussi.

J'ai tout compris, merci pour la clarification, j'ai compté le bénéfice, j'ai pris en compte le spread, j'ai dessiné le graphique. Dommage, MO = -2.052423e-05, une perte lente mais sûre.

Concernant le spread, il ne doit être pris en compte que dans 4 cas :
1, 2) Prévision de la dernière barre = 0 ; prévision de la nouvelle barre = -1 ou 1. Ouverture d'une nouvelle position.
3) Prévision sur la dernière barre = -1 ; prévision sur la nouvelle barre = 1. Inversion, l'ancienne position est fermée, la nouvelle position est ouverte.
4) Prévision de la barre précédente = 1 ; prévision de la nouvelle barre = -1. Inversion, l'ancienne position est fermée ; la nouvelle position est ouverte.
Dans tous les autres cas, soit l'ancienne position de la dernière barre reste, soit l'ancienne position est fermée, soit il n'y a pas de position du tout. Tout cela ne nécessite pas d'étalement.

(Plus précisément, les transactions d'achat sont ouvertes à l'offre + la marge, et fermées à l'offre. Les opérations de vente sont ouvertes inversement à l'offre, et fermées sur l'offre + la marge. L'offre est le prix qui est généralement affiché dans le terminal. Mais, pour des raisons de commodité, avec un spread constant, il suffit de le considérer une fois à l'ouverture d'une nouvelle position - c'est plus facile ainsi).

Tout cela doit être pris en compte dans un EA pour qu'il ne ferme pas une position qui est ouverte à nouveau immédiatement dans la même direction sur une nouvelle barre. J'ai fait une fois une telle erreur quand j'ai pensé que je recevrais des ristournes de mon courtier. Mais dans ce cas, la fréquence des transactions pour les rabais n'est pas rentable, tout est pire.

 
Dr.Trader:

Oui, je suis en train d'apprendre un réseau neuronal, le paquet nnet. Dans ce cas, j'entraîne le modèle avec caret, qui récupère quelques paramètres du modèle.

J'ai regardé à nouveau la colonne des résultats dans votre fichier RData, maintenant j'ai vu immédiatement qu'il s'agissait de gains de prix. La dernière fois, je pensais que c'était une sorte de probabilités.
J'ai aimé la façon dont vous stockez l'incrément de prix dans la variable cible, si nécessaire vous pouvez facilement les convertir en classes pour la formation, ou calculer le bénéfice. C'est ce que je vais faire aussi.

J'ai tout compris, merci pour la clarification, j'ai compté le bénéfice, j'ai pris en compte le spread, j'ai dessiné le graphique. Dommage, MO = -2.052423e-05, une perte lente mais sûre.

Concernant le spread, il ne doit être pris en compte que dans 4 cas :
1, 2) Prévision de la dernière barre = 0 ; prévision de la nouvelle barre = -1 ou 1. Ouverture d'une nouvelle position.
3) Prévision sur la dernière barre = -1 ; prévision sur la nouvelle barre = 1. Inversion, l'ancienne position est fermée, la nouvelle position est ouverte.
4) Prévision de la barre précédente = 1 ; prévision de la nouvelle barre = -1. Inversion, l'ancienne position est fermée ; la nouvelle position est ouverte.
Dans tous les autres cas, soit l'ancienne position de la dernière barre reste, soit l'ancienne position est fermée, soit il n'y a pas de position du tout. Tout cela ne nécessite pas d'étalement.

(Plus précisément, les transactions d'achat sont ouvertes à l'offre + la marge, et fermées à l'offre. Les opérations de vente sont ouvertes inversement à l'offre, et fermées sur l'offre + la marge. L'offre est le prix qui est généralement affiché dans le terminal. Mais, pour des raisons de commodité, avec un spread constant, il suffit de le considérer une fois à l'ouverture d'une nouvelle position - c'est plus facile ainsi).

Tout cela doit être pris en compte dans un EA afin qu'il ne ferme pas une position qui est ouverte à nouveau immédiatement dans la même direction sur une nouvelle barre. J'ai fait une fois une telle erreur quand j'ai pensé que je recevrais des ristournes de mon courtier. Mais dans ce cas, la fréquence des transactions pour les rabais n'est pas rentable, elle ne fait qu'empirer.

Dans l'ordre.

MO IS 0.00002. C'est déjà plus que -spread. C'est-à-dire que le modèle a appris quelque chose du bruit, mais la force de la prédiction est insuffisante.

Deuxièmement. Avez-vous, d'une manière ou d'une autre, spécifié la partie des données à glisser dans un pli particulier ? Si vous choisissez par défaut l'option CV (repeated CV), le modèle prendra des observations choisies au hasard pour le test. Ce n'est pas la meilleure option dans le cas de séries chronologiques.

Ensuite, la simulation de l'échange. J'ai un signal simple d'ouverture et de fermeture après un certain nombre de minutes. Et ensuite, vous pouvez le rendre plus complexe. Par conséquent, j'ai un MO positif si l'on tient compte du spread sur chaque transaction. Et c'est réaliste de l'obtenir.

Faites un peu de travail avec la validation croisée. Il est possible de créer des ensembles d'indices pour inclure certaines parties de la série chronologique dans les gués.

Et il y a beaucoup d'autres méthodes que la neuronique. L'un des meilleurs aujourd'hui est GBM ou XGBOOST. J'ai choisi la première jusqu'à présent. Je l'aime bien.

 

J'ai utilisé la méthode "repeatedcv" dans trainControl, avec un fractionnement par défaut. Récemment, j'ai écrit moi-même un code pour la validation croisée, j'ai essayé la validation croisée avec des barres prises au hasard et avec des morceaux pris consécutivement sans interruption. Je n'ai pas vu de différence sur le fronttest, le résultat était à peu près le même dans les deux cas. J'ai divisé les données pour la formation/validation croisée 50%/50%, peut-être qu'à ce ratio cela n'a plus d'importance.
Je vais l'expérimenter en soins...

Je me souviens que dans l'article que vous avez posté il y a quelque temps, la comparaison principale portait sur les arbres renforcés avec la méthode de Platt (quelque chose comme ça). Tout ce que j'ai trouvé sur Google à propos de cette méthode, c'est que vous devez passer la sortie du modèle à sigmoïde et prendre son résultat. Le gbm ou le xgboost peuvent-ils le faire ? Cette approche semble être meilleure que forest, neuronka, et certains "arbres en sac", qui arrivent en deuxième position.