“If you know your enemy and know yourself, you need not fear the results of a hundred battles.”
Sun Tzu
Dans tous les backtests que nous avons fait jusqu’à présent, je dois vous avouer que je n’ai pas fait preuve de la rigueur la plus élevée possible. Je vous demanderais de ne pas me jeter la pierre tout de suite (ni plus tard d’ailleurs :)), car pour le genre de travaux que l’on fait, ce n’est pas une mauvaise méthode de faire des évaluations grossières au début, puis de les affiner, et d’y appliquer des contraintes de plus en plus fortes.
Déjà qu’avec des évaluations grossières, nous n’avons pas encore trouvé de modèle ou de stratégie nous apportant la richesse, il ne me paraissait pas forcément utile de nous mettre en plus des bâtons dans les roues dès maintenant.
Néanmoins, j’ai déjà mentionné ces problèmes potentiels en tant que biais, et nous allons voir aujourd’hui un des plus fourbes et des plus dangereux : l’overfitting. Pourquoi celui-ci ? Tout d’abord parce qu’on commence à ajouter de plus en plus de paramètres à nos stratégies (points d’entrée, sortie, levier…), et que le risque d’overfitting augmente avec les paramètres. Et aussi parce que c’est la méthode préférée des vendeurs-escrocs de méthodes magiques qui rendent riches en tradant 3h par jour. Explications !
(Pas de prérequis obligatoire ici. Savoir ce qu’est un backtest, un Stop Loss / Take Profit peut aider, mais rien n’est indispensable pour comprendre le principe de l’overfitting.)
Définition
Mise en situation
Avant de commencer, petit lavage de cerveau : admettons qu’on ne connait aucun des résultats de backtests concernant les croisements de moyennes mobiles. On a entendu dire que c’était une super stratégie, et tout le monde a l’air d’être d’accord sur la question. On va donc backtester une stratégie basée dessus avec ces caractéristiques :
- plutôt court terme : on utilisera les périodes 10 et 25
- Comme c’est du court terme, on cherche à profiter de quelques mouvements forts et rapides, on va donc y mettre un Stop Loss et un Take Profit à 5%
Hop, on passe tout ça dans le GoingStrikerBot, et pouf (non, ça ne fait pas des Chocapic) :
Excellent ! Valeur de portefeuille à 2200€, c’est plus de 10% annualisé. Avec un Stop Loss à 5%, le Maximum Drawdown, ne va pas être très bas. Et on peut commencer à s’imaginer un petit levier 10, avec ses 100% annuels ! Franchement, on est trop bien là, et on est chaud bouillant pour l’implémenter en live !
Mais bon, j’aimerais bien réduire un peu l’écart de moyennes mobiles, histoire de pouvoir augmenter un peu le nombre de signaux potentiels. Je vais utiliser une moyenne de 23 au lieu de 25 maintenant. 2 points d’écarts sur une moyenne de 25, franchement, qu’est-ce qu’il pourrait se passer de dramatique :
heu… what ? 2 pas de moyenne mobile et notre 100% annualisé avec levier 10 se transforme en 10% de perte sans levier… Qu’est-ce qu’il se passe ici ? C’est surréaliste !
Explication
L’explication est simple : la première stratégie était overfittée.
L’overfitting, c’est quand une stratégie (ou un modèle) appliquée sur un certain jeu de donnée est victime de l’effet papillon.
L’effet papillon dit “le battement d’ailes d’un papillon au Brésil peut provoquer une tornade au Texas”. Et c’est ce qu’il s’est passé ici : le battement d’aile c’est notre modification de moyenne mobile, et la tornade c’est l’impact catastrophique sur la performance de notre portefeuille. Et si une faible modification de paramètre a un impact très fort sur la performance, on ne peut pas garantir le comportement en conditions live et on ne peut donc pas considérer la stratégie valide.
On se retrouve avec une stratégie qui ne fonctionne que dans le cas très spécifique des paramètres avec lesquels elle a été testée. Il est TRES FACILE de battre le marché sur UN exemple. De la même manière que si je m’assois à une table de poker tout une nuit avec Daniel Negreanu, je le battrais forcément sur UNE main. Toute la question est de savoir si c’est toujours le cas en enlevant le plus de paramètres “hasardeux”.
Attention cependant ! Je ne suis pas pas en train de dire qu’une stratégie peut et doit fonctionner dans tous les cas possibles de paramètres. C’est tout simplement impossible. Une stratégie qui fonctionne en étant basée sur une moyenne mobile de période 20, n’est pas overfittée sous prétexte qu’elle ne fonctionne pas sur une période 200. Les mécanismes qui interviennent ne sont pas les même. On peut argumenter qu’elle est plus adaptée sur du court terme que du long terme… En revanche, si elle fonctionne pour une période 20, et craque complètement pour une période 21, il faudra se poser les bonnes questions.
Solutions
L’overfitting n’est pas une fatalité. Il faut savoir que ça existe, que ça peut intervenir assez rapidement, parfois sans même s’en rendre compte, mais surtout, il faut savoir comment s’en prémunir.
Personnellement, je ne recommande pas forcément de blinder vos backtests directement. Avoir un peu de souplesse au début permet de gagner énormément de temps. Et une fois qu’on a une stratégie qu’on estime digne d’être creusée, on peut alors commencer à voir si elle n’est pas overfittée.
Variation de paramètres
C’est la première solution et la plus basique : vous faites varier légèrement les paramètres, et vous regardez l’impact. Si l’impact est très léger, très bien ! Ca veut dire que le concept fonctionne, et que l’on a pas juste eu un coup de chance. Pour qu’une stratégie soit rentable, il faut qu’elle rende compte d’un concept réel, (rationale en Anglais) comme la corrélation entre 2 instruments, ou des prises de décisions pilotées par un indicateur…
Faire beaucoup de variations de paramètres à la main peut être assez couteux en temps, et c’est une tâche qui mérite d’être automatisée, car elle n’est censé agir que comme filtre. Dans le GoingStrikerBot, il y a un module permettant de batcher des backtests avec des valeurs multiples de paramètres. On peut ainsi y dégager ce type de fichiers, permettant de voir l’impact des paramètres sur la performance :
L’échelle choisie par Excel n’est pas forcément très pertinente, mais on remarque assez facilement que la très grande majorité des performances de cette stratégie est négative ou faiblement positive. Et dans les rares cas où il y a une performance positive haute, ce n’est qu’un pic anormal qui retombe aussi sec.
Ce genre de filtre rapide permet de dire que cette stratégie est overfittée, et qu’on ne devrait pas continuer sur cette voie.
In-sample data vs Out-of-sample data
Une autre manière de se prémunir de l’overfitting est l’utilisation de In-sample data / Out-sample data.
Ca veut tout simplement dire que les données utilisées pour créer la stratégie ne sont pas les même que celles pour tester réellement la performance.
Cette méthode s’applique plus particulièrement dans les cas de Machine Learning, ou de stratégies à paramètres optimisés.
Exemple :
- nous faisons nos backtests sur 8 ans depuis le début : de 2010 à 2018
- on va utiliser 2010 à 2014 comme In-sample data, c’est-à-dire le jeu de données qui va nous permettre de créer et d’optimiser la stratégie
- et de 2014 à 2018 on va tester la stratégie avec les paramètres choisis grâce aux données In-sample.
Si on l’applique à la stratégie ci-dessus, période In-sample :
Celle-ci n’aurait jamais passé le test préliminaire pour être mise en live.
L’utilisation de données In / Out sample doit être adaptée à la stratégie. C’est une méthode plutôt pertinente en général :
- Vous faites une bonne perf en In sample data
- Si la perf est nulle en Out sample data, on élimine la stratégie
- Sinon on peut continuer à creuser
En revanche, il faut faire attention aux périodes utilisées. Si votre In-sample data c’est 1999-2002, ou bien 2006-2010, le rapport avec le Out-sample data risque d’être compliqué. Le comportement dans les grandes périodes de crise risque de vous donner des paramètres qui ne fonctionneront plus jamais dans des périodes hors-crise, alors que les stratégies pourraient être pertinentes. Le choix des périodes a son importance, et cette méthode est peut-être un peu moins facile d’accès que la variation de paramètres.
Voilà, je pense que j’en ai suffisamment dit sur l’overfitting pour que nous y soyons préparés. Maintenant, il suffira juste d’y faire attention si on tombe sur des backtests avec de belles perfs. Dans ce cas, un petit check d’overfitting sera la bienvenue. Mais bon, il faut déjà la stratégie rentable, et ça, on n’y est pas encore. 🙂
Petit aparté sur les vendeurs-escrocs mentionnés en introduction : l’overfitting, c’est la base de leur technique de vente. Ils prennent une stratégie quelconque avec un minimum de fondements, et ils cherchent des paramètres qui maximisent la perf. Ensuite, ils ne montrent que ces exemples là ! Et évidemment, une fois live, plus rien ne marche. Les seules stratégies acceptables, c’est celles qui passent les durs backtests sans biais, et c’est d’ailleurs pour ça qu’on galère autant à en trouver 🙂