Stratégies de trading: le grand débat

En matière de conception de robot de trading, on pourrait identifier 2 approches principales qui semblent être en opposition.

La première tend à rechercher un “alpha” optimum, c’est à dire un ensemble de quelques critères (généralement moins de 10), qui permettraient de générer des trades globalement favorables et qui ainsi se suffiraient à eux-mêmes. Dans cette approche, on voit d’un mauvais œil toute tentative d’optimisation qui ferait prendre systématiquement un risque trop grand d’over-fitting (suroptimisation de la phase d’entraînement avec dégradation des performances lors du passage en réel).
Cette approche pourrait être comparée à la recherche d’une aiguille dans une botte de foin. Une recherche souvent longue avant d’aboutir à une formule suffisamment robuste pour garantir des revenus quelles que soient les conditions de marché. Cette quête du Graal, toutefois, si elle se concrétise, permet par la suite de mettre en œuvre un robot d’une simplicité déconcertante…
Cette approche requiert beaucoup de patience, et de curiosité. Il faut également savoir qu’un alpha peut être non rentable sur un actif donné, mais générer des profits réguliers sur un autre pourtant proche. Une systématisation des tests sur des dizaines, voire des centaines d’actifs peut donc s’avérer être une stratégie payante.

“Amateurs develop individual strategies, believing that there is such a thing as a magical formula for riches. In contrast, professionals develop methods to mass-produce strategies. The money is not in making a car, it is in making a car factory.
Think like a business. Your goal is to run a research lab like a factory, where true discoveries are not born out of inspiration, but out of methodic hard work. That was the philosophy of physicist Ernest Lawrence, the founder of the first U.S. National Laboratory”

Marcos Lopez de Prado – Advances en Financial Machine Learning

La deuxième approche tend à considérer qu’il est inutile de chercher à modéliser par un moyen simple un problème aussi complexe que des données financières. A problème complexe, solution complexe. Il s’agit donc ici de chercher une stratégie brute acceptable, c’est à dire générant suffisamment de signaux gagnants (et perdants), sans forcément se préoccuper dans un premier temps de savoir si cette stratégie brute est gagnante ou pas. Bien entendu, plus la performance initiale est bonne, et moins il y aura de travail par la suite.
Il ne s’agit alors plus de creuser indéfiniment à la recherche d’un diamant déjà taillé, mais plutôt de partir d’un diamant brut et de le tailler soi-même (ce qui implique d’apprendre à tailler un diamant!).
Le travail d’optimisation qui va alors s’en suivre va chercher à soustraire des trades générés le plus possible de trades perdants, ce qui va permettre d’augmenter le WinRate. En langage de machine learning, on part d’une stratégie brute avec une précision moyenne à faible, mais avec un bon recall, puis on cherche à améliorer la précision sans détériorer le facteur recall (en d’autres termes, on veut abaisser le nombre de faux positifs, tout en maintenant élevé le nombre de vrais positifs).
Bien entendu, les modèles de machine learning/deep learning rentrent dans cette catégorie.

Over-fitting vs under-fitting


Si dans la première approche décrite précédemment, le risque d’over-fitting est nul (puisqu’il n’y a pas eu d’étape d’optimisation poussée), le risque d’under-fitting est quant à lui élevé. En somme, une telle stratégie va très probablement émettre des trades dans des configurations de marché que tout analyste technique aurait pu qualifier à l’avance de très probablement défavorable. Des pertes évitables auront donc lieu régulièrement, ce qui peut s’avérer assez frustrant.

Dans la deuxième approche, l’optimisation va quant à elle faire effectivement prendre le risque d’over-fitting, problème qu’il est important de prendre très au sérieux. A mes débuts, j’étais capable de produire des résultats de simulation quasi linéaires, avec 90% de trades gagnants, des performances incroyables, et pourtant, lors du passage sur des données en temps réel, c’était la désillusion la plus totale. Cela signifie-t-il qu’il faille éviter totalement toute phase d’optimisation? Je ne le pense pas. Il est par contre nécessaire d’essayer de comprendre l’over-fitting, afin de le limiter au maximum.

Des données en quantité suffisante

Le premier conseil est de disposer de données en quantité suffisante. On peut généralement trouver gratuitement des historiques sur 10 ans pour les indices, forex, matières premières. Bien plus si vous vous intéressez aux actions. Avec le recul, un historique de 10 ans me semble insuffisant. Vous pouvez essayer de vous procurer des historiques plus anciens, ce qui sera probablement payant. Vous pouvez également, et c’est également une bonne pratique, optimiser votre robot sur la base des données de plusieurs actifs proches. Plusieurs paires de devises si vous êtes sur le forex, ou plusieurs indices si vous êtes sur les indices.
A titre d’exemple mon dernier robot Pegase est optimisé/testé sur 5 indices : DowJones, Dax, SP500, Nasdaq, JP225. Un dernier indice, le CAC40 est utilisé pour la validation/évaluation des performances.
Donc plus on a de données, mieux c’est.
Bien entendu, il faudra prendre soin de normaliser nos données afin de pouvoir comparer plusieurs actifs entre eux.

