Simulations de Monte-Carlo : évaluer sérieusement le potentiel d'une stratégie. Ne pas se laisser piéger par un backtest
Publié : 15 sept. 2026, 16:38
Bonjour à tous,
Un backtest ne montre qu'un seul chemin : celui que le marché a réellement pris, avec les trades dans un ordre précis. Or ce chemin n'est qu'un tirage parmi une infinité de possibles. Si la même stratégie avait connu ses 8 pertes consécutives en tout début de parcours plutôt qu'au milieu d'une phase de gains, le drawdown et le moral du trader auraient été très différents.
Les simulations de Monte-Carlo servent à répondre à cette question : qu'est-ce qui aurait pu se passer, et avec quelle probabilité ? Plutôt qu'un seul chiffre, on obtient une distribution de résultats. C'est ce qui permet de passer de « ma stratégie a fait +40 % » à « dans 95 % des scénarios plausibles, ma stratégie fait entre X et Y, avec un drawdown maximal inférieur à Z ».
Le principe en deux mots
On part des résultats observés (la liste des trades d'un backtest, ou l'historique des rendements d'un actif), on génère des milliers de trajectoires alternatives en tirant au hasard dans ces données, puis on étudie la dispersion des résultats. C'est l'application directe de la loi des grands nombres : plus on simule de trajectoires, plus la distribution obtenue se stabilise et devient exploitable.
Les principales variantes
Ce qu'on en tire concrètement
Un exemple chiffré qui calme
Prenons une stratégie de 200 trades : 45 % de gagnants à +1,5R en moyenne, 55 % de perdants à -1R.
Même logique pour les stratégies plus lentes : la statistique t d'un ratio de Sharpe annuel vaut approximativement Sharpe × √(nombre d'années). Avec un Sharpe de 0,5, il faut environ 16 ans d'historique pour être raisonnablement sûr que la performance n'est pas due au hasard. C'est la loi des grands nombres dans ce qu'elle a de plus cruel : l'avantage réel ne se révèle qu'à long terme, et le bruit domine sur le court terme.
Un exemple de code Python minimal
Remplacer replace=True par une simple permutation (np.random.permutation(trades)) pour la variante reshuffle.
Les limites à connaître
Le Monte-Carlo n'invente rien : il ne fait que redistribuer l'information contenue dans les données de départ. Si le backtest est sur-optimisé, le Monte-Carlo produira des milliers de variantes d'un résultat sur-optimisé, avec une rassurante mais trompeuse régularité. De même, si l'historique ne contient aucun krach, aucune simulation par rééchantillonnage n'en fera apparaître. Enfin, le tirage simple suppose que les trades sont indépendants, ce qui est rarement tout à fait vrai.
C'est pourquoi le Monte-Carlo doit être combiné avec d'autres méthodes qui s'attaquent, elles, au problème du surajustement.
Les autres méthodes qui exploitent la même logique
En résumé, une démarche sérieuse ressemble à ceci
Et vous, utilisez-vous ce type de simulations avant de passer en réel ? Avec quels outils (Python, Excel, logiciels dédiés) ? N'hésitez pas à partager vos distributions de drawdown, les écarts avec le backtest initial sont souvent édifiants.
Un backtest ne montre qu'un seul chemin : celui que le marché a réellement pris, avec les trades dans un ordre précis. Or ce chemin n'est qu'un tirage parmi une infinité de possibles. Si la même stratégie avait connu ses 8 pertes consécutives en tout début de parcours plutôt qu'au milieu d'une phase de gains, le drawdown et le moral du trader auraient été très différents.
Les simulations de Monte-Carlo servent à répondre à cette question : qu'est-ce qui aurait pu se passer, et avec quelle probabilité ? Plutôt qu'un seul chiffre, on obtient une distribution de résultats. C'est ce qui permet de passer de « ma stratégie a fait +40 % » à « dans 95 % des scénarios plausibles, ma stratégie fait entre X et Y, avec un drawdown maximal inférieur à Z ».
Le principe en deux mots
On part des résultats observés (la liste des trades d'un backtest, ou l'historique des rendements d'un actif), on génère des milliers de trajectoires alternatives en tirant au hasard dans ces données, puis on étudie la dispersion des résultats. C'est l'application directe de la loi des grands nombres : plus on simule de trajectoires, plus la distribution obtenue se stabilise et devient exploitable.
Les principales variantes
- Le rééchantillonnage par permutation (reshuffle) : on garde exactement les mêmes trades mais on mélange leur ordre. Attention, le résultat final ne change pas (la somme ou le produit des trades est identique quel que soit l'ordre). Ce qui change, c'est le chemin : drawdown maximal, durée des phases de pertes, séries perdantes. C'est l'outil idéal pour dimensionner son risque.
- Le bootstrap (tirage avec remise) : on tire des trades au hasard dans la liste, un même trade pouvant sortir plusieurs fois ou jamais. Cette fois le résultat final varie, ce qui permet d'obtenir un intervalle de confiance sur la performance elle-même.
- Le block bootstrap : on tire des blocs de trades ou de rendements consécutifs plutôt que des éléments isolés. Indispensable quand les résultats ne sont pas indépendants (régimes de volatilité, séries de gains en tendance, etc.).
- Le Monte-Carlo paramétrique : on modélise les rendements par une loi (normale, Student à queues épaisses, GARCH pour la volatilité variable...) et on génère des trajectoires de prix synthétiques. Très utilisé pour les allocations d'actifs, la retraite, les options.
- Le Monte-Carlo « de robustesse » : on perturbe les conditions d'exécution (ajout aléatoire de slippage, suppression aléatoire de 5 à 10 % des trades, décalage des entrées d'une bougie, variation des paramètres). Si la stratégie s'effondre au moindre grain de sable, elle ne survivra pas au réel.
Ce qu'on en tire concrètement
- La distribution du drawdown maximal : on dimensionne son capital et sa taille de position sur le 95e ou le 99e centile, pas sur le drawdown du backtest (qui est presque toujours optimiste).
- Le risque de ruine : la proportion de scénarios où le compte passe sous un seuil jugé inacceptable.
- La distribution des séries perdantes et des durées de retour au plus haut, pour savoir à l'avance ce qui est « normal » et ne pas abandonner une stratégie saine au pire moment.
- Un intervalle de confiance sur le rendement annuel et sur l'espérance par trade.
Un exemple chiffré qui calme
Prenons une stratégie de 200 trades : 45 % de gagnants à +1,5R en moyenne, 55 % de perdants à -1R.
- Espérance par trade : 0,45 × 1,5 - 0,55 × 1 = +0,125R. Sur le papier, c'est une stratégie gagnante.
- Écart-type par trade : environ 1,24R.
- Erreur standard de l'espérance sur 200 trades : 1,24 / √200 ≈ 0,088R.
- Statistique t : 0,125 / 0,088 ≈ 1,4. Autrement dit, on ne peut pas exclure statistiquement que l'avantage soit nul.
Même logique pour les stratégies plus lentes : la statistique t d'un ratio de Sharpe annuel vaut approximativement Sharpe × √(nombre d'années). Avec un Sharpe de 0,5, il faut environ 16 ans d'historique pour être raisonnablement sûr que la performance n'est pas due au hasard. C'est la loi des grands nombres dans ce qu'elle a de plus cruel : l'avantage réel ne se révèle qu'à long terme, et le bruit domine sur le court terme.
Un exemple de code Python minimal
Code : Tout sélectionner
import numpy as np
trades = np.loadtxt("trades_R.csv") # un résultat par ligne, en R ou en %
n_sim, n = 10000, len(trades)
dd_max, perf = [], []
for _ in range(n_sim):
tirage = np.random.choice(trades, size=n, replace=True) # bootstrap
equity = np.cumsum(tirage)
dd = np.max(np.maximum.accumulate(equity) - equity)
dd_max.append(dd)
perf.append(equity[-1])
print("Perf 5e / 50e / 95e centile :", np.percentile(perf, [5, 50, 95]))
print("Drawdown max 95e / 99e centile :", np.percentile(dd_max, [95, 99]))
print("Proba perf finale négative :", np.mean(np.array(perf) < 0))Les limites à connaître
Le Monte-Carlo n'invente rien : il ne fait que redistribuer l'information contenue dans les données de départ. Si le backtest est sur-optimisé, le Monte-Carlo produira des milliers de variantes d'un résultat sur-optimisé, avec une rassurante mais trompeuse régularité. De même, si l'historique ne contient aucun krach, aucune simulation par rééchantillonnage n'en fera apparaître. Enfin, le tirage simple suppose que les trades sont indépendants, ce qui est rarement tout à fait vrai.
C'est pourquoi le Monte-Carlo doit être combiné avec d'autres méthodes qui s'attaquent, elles, au problème du surajustement.
Les autres méthodes qui exploitent la même logique
- L'analyse walk-forward : on optimise sur une fenêtre, on teste sur la période suivante jamais vue, on décale, on recommence. On obtient ainsi une succession de résultats hors échantillon, bien plus représentatifs que l'optimisation globale.
- La validation croisée combinatoire purgée (CPCV) : popularisée par Marcos López de Prado, elle découpe l'historique en blocs et teste toutes les combinaisons entraînement / test, en retirant les zones de chevauchement. Résultat : non pas une seule courbe hors échantillon, mais une distribution de courbes.
- Le test de permutation des prix (approche décrite notamment par Timothy Masters) : on mélange les rendements du sous-jacent pour détruire toute structure exploitable, puis on relance l'optimisation complète sur ces marchés « aléatoires ». Si la stratégie obtient d'aussi bons résultats sur du bruit que sur le vrai marché, c'est qu'elle n'exploite que du bruit.
- Le benchmark à entrées aléatoires : on compare la stratégie à des milliers de systèmes qui entrent au hasard avec les mêmes règles de sortie et la même exposition. Très instructif pour savoir si c'est le signal d'entrée ou la gestion de position qui fait le travail.
- Le Deflated Sharpe Ratio et la Probability of Backtest Overfitting (Bailey et López de Prado) : ces indicateurs corrigent le Sharpe du nombre de variantes testées. Tester 500 combinaisons de paramètres et retenir la meilleure garantit presque mécaniquement un joli Sharpe, même sans aucun avantage réel.
- Le Reality Check de White et le test SPA de Hansen : tests statistiques conçus pour vérifier si la meilleure stratégie d'un lot bat réellement une référence, en tenant compte du fait qu'on en a testé beaucoup.
- Les données synthétiques : générer des marchés artificiels (modèles GARCH, régimes de Markov, ou prix réels bruités) pour tester la stratégie sur des configurations que l'historique n'a pas offertes.
- L'analyse de sensibilité des paramètres : une stratégie robuste se situe sur un plateau (les paramètres voisins donnent des résultats proches), pas sur un pic isolé entouré de pertes.
En résumé, une démarche sérieuse ressemble à ceci
- 1. Construire la stratégie sur une partie de l'historique seulement.
- 2. Vérifier la stabilité des paramètres et la validité hors échantillon (walk-forward ou CPCV).
- 3. Tester contre le hasard (permutation, entrées aléatoires, Deflated Sharpe).
- 4. Seulement ensuite, utiliser le Monte-Carlo pour dimensionner le risque et fixer à l'avance les seuils d'alerte (drawdown au-delà duquel on considère que la stratégie ne fonctionne plus).
Et vous, utilisez-vous ce type de simulations avant de passer en réel ? Avec quels outils (Python, Excel, logiciels dédiés) ? N'hésitez pas à partager vos distributions de drawdown, les écarts avec le backtest initial sont souvent édifiants.