Concevoir un bot de trading, partie 3

Dans la partie précédente nous mettions en place une architecture de trading live et de backtesting. Il est temps de passer à la vitesse supérieure.


Je trouve les techniques de Machine Learning fascinantes. L’idée même qu’un algorithme puisse itérativement trouver des relations invisibles pour l’œil humain afin de résoudre un problème m’enthousiasme au plus haut point. J’ai donc envie de partir sur une telle approche pour mettre au point une nouvelle stratégie de trade.

Il existe pléthores d’indicateurs financiers, et je suis sûr que certains noms vous sont familiers : Bandes de Bollinger, Oscillateur Stochastique ou encore Relative Strength Index. J’ai envie de mettre en place dans un premier temps une approche simple, qui me servira de référence pour d’autres expérimentations futures. L’idée est donc de calculer divers indicateurs et de combiner leurs valeurs dans un modèle ML afin de prédire un ordre de vente, d’achat, ou bien d’attente.

Tout problème traité par machine learning nécessite la constitution d’un jeu de données d’entrainement et de test. Il est important de poser formellement son problème, par exemple comment quantifier mathématiquement sur un historique qu’il faut acheter/vendre à ce moment précis ? Un autre point souvent négligé consiste en l’équilibrage du jeu de données entre les différentes classes et en prenant en compte le biais du survivant par exemple.


Je propose donc que nous partions sur le calcul des indicateurs suivants : Relative Strength Index, Price Rate of Change, Stochastic Oscillator, On-Balance Value, MACD, Sharpe Ratio. Cela nous fait un total de six indicateurs, c’est déjà pas mal pour une première tentative.

Encore une fois, le calcul de ces indicateurs est rendu extrêmement aisé par Pandas et Numpy, bien qu’on puisse trouver déjà des implémentations toutes prêtes ailleurs, mais j’aime également l’approche didactique de la ré-implémentation (même si à terme il vaut mieux se reposer sur les bibliothèques reconnues, comme TA-Lib par exemple) :

Je présente ci-dessus deux exemples simples de calcul d’indicateur. Dans le cadre de la constitution de mon jeu de données, la méthode est un tout petit peu différente afin de faire balayer l’ensemble des données par la fenêtre de calcul de chaque indicateur, mais globalement le code est similaire. Après cette étape, nous mélangeons le tout et nous extrayons un nombre équivalent de situations d’achat, de vente et d’attente avant de passer à proprement parler à l’entrainement.


Le but n’est pas ici de faire un compte rendu exhaustif des différentes approches et paramétrisations testées, aussi je me contenterai de conclure ici que diverses approches classiques (Logistic Regression, Naive Bayes, Support Vector Machine et Random Forest) ont été testées, puis confrontées au jeu de test pour déterminer la meilleure. C’est donc tout naturellement que nous pouvons exporter le modèle créé et l’inclure dans une stratégie (au sens du format choisi dans l’architecture du programme). Par ailleurs, l’obtention du score obtenu par la décision finale fait mesure de confiance dans la prédiction. Ainsi, nous pouvons être davantage restrictif lors du passage d’ordre en ne prenant pas en compte les décisions inférieures à 70% de confiance par exemple.

Testons tout de suite cela avec notre module de backtesting sur une trentaine de monnaies sur quelques semaines :

Résultat moyen : +22.6%

(édit : dans le _long_ temps de gestation de cet article, j’ai procédé à plusieurs ajustements majeurs pour obtenir ce résultat, les premiers résultats étaient bien moins encourageants)

Victoire !

Bon, nuançons tout de même cette célébration. D’une part, nous sommes encore une fois dans des conditions idéalisées (pas de frais de transaction, prix valable sur tout l’intervalle du tick). Par ailleurs, un aspect très important à prendre en compte est la stratégie d’achat/vente à apposer par dessus notre décision. Pour caricaturer, même avec un résultat moyen positif comme ici, si sur un trade perdant nous misons davantage que sur dix gagnants successifs, le résultat final sera négatif. Une solution pourrait être la stratégie du “tout ou rien” (qui est notamment à l’oeuvre sur Zenbot par exemple). Néanmoins, il est important je pense de diversifier ses placements, y compris sur un bot de trading. Dans l’idée, et je l’ai déjà évoquée dans la deuxième partie de cette série d’article, je souhaite fournir au programme une liste de monnaies à surveiller pour déclencher des ordres d’achat/vente sur chacune d’entre elles. Vous l’aurez compris, le véritable travail ne fait que commencer pour aboutir à une solution parfaitement fonctionnelle.

C’est déjà la fin pour cette troisième partie de ma série d’article consacrée à la conception d’un bot de trading. À partir de maintenant, le rythme de parution de cette série ne sera plus régulier, et plutôt soumis à mes avancées et ce que je choisis de partager ici.

N’hésitez pas à rejoindre La Baleine ici.