Ne pas trop descendre dans les échelles de temps

Mon deuxième conseil est de rester le plus général possible lors de l’écriture d’un critère, ce qui implique notamment de ne pas descendre dans les échelles de temps. Avec l’expérience, on s’aperçoit que la description d’une configuration de marché sur la base des graphes MN1, W1 et D1 suffit le plus souvent. Plus on descend, et plus on rentre dans une description très spécifique qui aura peu de chances de se reproduire un jour. Et plus on descend, plus le “bruit” occupera une place importante par rapport à l’information véritable.

Faire varier les seuils

L’objectif de l’optimisation est d’arriver à décrire des configurations de marché qui se reproduisent régulièrement dans le temps, avec des résultats comparables à chaque fois. Cette capacité à identifier les “features” les plus appropriées et à écrire les bons critères se développe bien entendu avec l’expérience.
Une bonne pratique consiste toutefois à faire varier les seuils que l’on peut être amené à utiliser. Par exemple, si l’on veut quantifier la force d’un gradient de moyenne mobile, ou bien l’éloignement du prix par rapport à une bande de bollinger ou à une moyenne mobile, on peut être amené à utiliser une valeur seuil. On va ainsi s’apercevoir par exemple que si notre gradient de moyenne mobile est supérieur à X, et le prix est inférieur à Y par rapport à cette moyenne mobile, il devient dangereux de vendre car nous constatons une majorité de trades perdants. Mais que se passe-t-il si nous faisons varier X et Y de quelques points? Si la proportion de trades perdants reste très majoritaire, alors nous pourrons peut-être en conclure que ces critères se suffisent à eux-mêmes. Par contre si nous voyons apparaître des trades gagnants intéressants, alors nous allons peut-être en conclure que l’ajout de nouveaux critères, tels que le stochastique ou autre, est nécessaire.

Pour conclure, je dirai que le choix entre les 2 approches vous appartient, mais que les 2 peuvent donner de bons résultats, à condition d’avoir bien conscience des notions d’over-fitting/under-fitting.

Si le machine learning a le vent en poupe ces dernières années concernant la prédiction de données financières et que de nombreuses recherches sont menées dans ce domaine, les solutions simples et toutes faîtes ne sont pas aussi évidentes. Ce n’est pas parce que vous allez mettre en œuvre un algorithme Random Forest rapidement sur votre jeu de données, avec quelques features prises au hasard, que vous pouvez espérer rapidement de bons résultats sans vous soucier de ce que fait l’algorithme.

Passer du temps à analyser les marchés, écrire des critères à la main pour voir concrètement ce que cela donne, et au fil du temps identifier des patterns qui fonctionnent est une première étape qui me semble indispensable.
Pour alimenter votre algorithme de machine learning avec les bonnes informations, encore faut-il savoir quelles sont ces “bonnes informations”.

Dans un prochain article j’introduirais mon algorithme “Smart Forest“, en référence à l’algorithme “Random Forest” de machine learning. Nous y verrons comment on peut écrire des arbres de décision manuellement, et quels avantages/inconvénients cette approche peut avoir par rapport à son cousin Random Forest.

Générer un fichier de reporting de vos trades sur Metatrader

Comme le dit souvent un de mes youtubeurs préférés, il est important de “comprendre ce qu’il se passe” (merci Tibo!).

Un leitmotiv à se répéter en boucle tous les matins…

Si vous en êtes arrivé au point où vous avez un robot qui applique votre stratégie, si vous regardez sur la courbe l’historique des signaux, vous verrez invariablement des trades qui ont été ouverts à des moments où ils n’avaient objectivement que très peu de chance de réussite.
Il faut parfois changer d’échelle de temps pour s’en rendre compte. Un trade peut sembler pertinent en M15, puis qu’en on passe en H4 ou D1, on va s’apercevoir qu’on est bien en dehors des bandes de Bollinger, avec des signes évidents de retracement en cours au niveau du macd ou du stochastique.

Ainsi, pour arriver à “comprendre ce qu’il se passe”, la première chose est d’aller contrôler les différentes échelles de temps, surtout les échelles de temps supérieures (MN1, D1, H4).

Le fait d’observer un trade en particulier, pris isolément des autres trades générés par votre robot, n’a toutefois que peu d’importance. Ce qui nous intéresse, c’est la probabilité de succès ou d’échec d’un trade dans une configuration de marché donnée.

Pour connaître cette probabilité, il est indispensable de savoir générer un listing des trades émis, avec pour chacun d’eux la valeur de nos indicateurs préférés, les points gagnés ou perdus, ainsi que toutes les informations dont on peut avoir besoin. Notre ami Excel ou tout autre tableur de votre choix vous aidera alors à tirer toutes les conclusions dont vous avez besoin.

Cette possibilité de générer des fichiers de reporting est l’un des gros avantages de Metatrader sur les autres plateformes TradingView ou ProRealTime.

