Optimiser un robot de trading: un algorithme génétique



Dans un article précédent, j'ai commencé à comparer les méthodes d'optimisation paramétrique, c'est-à-dire la sélection des paramètres, l'évaluation de la rentabilité du trading d'un robot lors du backtest suivant . Il s'est avéré que la méthode banale de Monte Carlo - la génération de combinaisons aléatoires non corrélées de paramètres de robot - fonctionne assez bien. Maintenant, je veux tester un algorithme populaire, dont un dans la communauté des traders de programmation: l' algorithme d'optimisation génétique .

Algorithme génétique pour optimiser une stratégie de trading


Nous considérerons cet algorithme comme un exemple d'optimisation de 2 paramètres. Les paramètres optimisés de notre robot sont la période de la moyenne mobile et TakeProfit . Pour une plus grande immersion dans la «génétique», convenons d'appeler la période de la moyenne mobile le gène responsable de la «croissance», et TakeProfit - le gène de la «couleur des yeux».

Dans l'espace des valeurs de paramètres admissibles, chaque point, chaque paire de coordonnées - «hauteur / couleur des yeux» décrit théoriquement un «individu». Supposons que nous avons créé au hasard 10 individus. Ce fut la première étape de l' algorithme d'optimisation génétique - pour créer la première génération:



Dans l'espace de coordonnées M - T, les points sont sélectionnés au hasard. Par exemple, deux points marqués d'un cadre rouge sont des «individus» avec des noms non sexistes (c'est un point important!) Zhenya et Sasha. La «croissance» de Sasha (dans la formulation initiale du problème est la période moyenne mobile) est de 11 unités, la «couleur des yeux» est de 0,6 (yeux vert-bleu). Zhenya est légèrement différent dans les paramètres. Les mêmes caractéristiques décrivent les 8 individus restants.

La deuxième étape est la reproduction


De toute la première génération, nous déterminons un certain nombre des individus les plus «réussis». Le critère, évidemment, est la valeur de CF. Ces individus se reproduiront, formant des paires au hasard (pour cette raison, ils ont reçu des noms non sexistes). En général, un certain nombre de règles peuvent être définies pour les paires correspondantes. Par exemple, pour sélectionner des individus dont les caractéristiques sont proches (c'est-à-dire, littéralement, les plus proches dans l'espace des coordonnées) des individus - la consanguinité. Vous pouvez au contraire rechercher des contraires (consanguinité). Je n'ai pas pu trouver d'arguments en faveur de l'une de ces options - dans ma mise en œuvre, les paires sont formées strictement par accident ... Par exemple, Zhenya et Sasha ont réussi la qualification et ont décidé de donner naissance à un descendant. Qu'est-ce que cela signifie dans notre contexte:



De deux individus «parentaux» on obtient le troisième individu, qui hérite en partie des caractéristiques d'un parent, en partie de l'autre. Par exemple, Zhenya et Sasha ont donné naissance à un Nikita individuel (Nikita, Nikita?):

  • Nikita a hérité du signe «couleur des yeux» (paramètre TakeProfit du robot) de l'un de ses parents - «Zhenya»,
  • «Croissance» (la période du robot à moyenne mobile) Nikita a hérité de «Sasha» ... mais s'est légèrement ajusté en direction d'un autre parent, Zhenya.

Le fait est que plus la dimension de l'espace d'optimisation est petite (dans notre cas elle est égale à 2), plus la progéniture sera «proche». L'algorithme d'optimisation génétique ne détermine pas strictement les règles de «l'hérédité» des gènes pour un individu fille. Par conséquent, au hasard, Nikita a emprunté la couleur de ses yeux sans aucun changement, mais il s'est avéré être au milieu entre les deux parents, plus près de l'un d'eux. Dans mon implémentation, avec le même succès, Nikita a pu emprunter les paramètres d'origine aux deux parents.

La troisième étape se reproduit


Moteur du processus évolutif, sélection naturelle. 4 des 10 meilleurs individus ont donné 10 descendants supplémentaires. Nous avons maintenant 20 personnes. L'algorithme d'optimisation génétique implique de maintenir une taille de population constante. 10 personnes doivent «mourir». Dans cette mise en œuvre, la plupart des individus de la première génération «meurent», de 80% à 100%.
En conséquence, dans notre exemple, la nouvelle génération sera composée de 0 ... 2 parents et 8 - 10 de leur progéniture. En d'autres termes, si vous omettez les paroles, les nouveaux vecteurs des paramètres du robot de trading seront calculés à partir des vecteurs obtenus à l'étape précédente, «propagation» (combinaison) des 4 meilleurs meilleurs tests. La plupart des «personnes âgées» n'accepteront pas de participer à la nouvelle itération de sélection (d'autres options pour la mise en œuvre de la sélection sont possibles).

Achèvement de l'algorithme


La reproduction et la sélection sont répétées N fois. Plus précisément, dans notre exemple, pour la comparaison avec trois algorithmes précédemment testés, 4 générations de 10 individus sont testés, soit un total de 40 tests.
Mais il peut arriver qu'une autre population s'effondre. En d'autres termes, tous les tests se feront à proximité de plusieurs points. Pour éviter cette situation, plusieurs mécanismes sont utilisés, notamment:

  • perfusion de «sang frais» dans la population. Aux descendants de la population actuelle s'ajoutent plusieurs nouveaux individus obtenus par hasard, de la même manière que la population initiale s'est formée,
  • mécanisme de mutation: une progéniture peut avoir certaines des caractéristiques (coordonnées) légèrement différentes des caractéristiques de ses parents:



dans cet exemple

  • les caractéristiques de la descendante Jane et Joss - «croissance» et «couleur des yeux» sont empruntées à chacun des parents,
  • les caractéristiques de la progéniture de Sam et Siri sont quelque peu différentes des caractéristiques correspondantes des deux parents.

Dans ma mise en œuvre, malgré les mutations et les «individus frais», la population devait être mise à jour périodiquement dans son ensemble pour éviter une convergence prématurée, une localisation de l'ensemble de la population dans un espace limité.

Si nous revenons aux données originales sur lesquelles nous avons testé les algorithmes de Monte Carlo, la descente de gradient et l'algorithme avec le nom de travail «bataille navale», le processus d'optimisation peut être illustré par l'animation suivante:



Comme vous pouvez le voir dans l'animation, la disposition des points est d'abord chaotique, mais, avec les générations suivantes, elle tend vers des zones avec des valeurs plus élevées de DF.

Comparez maintenant les algorithmes sur la même surface: P = f ( M , T ):



Monte Carlodescente de gradient«Bataille maritime»algorithme génétique
95,7%92,1%97,0%96,8%

La valeur moyenne de l'extremum trouvé des FC en pourcentage de la valeur globale.

Bien sûr, il est trop tôt pour juger par un ensemble de données d'entrée, mais jusqu'à présent, l'AG, par rapport à notre robot de trading, est inférieur à l'algorithme de «bataille navale»:

  • de manière assez insignifiante - par la moyenne de la valeur quasi-optimale trouvée des FC,
  • donne la pire estimation de la stabilité paramétrique de l'algorithme de trading, car il «n'examine pas» l'environnement des tuples de paramètres quasi optimaux trouvés trop peu de détails.

Test final de 4 algorithmes d'optimisation


Le test final a été effectué sur 4 ensembles de données d'entrée - les résultats du backtest de la stratégie de trading sur 4 segments différents de l'historique des prix ( EURUSD : 2016, EURUSD: 2017, XAUUSD : 2016, XAUUSD: 2017).



(exemples de filtres numériques en fonction de deux paramètres pour 4 séries chronologiques de prix)

Cette fois, l'optimisation a été réalisée selon 3 paramètres:

  1. période de moyenne mobile «rapide»
  2. période de moyenne mobile «lente»
  3. TakeProfit (bénéfice sur la transaction, en pourcentage, une fois la transaction terminée).

Chacun des paramètres a pris 20 valeurs différentes. Total pour construire la table
P = F (Mf, Ms, T)
où P est le profit, Mf est la période de la moyenne mobile "rapide", Ms est la période de la moyenne mobile "lente", T est TakeProfit,
20 * 20 * 20 = 8 000 itérations de test ont été effectuées.

L'optimisation a été effectuée avec une restriction de 160, 400 et 800 tests (calculs DF dans les coordonnées sélectionnées). À chaque fois, les résultats ont été moyennés pour 1 000 itérations d'optimisation. La valeur DF moyenne pour le vecteur de paramètres quasi optimal trouvé était:
Monte Carlodescente de gradient«Bataille maritime»algorithme génétique
84,1%83,9%77,0%92,6%

Séparément, il convient de noter que GA affiche un bon résultat même avec un petit pourcentage de tests du nombre total possible d'options:
testsMonte Carlodescente de gradient«Bataille maritime»algorithme génétique
160 sur 8 00079,1%76,7%73,1%87,7%
400 sur 8 00084,7%85,0%77,4%93,7%
800 sur 8 00088,6%90,1%80,4%96,3%

Au lieu d'une conclusion


J'ai été quelque peu surpris par le résultat, qui montrait un algorithme d'optimisation génétique. Je ne pense pas que spécifiquement le «paradigme génétique» de la méthode lui ait fourni la première place dans la liste. En un sens, selon la logique du choix des coordonnées, cela ressemblait aux méthodes de dichotomie / nombre d'or. Il vaut probablement la peine d'essayer l'un de ces algorithmes et de comparer le GA avec lui.

Revenant au robot de trading, il convient de noter comment le «relief» de la surface formé par le CF (profit) change d'année en année. Autrement dit, ayant "optimisé" le robot sur l'histoire de 2017, cela n'a aucun sens d'appliquer ces paramètres en 2018 (premier trimestre, mois, semaine ... 2018).

Les stratégies de trading artificielles, dogmatiques et impuissantes comme la nôtre (acheter à l'intersection de la moyenne mobile) ne seront probablement pas démodées bientôt. Malheureusement, je n’avais pas d’autres stratégies. En conséquence, j'attribue le profit ou la perte des robots commerciaux à la chance plutôt qu'aux avantages / inconvénients de l'algorithme. Par conséquent, la tâche d'optimisation paramétrique d'un robot de trading est pour moi personnellement exclusivement d'intérêt académique.

Source: https://habr.com/ru/post/fr430138/


All Articles