En MQL, la génération de fichiers est très simple.
On commence par la génération de l’entête au niveau du OnInit(), dont voici un exemple ci-dessous:

Ce répertoire est vidé à chaque lancement d’une nouvelle simulation, donc si il disparaît, c’est normal. Si ce mode de fonctionnement ne vous convient pas, vous pouvez utiliser l’option “FILE_COMMON”, ainsi vos fichiers seront créés dans un répertoire permanent.

L’écriture des données spécifiques à chaque trade émis doit se faire au moment de la clôture du dit trade si l’on veut savoir notamment si ce trade est gagnant ou pas…

Comme on souhaite récupérer les informations de marché au moment de l’ouverture du trade, cela signifie donc que l’on doit stocker ces informations dès l’ouverture du trade, pour être en mesure de les restituer plus tard.

Ainsi, au niveau des fonctions permettant l’ouverture d’un trade achat/vente, on va venir mettre à jour un tableau conservé en sessions, avec toutes les données nous intéressant.

Il ne reste plus qu’à voir la mise à jour du fichier au moment de la clôture du trade.

Pour cela il est nécessaire de pouvoir exécuter une fonction à chaque fois qu’un trade se ferme, ce qui va s’avérer impossible si notre trade est fermé automatiquement par StopLoss ou TakeProfit. On doit donc pouvoir “hacker” ce fonctionnement, du moins pour les simulations.

Il y a probablement plusieurs façons de procéder, peut-être plus élégantes que celle que je vous propose ici, le principal est que cela fonctionne.

J’ai l’habitude de rajouter un paramètre de lancement “Désactiver stop loss (pour data report)”, variable “p_desactiver_stoploss”. Quand ce paramètre est activé, les stop loss/take profit ne sont pas définis au niveau des trades ouverts.

Voici ce que cela donne au niveau de la fonction de fermeture des trades pour la gestion des stop loss:

Il reste à créer la fonction de mise à jour du fichier de reporting:

Ce n’est bien entendu qu’un exemple, à vous de constituer ce reporting avec les informations dont vous avez besoin, vos indicateurs préférés, etc…

Pour ma part j’aime bien avoir un aperçu des points max/pertes max durant la vie de chaque trade, car cela permet de voir les optimisations à apporter au niveau de la stratégie de sortie.

J’utilise aussi des commentaires à l’ouverture du trade mais aussi à la fermeture afin d’identifier les éléments déclencheurs d’une ouverture et d’une fermeture dans le cas de stratégies avancées.

Je pense avoir dit ici le principal.

Cet outil assez simple est particulièrement puissant et incontournable. Je l’utilise systématiquement pour être en mesure d’identifier les différentes configurations de marché, notamment celles qu’il vaut mieux éviter.

Avec l’habitude, on arrive parfois à lire le marché juste sur la base de ces données et sans même regarder la courbe, même si l’aspect graphique s’avère indispensable dans de nombreuses situations. Cela permet de détecter rapidement la présence d'”outliers” sur certains indicateurs, c’est à dire des valeurs inhabituelles permettant de comprendre que nous sommes dans une situation de marché particulière.

C’est cette complémentarité entre “datas” et “lecture d’un graphe” qui donne toute sa puissance à cette méthode. Cela permet d’apprendre au fil de l’expérience les configurations qui fonctionnent, et celles qui fonctionnent beaucoup moins. On découvre aussi que rien n’est aussi simple qu’il n’y paraît. Une configuration de marché peut nous sembler particulièrement dangereuse en analysant un cas particulier, mais en regardant de manière globale, sur un historique de 10 ans, et sur plusieurs actifs, on peut se rendre compte que c’est beaucoup plus subtil que cela, et que finalement, cela se passe plutôt bien dans la plupart des cas. C’est là où l’analyse des données collectées va nous aider à comprendre ce qui différentie un cas “qui marche”, d’un cas “qui ne marche pas”. Ce sera peut-être en regardant les gradients de moyennes mobiles, les distances à ces moyennes mobiles, ou d’autres indicateurs.

J’espère que cela vous aura été utile.

Optimiser la vitesse des simulations sous Metatrader

Nous allons voir maintenant comment booster radicalement la vitesse d’exécution de nos simulations via le testeur de stratégie de Metatrader.

Ce point est particulièrement crucial car pour mener à bien l’optimisation d’un robot de trading, on va être amené à lancer un grand nombre de simulations quotidiennement, ce qui n’est pas possible si chaque simulation prend plusieurs minutes, ou pire plusieurs heures.

Quand on débute sur Metatrader, puisqu’on manque d’éléments de comparaison, on peut trouver normal que cela dure plusieurs minutes, et s’y habituer.

Pour vous donner un ordre d’idée, je suis amenée à lancer plus d’une centaine de simulations sur plus de 10 ans chacune, par jour…. Chacune de ces simulations prend une trentaine de secondes. C’est donc une action que je peux exécuter très régulièrement afin de tester de nouveaux critères.

Cette vitesse d’exécution est un élément clé de la réussite de votre projet de développement d’un robot de trading.

Voyons maintenant comment optimiser ce processus:

Au niveau de la fenêtre de lancement de votre simulation, les paramètres clés sont les suivants:

  • Modélisation: “Prix d’ouverture uniquement”.
    Dans ce mode, le code ne sera exécuté qu’une fois par bougie et non pas à chaque tick, ce qui va réduire le temps d’exécution de manière considérable. Bien entendu, ce mode va entraîner une approximation des résultats obtenus, mais si votre stratégie est basée sur des échelles de temps en h1, h4, ou d1, cette approximation devient tout à fait acceptable. C’est un des autres grands intérêts de bannir les signaux sur les toutes petites échelles de temps. Vous avez toujours la possibilité, de temps à autre, de lancer une simulation sur chaque tick, mais plutôt en soirée pour que cela tourne tranquillement pendant la nuit…
  • Optimisation: décocher “mode visuel avec l’affichage des graphiques (…)”. Cette option est également très gourmande et devient inutile notamment si l’on génère des fichiers .csv avec l’historique enrichi de nos trades, point qui fera l’objet d’un autre article.

Un autre point important afin d’optimiser vos simulations se situe au niveau du code, notamment de votre façon de coder. Quand à mes débuts je cherchais comment accélérer mes scripts sur les forums de discussion, j’ai surtout vu des échanges concernant l’optimisation des indicateurs, mais selon ma propre expérience, l’impact est dérisoire par rapport aux conseils ci-dessus.

Toutefois, si vous êtes développeur, vous aurez probablement envie d’écrire un programme en utilisant à fond les concepts “orientés objets”, en créant de jolies classes que vous allez séparer dans des fichiers. Je vous déconseille vraiment de faire ainsi, car cela va ralentir considérablement l’exécution de vos scripts. Mieux vaut créer quelques fonctions que vous mettrez dans votre fichier principal et ne pas chercher à aller plus loin.
Donc, restez le plus simple possible dans vos scripts.

D’autres éléments peuvent venir ralentir vos scripts de manière importante.
Par exemple, le fait d’utiliser des bougies Heikin Ashi est extrêmement pénalisant.

Concernant vos indicateurs, personnellement j’en utilise un nombre assez important (4 moyennes mobiles, macd, rsi, bollinger, atr, sur toutes les échelles de temps entre MN1 et H1), et cela ne pose aucun problème. Je n’ai aucun scrupule à en rajouter quand j’en ai besoin.

Comme dit plus haut, si vous suivez ces conseils, une simulation sur 10 ans ne devrait pas excéder 30 secondes.

Stratégie de trading: Stop Loss, Take Profit et taille des positions

Lors de l’élaboration de votre stratégie de trading, une fois le timeframe de référence de vos signaux choisi , vous devez spécifier la valeur de votre Stop Loss, de votre Take Profit ainsi que la taille de vos positions.

Ces 3 valeurs sont des valeurs particulièrement interconnectées. Leur choix définitif sera probablement fixé après de nombreux essais, et pourront varier au fil des optimisations réalisées. En effet, plus votre % de trades gagnants va augmenter, et plus vous allez peut-être vous autoriser à augmenter votre stop loss. On peut qualifier ces informations d'”hyper paramètres” tant leur impact sur la performance du robot est importante.

Une bonne habitude est donc de les mettre en paramètres de lancement du robot afin de pouvoir les modifier par la suite plus aisément et ainsi tester différentes valeurs.

Voyons ce qu’il est important de savoir à ce sujet.

Tout d’abord, c’est votre stratégie de trading, qui a été privilégiée sur une échelle de temps donnée, qui va vous suggérer un objectif à atteindre. Cet objectif peut être exprimé de différentes manières: en points, ou en % de variation du prix de votre actif. Il peut être un objectif “rigide”, qui va se traduire par un Take Profit au niveau de vos positions, ou bien un objectif au-delà duquel va être appliqué un Trailing Stop, ou bien il va s’agir d’un objectif minimum au-delà duquel des signaux de sortie seront examinés (traversée moyenne mobile par exemple). Quelle que soit la manière dont va être utilisée cet objectif, il est préférable d’en avoir un car c’est lui qui va permettre de définir les autres paramètres tout aussi important pour notre robot.

Une fois notre objectif (strict ou minimum) défini, nous pouvons définir notre stop loss. L’occasion d’introduire une notion fondamentale, le Risk Reward, qui représente le ratio entre la perte potentielle d’un trade et son gain potentiel. Nous allons forcément chercher à avoir un Risk Reward le plus faible possible, tout en restant cohérent avec notre stratégie. Donc si par exemple vous avez un TP de 100, avec un SL de 50, vous obtenez un Risk Reward de 0.5 ce qui n’est pas si mal. Pour être rentable, votre stratégie devra alors avoir un WinRate d’au moins 33% (1 trade gagnant pour 2 trades perdants).

Vous l’aurez compris, les valeurs optimales de nos Take Profit et Stop Loss ne seront connues avec précision qu’une fois le robot déjà bien avancé, car nous devons connaître notre WinRate, dont la valeur va s’améliorer au fil des optimisations.

Il reste maintenant à fixer la taille de nos positions. Une bonne pratique est de déduire cette valeur de celle du Stop Loss, qui représente la perte maximale risquée (théoriquement…) pour chaque position ouverte. Ce qui vous intéresse réellement est de savoir quelle proportion en % de votre capital vous risquez à chaque trade ouvert. Ainsi, si vous risquez 50 points, en étant prêt à perdre 1% de votre capital, vous pourrez en déduire la taille de votre position.

Le fait de déduire la taille de vos positions de la valeur de votre Stop Loss et du Risk Ratio (% du capital à mettre en jeu) présente plusieurs avantages. Vous pouvez par exemple vouloir adapter votre stop loss à la situation du marché (stop loss variable déterminé sur une moyenne mobile, un high/low d’un bougie précédente ou une valeur d’atr), auquel cas la taille de vos positions s’adaptera automatiquement. Ensuite, vos tailles de positions vont suivre l’évolution de votre capital (qu’elle soit favorable ou pas), ce qui est aussi très important durant les simulations.

Ci-dessous une fonction pratique que j’utilise (Metatrader) pour calculer le montant des positions à ouvrir.

Stop Loss et Take Profit en % plutôt qu’en points

Une dernière notion très importante à comprendre. J’en ai parlé brièvement plus haut. Lors de la définition de vos Stop Loss et Take Profit, vous avez le choix entre l’utilisation de Points, ou de % de la valeur de votre actif.

Pourquoi privilégier les % ?

Les données financières sont des données “non stationnaires”, c’est à dire que leur valeur peut évoluer grandement au fil du temps. Un actif qui vaut 10000$ aujourd’hui en valait peut-être le tiers il y a 10 ans de cela.

Ainsi, on peut intuitivement comprendre que si un objectif de 100 points est réaliste pour un actif qui vaut 10000$, il l’est peut-être déjà beaucoup moins sur le même actif quand il en valait 3000$…

Cela pose de sérieux problèmes si vous souhaitez tester votre stratégie sur un historique de données de plusieurs années. D’où l’intérêt de définir votre objectif comme étant égal à 1% de la valeur de votre actif, plutôt que comme valant 100 points.

Ci-dessus un exemple des paramètres de lancement d’un robot sous Metatrader.

On y trouve en premier lieu le Risk Ratio % qui permet de définir le montant du capital mis en jeu à chaque trade.

Les TP et SL sont eux aussi définis en %.

Définis de cette manière, ces paramètres de lancement vont suivre l’évolution du capital ainsi que l’évolution de prix de l’actif au fil du temps.

Stratégie de trading: bien choisir le timeframe

Le choix du timeframe est d’une importance capitale dans l’élaboration d’un robot de trading, et ne doit pas être pris à la légère. C’est l’une des premières pierres de votre édifice, qui va déterminer tout le reste. Si en cours de route vous changez d’avis, cela peut avoir des incidences importantes sur tout le travail d’optimisation que vous aurez fait jusque là.

Si vous réalisez un robot de trading “simple”, via Trading View ou ProRealTime par exemple, avec une stratégie de quelques lignes sans optimisation poussée, avec un robot que vous associez à un timeframe donné (signal de croisement macd+rsi en M15 par exemple), alors vous ne vous sentirez pas très concerné par cet article. Ce qui suit va surtout concerner les robots plus avancés sur lesquels un gros travail d’optimisation peut être réalisé.

Pour bien choisir son timeframe, il faut déjà avoir conscience de tout le travail qui va s’en suivre. Il faut donc déjà s’être cassé les dents sur quelques robots auparavant, avoir fait des erreurs, des essais, puis d’autres erreurs, et d’autres essais.

La première erreur est de vouloir commencer par une stratégie qui va rechercher des signaux sur de petites échelles de temps (en dessous de H4). Les marchés financiers ont cela de particulier que le rapport signal/bruit est très faible, et cela est d’autant plus vrai que l’on va descendre dans les petites échelles de temps. Le fait de “zoomer” à l’extrême, sur du M15, M5, ou pire M2/M1 rend la compréhension de ce qu’il se passe quasi impossible. Bien entendu, cela dépend aussi de l’objectif en terme de points que vous vous fixez. Mais quoi qu’il en soit, nous sommes face à un problème très complexe à résoudre, et travailler sur les petites échelles de temps va venir rajouter de la complexité. Vous verrez que même en H4/D1 c’est déjà bien assez compliqué.

Si vous partez avec l’idée de vouloir optimiser votre robot, vous allez être amené à contrôler les tendances, supports/résistances, et indicateurs sur les échelles de temps supérieures. Pour ma part j’ai pris l’habitude de contrôler les tendances D1, W1, et MN1, car j’ai pu constater leur influence importante sur la qualité des signaux. Je ne descends presque jamais sous H4, car l’expérience m’a appris que cela n’apportait rien sauf le fait d’accroître l’over fitting, ce que nous voulons à tout prix éviter.

Donc plus vous descendez, et plus aurez du travail. Et plus vous serez plongés dans du bruit qu’il est inutile d’essayer de prédire ou d’anticiper.

Quelle que soit la stratégie choisie et le type de trading que vous avez l’habitude de faire, dîtes vous bien que l’objectif in fine est le même pour tous: dégager de la rentabilité, régulièrement, et en prenant le moins de risque possible. Le fait d’émettre des signaux en H4, ou D1 n’enlèvent absolument rien à la rentabilité espérée, bien au contraire. Et surtout, ils permettent une optimisation efficace qu’il est difficile d’obtenir sur les petites échelles de temps.

Mon premier conseil est donc d’émettre des signaux en D1, ou H4 minimum, puis d’essayer de comprendre les configurations de marché les mieux adaptées à votre stratégie.

Metatrader – Historiques de données financières

En matière de prédiction, rien n’est plus important que de disposer de données de qualité, et en quantité suffisante. Pour réaliser un robot robuste, c’est à dire adapté au plus grand nombre de situations de marché différentes, un test réalisé sur 1 ou 2 ans sera loin d’être suffisant.

Si vous avez opté pour une stratégie dont le principe est volontairement de générer des trades de manière quasi aléatoire, en espérant une balance plutôt positive in fine, ce point aura peut-être moins d’importance, mais vous devriez tout de même être curieux de savoir si vos réglages fonctionnent de manière générale, ou si ils sont adaptés juste sur ces derniers mois, avec par exemple un contexte de croissance forte et régulière.


Si votre robot est basé sur des signaux d’achat/vente clairement identifiés par une stratégie donnée, l’analyse des tendances aux différentes échelles de temps va alors permettre d’identifier les configurations de marché favorables à notre stratégie, de celles qui le sont beaucoup moins, et bien entendu, d’agir en conséquence.

Pour cela, il est important de regarder les tendances hebdomadaires et mensuelles qui ont un impact très important (que vous vous en soyez rendu compte ou pas encore…), et qui ne peuvent s’étudier que sur plusieurs années.

Restreindre son analyse à 1 ou 2 années comme beaucoup le font fait perdre une quantité d’informations pourtant très utile.

La récupération d’historiques suffisants est donc l’une des premières préoccupations à avoir, mais malheureusement, c’est un sujet rarement évoqué sur les forums.

Voyons donc tout cela en détail.

Tout d’abord, il est important de comprendre que par défaut, les historiques disponibles sur Metatrader sont largement incomplets. Si par exemple en mensuel vous allez pouvoir remonter 20 années au-delà, en hebdomadaire vous n’aurez peut-être plus que 10 années, puis au fur et à mesure que vous allez baisser dans les échelles de temps, la taille de l’historique va diminuer. Ces valeurs vont en outre varier d’un actif à un autre, et d’un broker à l’autre.
Sur l’échelle à 1 minute, vous n’aurez plus que quelques mois.
Et si vous descendez jusqu’aux ticks, il faut savoir que Metatrader inclut un système de simulation de ticks. Vous n’aurez donc probablement pas des ticks réels mais des ticks simulés.

Voyons maintenant comment améliorer le fonctionnement de base de Metatrader concernant les historiques de données.

Tick Data Suite et Tick Story sont 2 fournisseurs d’historiques de données financières parmi les plus cités. Tick Data Suite est un service payant (mais accessible), avec une version d’essai gratuite de 15 jours qui vous permet déjà de télécharger pas mal de données. Tick Story est un service gratuit, mais avec une version payante permettant notamment d’accélérer grandement les téléchargements qui sinon peuvent prendre facilement plusieurs heures.

Je vais par la suite utiliser Tick Story pour les explications, mais la procédure est quasiment la même pour Tick Data Suite, seule change l’interface de téléchargement.

Dans les 2 cas, il est possible de récupérer des historiques de 10 à 20 ans selon les actifs. Est-ce suffisant? Pas évident, nous verrons dans un autre comment y remédier en réalisant des optimisations sur plusieurs actifs.

Après avoir installer l’interface Tick Story proposée depuis leur site, vous avez rapidement accès à l’ensemble des actifs disponibles, forex, indices, crypto, commodities, etc… si vous ne trouvez pas votre bonheur, vous pouvez toujours essayer auprès d’un autre fournisseur de datas.

L’étape suivante consiste, avec un clic droit, à sélectionner votre actif, puis choisissez “Exporter vers MT5”, puis l’option “Bar” ou “Tick”. Les fichiers Ticks sont bien évidemment beaucoup plus volumineux que les simples Bars. Nous verrons dans un prochain article que les simulations sur Ticks sont également beaucoup plus lentes que sur les Bars. Vous pouvez dans un premier temps prendre l’option “Bar”, et si vous avez besoin plus tard de confirmer votre stratégie de manière plus précise en utilisant les Ticks, vous saurez où les trouver.

Une fois l’option “Bar” choisie, l’utilitaire de téléchargement apparaît. La période proposée par défaut est la période totale disponible. Ici, pour le DAX40, on a accès aux données depuis 2011, ce qui fait un peu plus de 10 années de données. Est-ce suffisant? Probablement pas, mais c’est tout ce qu’il est possible d’avoir pour commencer en gratuit.

Dans la ligne “Calendrier”, vous pouvez choisir le timeframe à télécharger. Je vous conseille le 1 minute ou le 5 minutes mais il vaut mieux ne pas aller au-delà.

La ligne “Régler le fuseau horaire” a une importance capitale que je n’ai comprise que tardivement malheureusement. Si vous laissez la valeur par défaut, sans chercher à vous aligner avec le fuseau horaire du serveur de votre broker, vous risquez d’avoir des décalages entre les courbes “temps réel” et les courbes issues de vos historiques. Cela peut avoir plusieurs incidences. Par exemple si votre stratégie doit respecter à des heures précises, vous n’allez tout simplement pas tester sur les bonnes tranches d’heures. Une autre incidence sur laquelle on peut facilement passer à côté pendant des années, est qu’un décalage d’une heure seulement entre les heures de votre historiques et les heures de votre broker peut provoquer l’apparition d’une bougie le dimanche (absente sur les courbes temps réel), ce qui va venir chambouler tous vos calculs d’indicateurs, positionnement dans votre stratégie, optimisation, etc… Autant dire que vous n’aurez qu’à tout reprendre depuis le début.

Pour ne pas vous tromper, il est préférable de télécharger seulement les derniers jours, de charger sur metatrader (nous allons voir maintenant comment faire), puis de comparer avec vos courbes réelles. Si vos bougies sont décalées, c’est que vous n’avez pas le bon fuseau horaire. Une fois que vous êtes certain du bon fuseau horaire à télécharger, vous n’avez plus qu’à lancer le téléchargement et à patienter!

Chargement des données dans Metatrader

La procédure est assez simple, quand on sait comment s’y prendre.

L’idée consiste à créer un nouveau symbole que l’on va venir alimenter avec nos historiques. Ce symbole sera ensuite utilisable directement depuis le testeur de stratégie comme si il s’agissait d’un symbole fourni par votre broker.

Depuis la barre d’outils, en haut à gauche, ou depuis l’onglet “Voir / Symboles”, vous lancez la fenêtre “Symboles”. Vous choisissez l’actif désiré, ici le DAX, en cliquant dessus, les informations relatives à cet actif apparaissent en bas. Puis vous cliquez sur “Créer un symbole”. Le fait de pré-sélectionner votre actif va permettre de récupérer toutes les informations qui lui sont relatives, et donc d’éviter de les saisir par la suite.

La fenêtre “Symbole personnalisé” apparaît alors. Il est préférable d’ajouter une extension “_ts” par exemple pour “tickstory” au nom de votre symbole afin de tracer l’origine des données et ne pas risquer de le confondre avec un symbole “réel”.

Une fois créé, votre symbole apparaîtra dans la rubrique “Custom”.

La dernière étape consiste à uploader votre historique. Pour cela, il vous suffit de cliquer sur le bouton “Barres” en haut de cette même fenêtre, puis sur le bouton “Importer des Barres”.

Une fois arrivé là, vous avez presque fini, mais une dernière vérification très importante s’impose: le montant des spreads. Les historiques contiennent en effet en dernière colonne le montant du spread applicable, mais il peut arriver un que cette valeur, qui dépend notamment du tickvalue configuré sur votre symbole, ne corresponde pas du tout aux spreads réels appliqués par votre broker. J’ai constaté des écarts équivalents à un facteur de 10, ce qui bien sût n’est pas acceptable. Pour s’assurer qu’il n’y a pas de soucis à ce niveau, le mieux est de lancer un robot dans le testeur de stratégie qui va afficher l’écart entre votre ASK et votre BID. Vous faîtes la même chose sur votre symbole réel. Si vous avez effectivement un facteur 10 de différence, vous devez alors ouvrir votre fichier d’historique sur un bon vieux excel et modifier la valeur de la dernière colonne en conséquence.

Il va de soi que sur un historique de 10 ans, le montant du spread a forcément évolué dans le temps, en même temps que la valeur de l’actif en question. C’est donc à vous de faire le choix d’utiliser une valeur fixe, un pourcentage, ou autre. Toutefois si vous avez des stratégies en daily, avec des trades sur plusieurs journées, une valeur approximative du spread de quelques points n’aura que peu d’influence sur l’évaluation de la performance générale. Si vous faîtes du scalping, ce n’est bien évidemment pas la même histoire!

Une fois le fichier modifié, vous pouvez le téléverser à nouveau par la même procédure.

Trading algorithmique: quel langage/plateforme choisir?

Le choix de l’environnement que vous souhaitez utiliser pour le développement de vos robots de trading est le premier choix particulièrement déterminant pour la suite et ne doit pas être pris à la légère.

La prise en main de cet environnement va demander par la suite beaucoup d’efforts et de temps, voici donc quelques conseils pour vous aider à y voir plus clair.

TradingView et ProRealTime sont des plateformes particulièrement appréciées, agréables à prendre en main, et très adaptées aux non-développeurs. Attention, ce sont des plateformes payantes. TradingView propose une version gratuite, mais les fonctionnalités sont alors limitées, comme par exemple le nombre d’indicateurs que l’on peut associer simultanément sur un même graphe. Les prix vont de 12.95$/mois à 49.95$/mois, ce qui n’est pas négligeable.
Chacune de ces plateformes propose son propre langage de programmation, relativement accessible pour un non-développeur (c’est l’objectif affiché).
Vous allez pouvoir coder vos stratégies ou indicateurs assez rapidement.

Cela fait de TradingView et ProRealTime les choix à privilégier si vous n’avez pas de compétence en programmation.

Mais si vous avez des compétences en programmation, vous allez très rapidement vous sentir très à l’étroit, et c’est normal. Ces plateformes sont avant tout dédiées au grand public.

Les points bloquants sont les suivants:

  • historique de données restreint, fonction de l’abonnement choisi et du timeframe. Au mieux, vous aurez 20.000 barres d’historiques sur TradingView par exemple.
  • environnement de travail délocalisé. vous avez la possibilité de ne pas partager votre script, mais il sera forcément accessible par toute l’équipe technique. si vous avez eu le bonheur de trouver la perle rare et que vous générer de gros profits, dîtes-vous que cela se saura et que votre code n’aura jamais la garantie d’être parfaitement protégé.
  • environnement inadapté aux gros scripts (un robot particulièrement travaillé peut rapidement prendre plusieurs milliers de lignes)
  • à ma connaissance, impossibilité de générer des fichiers de statistiques relatifs aux trades émis et aux conditions de marché qui sont indispensables pour aller plus loin dans l’optimisation d’un robot
  • vous n’êtes pas libre de travailler avec le broker de votre choix

Vous l’aurez compris, en tant que développeur, habituée aux environnements libres, et gratuits, je préfère de loin Metatrader et/ou Python, qui nous allons le voir sont particulièrement adaptés à de situations différentes, et qui en font des outils assez complémentaires.

Metatrader

Metatrader 4 ou 5 est une plateforme totalement libre et gratuite.
Vous pouvez la connecter au broker de votre choix, et avoir accès à une gamme particulièrement riche d’indicateurs et de robots qu’ils soient gratuits ou payants. La communauté Metatrader est particulièrement active. Le design est certes moins attractif que TradingView, mais on s’y habitue très vite.

Le MetaEditor qui vous permet de créer vos indicateurs et trading bots est une interface de développement classique, en local bien en sécurité sur votre pc, rien ne viendra limiter votre ardeur à la tâche. Vous pourrez entre autre générer des fichiers de statistiques, utiliser de la programmation orientée objet, bref, faire un vrai travail de développement.

Le langage se prend en main assez rapidement, même si cela est plus compliqué que pour les plateformes payantes vues précédemment.

Les historiques par défaut sont assez limités, mais nous verrons dans un prochain article que ce n’est pas un frein, car il est possible d’ajouter des historiques gratuitement sur bon nombre d’actifs.

Pour ces raisons, Metatrader est un candidat très sérieux pour débuter dans le développement de robot de trading.

Les limites que l’on pourrait poser à son utilisation sont les suivantes:

  • non adapté pour la mise en œuvre d’un robot qui devrait scruter des centaines ou milliers d’actions à la recherche des meilleures opportunités
  • on ne peut réaliser que des systèmes “experts” par opposition aux systèmes plus avancés que l’on connaît aujourd’hui sous les termes de machine learning ou deep learning

Python

Python est un langage open source, parmi les plus appréciés actuellement. Il offre de nombreuses bibliothèques spécialement adaptées au Machine Mearning et au Deep Learning, ainsi que des bibliothèques dédiées à la finance, comme la bibliothèque talib qui permet de calculer des indicateurs techniques.

Le choix de python doit être mûrement réfléchi, relativement à notre niveau en programmation, et surtout à l’objectif que l’on souhaite atteindre. Foncer tête baissée sur Python, sans avoir au préalable d’expérience en développement de robot de trading, nécessaire pour en comprendre les spécificités, serait à mon sens une erreur.

“Think big, start small, move fast”.

Si vous avez déjà une bonne expérience en développement de robot de trading, Python sera par contre particulièrement adapté dans les situations suivantes:

  • réalisation d’un robot sur actions, devant scanner des centaines, voire des milliers d’actifs pour lister les meilleures opportunités
  • mise en application d’algorithmes de machine learning/deep learning

En espérant que cela vous aura été utile!