Optimiser et valider un backtest, doctrine Tinsley et recherche récente
Préambule
Section intitulée « Préambule »Cette formation s’adresse à un trader systématique en montée en compétence, à un quant junior sortant de master, ou à un ingénieur ML qui bascule vers la finance. Prérequis : Python opérationnel (pandas, numpy, matplotlib), statistiques descriptives, et une exposition antérieure à un backtest même rudimentaire.
À l’issue de la lecture, tu sauras reconnaître les pièges classiques d’overfitting et d’illusion stochastique, appliquer une walk-forward analysis et choisir entre anchored et sliding, choisir une métrique de performance et la déflater, mobiliser CPCV, Deflated Sharpe Ratio, Probability of Backtest Overfitting et correction multiple testing, éviter look-ahead bias, biais de survie et execution gap.
Durée de lecture active : 5 à 7 heures sur 3 à 5 sessions. Modules à lire dans l’ordre. Le module 6 (CPCV, DSR, PBO) est le plus dense. Les tests d’auto-évaluation varient en format (QCM, cas à étendre, mini-projet code, question ouverte). Pipeline opérationnel : idéation, préparation des données, backtest baseline, optimisation, validation robuste, verdict GO/NO-GO, retour R&D au moindre rejet. Schéma technique détaillé en module 6.
Pour apprendre durablement de cette formation. Les techniques à haute utilité documentées par Dunlosky 2013 (39) sont :
- Practice testing : refaire les quizz à J+1, J+7 et J+30.
- Interleaving : croiser deux modules dans un même exercice (par exemple calculer le DSR sur le cas Marie de M3).
- Élaboration : formuler le pseudo-code dans tes propres mots avant de relire la version livrée.
[Comment lire cette formation] La formation utilise deux dispositifs pédagogiques pour rendre la terminologie accessible sans alourdir la lecture du quant déjà formé.
Encadrés “Pour comprendre” (en bloc citation comme celui-ci) : ils définissent les concepts structurants à leur première occurrence. Le lecteur qui maîtrise le terme peut sauter le bloc sans perte. Le lecteur qui ne le maîtrise pas y trouve définition, ordres de grandeur typiques et limites principales.
Notes en italique entre parenthèses (comme cet exemple) : elles glissent une précision technique mineure (formule non explicitée, hypothèse, convention, ordre de grandeur) sans rompre la phrase. Le lecteur formé les lit en passant ; le lecteur qui découvre y trouve le détail manquant.
Le glossaire en fin de document reste la référence canonique de tous les termes techniques. Les encadrés sont la version en flux du même contenu, placés au moment où le concept apparaît dans le raisonnement.
Module 1, edge réel ou illusion stochastique
Section intitulée « Module 1, edge réel ou illusion stochastique »Objectif. À la fin de ce module, tu sais reconnaître à l’œil la signature d’un edge dû au hasard sur une distribution de PnL, et tu sais que ce diagnostic visuel a un équivalent statistique formel.
[Pour comprendre] Edge : avantage statistique réel d’une stratégie sur le hasard pur, mesuré en rendement attendu par trade. Un edge de 0,25R signifie qu’en moyenne chaque trade rapporte 25 pourcent du risque pris (R = distance entrée-stop). Avoir un edge = avoir une espérance de gain par trade strictement positive après frais, là où une stratégie aléatoire équivalente a une espérance nulle voire négative une fois les frais payés. C’est indépendant du taux de trades gagnants : un edge peut venir de gains fréquents et modestes comme de gains rares mais larges (cas typique du trend follower à 0,25R, qui gagne souvent moins d’une fois sur deux). Sans edge réel, toute stratégie qui semble gagner à court terme est dans la queue droite d’une distribution chanceuse.
Le piège fondateur
Section intitulée « Le piège fondateur »Tu génères 1000 stratégies aléatoires sur cinq ans de données BTCUSDT 1h. Chaque stratégie est un croisement de moyennes mobiles avec des fenêtres tirées au hasard. Tu mesures le rendement annualisé de chacune. Tu obtiens une distribution. Au centre, des stratégies break-even, à perte légère après frais. À droite, une longue queue de stratégies qui ont fait 30 pourcent, 50 pourcent, 80 pourcent annualisés sur les cinq ans. Ces stratégies n’ont aucun edge réel, par construction : elles sont aléatoires. La queue droite est de la pure chance.
C’est exactement le phénomène que Martin Tinsley décrit dans la vidéo 04 de sa série Darwinex (1) : “the systems that effectively break even you’ll have many more of those which is represented by this peak on the distribution curve”. La distribution de PnL d’un ensemble large de systèmes break-even présente un pic central et des queues symétriques. La queue droite n’est pas un edge, c’est un sous-échantillon chanceux.
Aronson formalise cette observation sous le nom de data mining bias au chapitre 6 d’Evidence-Based Technical Analysis (2) : la meilleure règle parmi N essais a une performance attendue out-of-sample inférieure à sa performance in-sample, et la différence croît en racine carrée de logarithme de N (statistique d’extreme value).
[Pour comprendre] Multiple testing bias : quand tu testes N configurations différentes et que tu gardes la meilleure, ton résultat est biaisé positivement même si aucune configuration n’a d’edge réel. Intuition : lance 100 pièces 10 fois chacune, garde celle qui a fait le plus de piles. Tu obtiendras 8 ou 9 piles sur 10. Ce n’est pas une pièce truquée, c’est de la sélection sur N essais. Toute optimisation de paramètres est ce jeu-là.
Conséquence opérationnelle
Section intitulée « Conséquence opérationnelle »[Pour comprendre] Sharpe ratio : rapport entre la moyenne des rendements excédentaires (au-dessus du taux sans risque) et leur écart-type, annualisé. Indique si une stratégie gagne plus qu’elle ne risque, en moyenne. Sharpe > 1 = correct, > 2 = excellent, > 3 = suspect sauf source institutionnelle. Limite majeure : le Sharpe se calcule sur n’importe quelle distribution, mais il sous-estime le risque quand les rendements sont à queues épaisses ou asymétriques (cas crypto), et son annualisation suppose des rendements non autocorrélés. Détail, corrections et version déflatée en M5.
Si tu rapportes le Sharpe ratio de la meilleure parmi 100 stratégies testées, et en supposant que les Sharpes annualisés estimés à travers ces essais ont un écart-type d’environ 1, ton Sharpe attendu est environ 2,5 même si aucune de ces stratégies n’a d’edge réel ; sur 10 000 combinaisons, environ 3,8 par pure chance. Ces seuils ne sont pas des constantes : ils montent et descendent proportionnellement à l’écart-type des Sharpes entre les essais. C’est cette dispersion, pas un nombre fixe, qui détermine de combien dégonfler le Sharpe gagnant, d’où la nécessité de connaître l’écart-type des Sharpes des autres configurations (réponse D ci-dessous, formalisée en module 6). Tu n’as pas trouvé un alpha, tu as échantillonné une queue de distribution.
Le diagnostic visuel reste utile en première intention : distribution gaussienne centrée sur zéro avec un meilleur run en queue = fake edge probable. Mode décalé positif avec dispersion modérée = edge plus crédible, à valider statistiquement (cf. module 6).
Pièges à éviter
Section intitulée « Pièges à éviter »- Confondre Sharpe rapporté nominal et Sharpe vrai. Le Sharpe rapporté est une variable aléatoire dont la variance vient du nombre d’essais préalables.
- Croire qu’une stratégie qui marche en backtest est un alpha. Sans déflation, c’est une queue de distribution.
- S’arrêter au diagnostic visuel. López de Prado et Lewis (3) proposent en 2018 une méthode non-supervisée (clustering hiérarchique sur corrélations) pour estimer le nombre effectif d’essais indépendants.
Test d’auto-évaluation, format QCM
Section intitulée « Test d’auto-évaluation, format QCM »Tu lis sur un blog : “j’ai backtesté mon système de croisement EMA sur trois ans de BTC, Sharpe 2,3 net de frais”. Coche la ou les bonne(s) réponse(s) parmi les options ci-dessous.
A) Le Sharpe 2,3 est statistiquement interprétable tel quel, l’auteur a livré une bonne information. B) Sans le nombre de configurations EMA testées, le Sharpe est non interprétable. C) Trois ans de BTC suffisent à conclure si Sharpe > 2. D) Il faut aussi connaître l’écart-type des Sharpes obtenus sur les autres configurations. E) Il faut connaître le Sharpe de la pire configuration pour estimer la dispersion totale.
Réponses : B, D. La A est fausse parce qu’un Sharpe rapporté sans déflation est une variable aléatoire dont la variance vient du nombre d’essais préalables. La C est fausse parce que la durée du backtest ne corrige pas le multiple testing. La E est fausse parce que le Sharpe de la seule pire configuration est une statistique d’ordre extrême isolée qui ne mesure pas la dispersion : la grandeur pertinente est l’écart-type des Sharpes sur l’ensemble des configurations (option D), qui alimente le calcul du Sharpe maximum attendu sous H0 dans le DSR. B et D forment ensemble le minimum recevable d’information statistique pour qualifier le Sharpe au sens de Bailey et López de Prado (4).
Module 2, taille d’échantillon et puissance statistique
Section intitulée « Module 2, taille d’échantillon et puissance statistique »Objectif. À la fin de ce module, tu sais calculer le sample size minimum pour détecter un edge donné avec une puissance donnée, et tu sais que ce calcul est prérequis du backtest, pas vérification a posteriori.
Le cadre statistique
Section intitulée « Le cadre statistique »La puissance statistique d’un test est la probabilité de détecter un effet quand cet effet existe réellement. Cohen (5) la définit en une phrase reprise par Tinsley vidéo 05 : “the statistical power of a hypothesis test is the probability of detecting an effect if there is a true effect present to detect”.
[Pour comprendre] Puissance statistique : probabilité que ton test conclue “edge réel” quand l’edge existe vraiment. Si puissance = 80 pourcent, tu détectes l’edge dans 8 cas sur 10. À 50 pourcent, c’est pile ou face. Standard scientifique : viser 80 ou 90 pourcent. En dessous, ton backtest peut conclure “pas d’edge” alors qu’il existe (faux négatif, manque à gagner).
Quatre quantités sont liées : puissance (1 moins beta), niveau alpha, effect size, taille N. Fixer trois détermine la quatrième. Pour le trading : alpha 5 pourcent, puissance 80 ou 90 pourcent, effect size présumé (edge en R-multiples ou Sharpe), on en déduit N. (alpha = seuil de risque de faux positif, classiquement 5 pourcent. beta = risque de faux négatif, complément de la puissance. Effect size = magnitude attendue de l’edge, normalisée par son écart-type.)
[Pour comprendre] R-multiple (Van Tharp) : profit ou perte d’un trade exprimé en multiples du risque initial pris. R = distance entre prix d’entrée et stop-loss. Un trade qui rapporte 3 fois ce risque = +3R. Un stop touché = -1R par construction. Avantage : rend les trades comparables entre eux indépendamment de la taille de position. Sert de base à l’expectancy (moyenne des R-multiples) et au SQN (System Quality Number).
Tinsley popularise en vidéo 07 un ordre de grandeur : 2500 trades minimum pour extraire 90 pourcent d’un edge de 10 pourcent. À 250 trades, 75 pourcent. À 25 trades, on est dans le bruit. Référence intuitive, pas constante universelle.
Trois leviers pour atteindre le sample size
Section intitulée « Trois leviers pour atteindre le sample size »Tinsley vidéos 12-16 distingue trois leviers :
- Durée du backtest. Idéal 10 ans sur l’actif cible. Limite crypto : dix ans = BTC pré-2016, beaucoup d’altcoins n’existaient pas.
- Multi-symbol. Tinsley travaille sur 22 paires forex en parallèle. Équivalent crypto retail : BTC + ETH + 3 à 5 large-caps liquides (SOL, BNB, XRP).
- Multi-timeframe. Tester la même logique sur plusieurs unités de temps. Attention : timeframes étroits = trades fortement corrélés, gain effectif inférieur au gain brut.
Et le multiple testing ?
Section intitulée « Et le multiple testing ? »Augmenter N résout la variance d’estimation du Sharpe pour une configuration. Cela ne résout pas le multiple testing bias sur configurations parallèles. Pour ce volet, Harvey, Liu et Zhu, … and the Cross-Section of Expected Returns (RFS 2016, ref 6). Sur 296 facteurs cross-section publiés 1967-2015, la plupart n’auraient pas survécu à une correction rigoureuse. Conclusion praticien : t-stat seuil 2,0 (p < 0,05) insuffisant ; pour déclarer un facteur, t-stat > 3,0 minimum.
Transposé au backtest individuel : 100 configurations → Sharpe seuil environ 3,5 ; 1000 configurations → environ 4,2. Ordres de grandeur dérivés du Sharpe nominal corrigé par extreme value sous H0. (t-stat = statistique de test classique, ratio entre l’effet observé et son erreur standard. t > 2 = significatif à 5 pourcent sous une hypothèse nulle simple ; t > 3 = ordre de grandeur du seuil de Harvey, Liu et Zhu (2016) une fois corrigé du multiple testing massif de la littérature factorielle, des centaines de facteurs. C’est bien un ordre de grandeur, pas une constante : les corrections sous-jacentes (Bonferroni, Holm, Benjamini-Hochberg) sont traitées en M6, et les acronymes associés au glossaire.)
Pseudo-code illustratif, calcul du sample size minimum
Section intitulée « Pseudo-code illustratif, calcul du sample size minimum »# pseudo-code illustratif, non exécutable tel quel# Calcul du sample size minimum pour edge en R-multiplesimport numpy as npfrom scipy import stats
def sample_size_min(expectancy_R, sd_R, alpha=0.05, power=0.90): """ Calcul du N minimum pour détecter un edge à puissance donnée. expectancy_R : edge attendu (moyenne des R-multiples) sd_R : écart-type des R-multiples """ z_alpha = stats.norm.ppf(1 - alpha / 2) z_beta = stats.norm.ppf(power) effect = expectancy_R / sd_R N = ((z_alpha + z_beta) / effect) ** 2 return int(np.ceil(N))
# Edge présumé 0.25R, écart-type 1.2R (typique trend follower crypto)print(sample_size_min(expectancy_R=0.25, sd_R=1.2, power=0.90))# Résultat indicatif ~243 trades minimumL’effect size 0,25R / 1,2R = 0,21 (Cohen’s d) est petit à modéré. Edge plus faible (0,10R / 1,2R = 0,08) : N grimpe à environ 1500 (1514 exactement). Edge fort (0,40R / 1,2R = 0,33) : N descend autour de 95. Intuition Cohen-Tinsley : plus l’edge est faible, plus il faut de trades pour le détecter. (Cohen’s d = effect size standardisé, donc comparable entre études : écart entre une moyenne et une valeur de référence (ici zéro, l’absence d’edge), rapporté à l’écart-type. Cas à un échantillon ici : expectancy_R / sd_R, exactement la formule du pseudo-code.)
Pièges à éviter
Section intitulée « Pièges à éviter »- Calculer N a posteriori. N se fixe a priori, en fonction de l’edge présumé. Backtest avec 80 trades : soit allonger la période, soit accepter que la conclusion est peu fiable.
- Confondre nombre brut de trades et sample size effectif. 1000 trades sur trois actifs fortement corrélés équivalent à un sample effectif d’environ 400.
- Ignorer le multiple testing. 2500 trades sur une configuration ne protègent pas si 200 configurations ont été testées en parallèle.
Test d’auto-évaluation, question fermée
Section intitulée « Test d’auto-évaluation, question fermée »Tu envisages une stratégie momentum sur BTC 1h avec un edge présumé en expectancy de 0,15R et un écart-type R de 1,1. Tu disposes de 4 ans de données. Tu observes en moyenne 0,8 trade par jour sur cette logique. As-tu un sample size suffisant pour une puissance 90 pourcent ?
Réponse. Sample size minimum : environ 570 trades (expectancy 0,15, sd 1,1, alpha 5 pourcent bilatéral, puissance 90 pourcent ; valeur exacte 566 par la formule du pseudo-code ci-dessus). Trades observables sur 4 ans : 4 × 365 × 0,8 = 1168. Volume brut suffisant. Reste à vérifier la corrélation entre trades (autocorrélation ou concentration sur quelques régimes réduit le sample effectif). Et reste le multiple testing : combien de configurations vas-tu tester ?
Module 3, overfitting, surapprendre le bruit, surapprendre les événements
Section intitulée « Module 3, overfitting, surapprendre le bruit, surapprendre les événements »Objectif. À la fin de ce module, tu sais distinguer les deux causes formelles d’overfitting selon Tinsley, et tu sais que la heuristique Tinsley et la PBO formelle de Bailey-López de Prado-Borwein-Zhu répondent à la même question avec des outils différents.
[Pour comprendre] Overfitting (surapprentissage) : ta stratégie a appris les particularités aléatoires du passé (le bruit), pas le mécanisme général. Conséquence : excellente en backtest, désastreuse en live. Cause numéro un d’échec en trading quant. Deux variantes : noise overfitting (calibration sur micro-bruits) et events overfitting (calibration sur quelques événements rares chanceux). Plus tu testes de paramètres, plus tu risques d’overfitter.
Cas pratique étendu, Marie optimise un système RSI
Section intitulée « Cas pratique étendu, Marie optimise un système RSI »Marie code un système simple : achat quand RSI(n) franchit le seuil S vers le haut, vente symétrique. Cinq ans d’historique ETHUSDT 4h, 5 valeurs pour n (10, 14, 20, 28, 40) et 5 pour S (50, 55, 60, 65, 70) soit 25 configurations. Winner : n=28, S=60, Sharpe nominal 1,8 in-sample. Marie publie sur Substack. (in-sample = période sur laquelle Marie a optimisé ses paramètres. Le Sharpe 1,8 mesure la performance sur cette même période, là où le système a été “ajusté pour gagner”. Voir M4 pour le contraste avec out-of-sample.)
Trois mois plus tard, en live, la stratégie perd. Sharpe live 0,2. Marie attribue à un régime changé. Faux : Marie a overfitté. On la retrouve en M5 et M6.
Tinsley vidéo 10 (3.2 The two reasons you WILL be over-fitting) distingue deux causes :
Noise overfitting. Les paramètres calibrent sur les micro-bruits aléatoires de l’in-sample. Plus de degrees of freedom (paramètres libres) = plus le système épouse le bruit ; c’est la cause au sens strict, et Tinsley pose un hard limit de 2 à 3 paramètres pour la contenir. Marie n’a que 2 paramètres, donc une exposition faible à ce mécanisme-là. Son vrai problème est différent et s’y ajoute : la sélection du meilleur de 25 configurations testées (multiple testing / selection bias) gonfle mécaniquement le Sharpe retenu, même en l’absence d’edge réel. (degrees of freedom = nombre de paramètres libres que l’optimisation peut ajuster, ici 2.)
Events overfitting. Les paramètres calibrent sur quelques événements rares qui dominent la PnL. Sur cinq ans, Marie a probablement capté deux pumps de novembre 2021 et un crash de mai 2022 de manière chanceuse. Tinsley vidéo 14 propose une heuristique : overfitting score = (somme des magnitudes absolues des PnL du top 1 pourcent des trades / somme des magnitudes absolues de TOUS les trades) × 100. Le facteur 100 vient du seuil de 1 pourcent ; le score mesure donc combien de fois les trades du top 1 pourcent pèsent, en magnitude absolue, par rapport au poids moyen d’un trade. De manière équivalente, c’est le rapport entre la magnitude absolue moyenne du top 1 pourcent et la magnitude absolue moyenne de tous les trades : un score de 12 signifie que les trades du top 1 pourcent sont en moyenne 12 fois plus gros que le trade moyen. Au-delà d’un seuil empirique de 12, suspect.
Du heuristique au formel
Section intitulée « Du heuristique au formel »L’overfitting score Tinsley est une heuristique sans fondement statistique formel : seuil empirique observé. Utile en quick screen.
Bailey, Borwein, López de Prado et Zhu formalisent en 2014 dans Pseudo-Mathematics and Financial Charlatanism (Notices AMS, ref 7), puis en 2016 dans The Probability of Backtest Overfitting (Journal of Computational Finance, ref 8). Résultat opérationnel : la PBO, calculée via Combinatorial Symmetric Cross-Validation (CSCV). Pour N configurations sur K folds, probabilité que la meilleure in-sample soit dans la moitié basse out-of-sample. PBO > 0,5 = sélection essentiellement aléatoire, backtest overfitté.
[Pour comprendre] PBO (Probability of Backtest Overfitting) : probabilité formelle que la stratégie sélectionnée comme la meilleure sur les données d’entraînement finisse en dessous de la médiane sur des données nouvelles. Lecture : PBO = 0,3 signifie 30 pourcent de risque que ta meilleure config soit en réalité dans la moitié faible. Seuil opérationnel : PBO < 0,5 pour valider. Au-delà de 0,5, ta sélection est essentiellement de la chance.
graph TB
subgraph "Tinsley heuristique (vidéo 14)"
T1["1. Identifier top 1% trades"] --> T2["2. Somme magnitudes top 1%"]
T2 --> T3["3. Diviser par somme<br/>de toutes les magnitudes, x100"]
T3 --> T4["Score > 12<br/>= suspect"]
end
subgraph "Bailey-LdP formel (PBO 2016)"
B1["1. N configurations testées"] --> B2["2. Splits CSCV combinatoires"]
B2 --> B3["3. Pour chaque split:<br/>best in-sample → rang OOS"]
B3 --> B4["PBO > 0.5<br/>= overfit probable"]
end
T4 -.->|même problème,<br/>outils différents| B4
Les deux outils ne sont pas substituables. Heuristique Tinsley : calcul à la main sur un single backtest. PBO : requiert le tracking systématique des rendements de toutes les configurations sur toutes les sous-périodes. Doctrine 2026 : cumuler les deux, Tinsley en quick screen, PBO en validation finale avant paper trade.
Application empirique 2024
Section intitulée « Application empirique 2024 »Arian, Norouzi Mobarekeh et Seco publient en 2024 dans Knowledge-Based Systems (9) une comparaison empirique CPCV vs walk-forward simple en termes de PBO sur environnement synthétique contrôlé. CPCV réduit nettement la PBO par rapport au walk-forward sliding pour le même ensemble de candidats (PBO plus basse et Deflated Sharpe Ratio supérieur dans l’environnement synthétique contrôlé d’Arian 2024). Meilleure barrière à l’overfitting que le WFA classique. Tinsley s’arrête au WFA Pardo ; CPCV (LdP 2018 ch. 12) le complète et le dépasse théoriquement.
Pièges à éviter
Section intitulée « Pièges à éviter »- Confondre overfitting et régime changeant. Premier diagnostic : overfit (à investiguer en priorité). Deuxième diagnostic : régime changé (drift detection, cf. M8). Ne pas court-circuiter le premier.
- Croire que peu de paramètres protègent. Marie a 2 paramètres et son backtest est overfitté. Le multiple testing compte autant que les degrees of freedom.
- Ignorer les events overfitting. Inspecter la contribution des 1 pourcent top trades à la PnL totale (métrique distincte du score Tinsley : ici part de PnL nette, pas ratio de magnitudes absolues). Au-delà de 30 à 40 pourcent, le backtest dépend de quelques événements chanceux.
Test d’auto-évaluation, question fermée
Section intitulée « Test d’auto-évaluation, question fermée »Marie te montre les résultats de ses 25 configurations RSI : Sharpe nominal du meilleur = 1,8, écart-type des 25 Sharpes = 0,7. Le meilleur trade représente 18 pourcent de la PnL totale. Quel est ton verdict initial sans calcul formel ?
Réponse. Deux signaux convergent vers overfit. (1) Sharpe 1,8 sur 25 essais : sous H0 (vrai Sharpe = 0), une config prise au hasard a un Sharpe attendu de 0, mais ce n’est pas la bonne référence. La grandeur pertinente est l’espérance du MEILLEUR des 25 Sharpes, qui sous H0 vaut déjà environ 1,4 (= écart-type 0,7 × espérance du maximum de 25 tirages normaux standard, soit ~1,96, arrondi à 2). Le 1,8 observé n’est donc que faiblement au-dessus de ce que le pur hasard produit en sélectionnant le meilleur de 25 essais : c’est suspect, pas rassurant. Premier signal d’overfit. (2) 18 pourcent de PnL concentrés sur un seul trade : signal d’events overfitting. Le bon point de comparaison est 1/(nombre de trades), pas 1/(nombre de configurations) : avec plusieurs centaines de trades, la part uniforme attendue du plus gros trade est de l’ordre de 0,1 à 1 pourcent, et même cette référence uniforme est un plancher (sous une distribution de PnL à queue lourde, le plus gros trade pèse mécaniquement davantage). Observer 18 pourcent révèle donc une PnL portée par un événement rare et probablement chanceux, ce qui rend le signal encore plus alarmant. Verdict : ne pas passer en live sans CPCV+PBO formel.
Module 4, walk-forward analysis, passer du jouet au protocole
Section intitulée « Module 4, walk-forward analysis, passer du jouet au protocole »Objectif. À la fin de ce module, tu sais coder une boucle walk-forward correctement, choisir entre anchored et sliding, et tu sais pourquoi Pardo et Tinsley ne se rejoignent pas sur ce choix.
[Pour comprendre] Walk-forward analysis (WFA) : protocole où tu découpes l’historique en blocs successifs. Sur chaque bloc tu optimises sur la première portion (in-sample), tu testes sur la portion suivante non vue (out-of-sample), puis tu glisses dans le temps et tu recommences. La performance globale s’obtient par concaténation des portions out-of-sample : on raboute les courbes d’equity OOS dans l’ordre chronologique pour former une seule trajectoire continue, sur laquelle on calcule ensuite les métriques globales (rendement cumulé, Sharpe, max drawdown). On concatène les courbes, on ne somme pas les Sharpe ni les drawdowns (ils ne sont pas additifs). Avantage : aucune donnée n’est utilisée à la fois pour optimiser et pour évaluer. Indispensable pour estimer la performance future réaliste d’une stratégie optimisée.
[Pour comprendre] Anchored vs sliding : deux variantes du walk-forward. Anchored maintient le début de la fenêtre IS fixe et l’allonge à chaque pas, ce qui dilue les régimes anciens dans la calibration. Sliding déplace le début et la fin simultanément, maintenant une fenêtre IS de longueur constante. Tinsley vidéo 38 recommande sliding sur les marchés à régimes changeants, dont la crypto. Anchored est tolérable seulement sur equities long terme.
Le geste fondamental
Section intitulée « Le geste fondamental »Robert Pardo invente le walk-forward analysis dans Design, Testing, and Optimization of Trading Systems (Wiley 1992), réédité en 2008 sous le titre The Evaluation and Optimization of Trading Strategies (10). Tinsley vidéo 35 : “this technique is called walk forward optimization or the multi-stage step forward procedure it was originally invented by Robert Pardo”.
L’idée : pour mesurer la performance future attendue d’une stratégie optimisée, on l’évalue sur des données qui n’ont pas servi à l’optimisation, et on répète la mesure pour ne pas dépendre d’une période de chance. Concrètement : fenêtres glissantes ; optimisation in-sample, évaluation out-of-sample, performance globale = concaténation des OOS.
gantt
title Walk-forward sliding (recommandé Tinsley)
dateFormat YYYY
section Stage 1
IS optim 2018-2020 :2018, 2020
OOS test 2020-2020 :crit, 2020, 6M
section Stage 2
IS optim 2018-2020 :2018, 2020
OOS test 2020-2021 :crit, 2020, 6M
section Stage 3
IS optim 2019-2021 :2019, 2021
OOS test 2021-2021 :crit, 2021, 6M
section Stage 4
IS optim 2019-2021 :2019, 2021
OOS test 2021-2022 :crit, 2021, 6M
Sliding maintient la longueur IS constante en déplaçant son début. Anchored maintient le début fixe et allonge IS à chaque pas. Tinsley vidéo 38 classe l’anchored en anti-pattern : il dilue les régimes anciens dans IS, calibration moins réactive aux régimes récents. Pour la crypto à régimes changeants (cycles 2017, 2019, 2021, 2022-2023, 2024-2025), sliding presque toujours préférable. Anchored : exception sur actions long terme.
Le ratio in-sample / out-of-sample
Section intitulée « Le ratio in-sample / out-of-sample »Pardo recommande 3:1 à 6:1 selon les degrees of freedom (10). Tinsley vidéos 22 et 37 stabilise sur 4:1 comme défaut praticien. Optim 24 mois → test 6 mois. Au-delà de 6:1, OOS trop courte pour signal statistique. En dessous de 3:1, optim manque de données. (ratio IS/OOS = rapport entre la durée d’optimisation et la durée de test hors échantillon ; ici 4:1, soit 24 mois d’optim pour 6 mois de test.)
Tinsley vidéo 47 recommande 6 stages minimum, 12 stages optimum sur 8 à 10 ans d’historique. Pour 4 à 5 ans de crypto : 6 stages, ratio 4:1, OOS 4 à 6 mois.
Pseudo-code illustratif, walk-forward sliding
Section intitulée « Pseudo-code illustratif, walk-forward sliding »# pseudo-code illustratifimport pandas as pdimport numpy as np
def walk_forward_sliding(prices, strategy_fn, optimize_fn, is_months=24, oos_months=6, n_stages=6): """ prices : DataFrame OHLCV indexé par timestamp strategy_fn(params, prices) -> trades, equity optimize_fn(prices_is) -> best_params """ total_months = is_months + oos_months * n_stages start = prices.index.min() oos_results = [] for stage in range(n_stages): is_start = start + pd.DateOffset(months=stage * oos_months) is_end = is_start + pd.DateOffset(months=is_months) oos_end = is_end + pd.DateOffset(months=oos_months) prices_is = prices.loc[is_start:is_end] prices_oos = prices.loc[is_end:oos_end] best_params = optimize_fn(prices_is) trades_oos, equity_oos = strategy_fn(best_params, prices_oos) oos_results.append({ 'stage': stage, 'is_start': is_start, 'is_end': is_end, 'oos_end': oos_end, 'best_params': best_params, 'trades': trades_oos, 'equity': equity_oos, }) return oos_resultsTrois pièges classiques : (a) oublier de purger la frontière IS/OOS quand les labels sont serially dependent (cf. M6 sur CPCV), (b) ré-optimiser sur des paramètres trop nombreux (overfitting à chaque stage), (c) cherry-picker les stages qui marchent et écarter ceux qui perdent. Tinsley vidéo 47 alerte : le reporting doit inclure tous les stages, pas la moyenne pondérée des stages favorables.
Pourquoi WFA ne suffit pas en 2026
Section intitulée « Pourquoi WFA ne suffit pas en 2026 »WFA produit une trajectoire unique : un chemin IS-OOS chronologique. Performance OOS conditionnelle à cette chronologie ; changer le découpage de quelques semaines change la trajectoire. CPCV (LdP 2018 ch. 12.4) répond à cette limite en générant N chemins OOS par combinaisons de folds (cf. M6).
(Toute méthode WFA, CPCV ou bootstrap suppose implicitement que la distribution des rendements est suffisamment stable entre IS et OOS. Quand cette hypothèse est violée à grande échelle, on parle de régime change, voir M8.)
Test d’auto-évaluation, question fermée
Section intitulée « Test d’auto-évaluation, question fermée »Tu disposes de 5 ans de BTCUSDT 4h. Tu choisis WFA sliding 6-stages avec IS 24 mois et OOS 6 mois. Combien de mois d’historique total cela consomme-t-il ? Et que se passe-t-il si tu passes en 12-stages ?
Réponse. 6 stages sliding avec IS 24 + OOS 6 mois : IS initial (24) + 6 × OOS (6) = 60 mois soit 5 ans. 12 stages mêmes paramètres : IS 24 + 12 × 6 = 96 mois soit 8 ans. Historique insuffisant pour 12 stages. Options : raccourcir IS à 12 mois (ratio 2:1 dégradé), raccourcir OOS à 3 mois (signal faible), basculer en CPCV qui fait plus avec moins.
Module 5, métriques et position sizing, du Sharpe brut au Deflated Sharpe
Section intitulée « Module 5, métriques et position sizing, du Sharpe brut au Deflated Sharpe »Comme on l’a vu en M3 avec le cas Marie, le multiple testing biaise toute sélection ; cette section explique comment ce biais se transforme en gonflement de Sharpe.
Objectif. À la fin de ce module, tu sais que chaque métrique a un sizing compatible, et tu sais déflater un Sharpe nominal à la main sur un cas simple.
Module en démarche déductive : du résultat statistique vers la pratique.
Le théorème central
Section intitulée « Le théorème central »Le Sharpe observé sur une stratégie sélectionnée parmi N configurations est un estimateur biaisé du vrai Sharpe. Le biais croît avec N. Sous H0 d’absence d’edge, l’espérance du Sharpe maximum sur N essais croît asymptotiquement, au premier ordre, en racine carrée de 2 fois le logarithme de N (racine de 2·ln N). À 100 essais : Sharpe spurious attendu environ 2,5. À 1000 essais : 3,8. À 10 000 essais : 4,7.
Conséquence : tout Sharpe rapporté sans N déclaré est statistiquement non interprétable. Bailey et LdP formalisent la correction en 2014 sous le nom de Deflated Sharpe Ratio (DSR), JPM (4). Le DSR corrige deux choses : (a) selection bias sur multiple testing, (b) non-normalité (skewness, kurtosis).
[Pour comprendre] DSR (Deflated Sharpe Ratio) : le Sharpe nominal corrigé pour le nombre d’essais effectués (N) et pour la forme réelle de la distribution des rendements (non gaussienne). Sortie : une probabilité, pas un ratio. DSR = 0,95 signifie 95 pourcent de chances que le Sharpe vrai dépasse non pas zéro, mais le Sharpe maximum que l’on obtiendrait en moyenne par pur hasard sur N essais sans aucun edge (l’espérance du meilleur Sharpe sous H0, un seuil déterministe qui croît avec N). C’est ce relèvement du seuil, de 0 à ce maximum attendu, qui fait du DSR une métrique honnête sous multiple testing. Seuil de validation : DSR > 0,95. La mécanique exacte (la variable sr_max_expected, le lien au PSR dont le DSR n’est que le cas à seuil déplacé) est détaillée plus bas dans ce module.
[Pour comprendre] Skewness et kurtosis : descriptions complémentaires de la forme d’une distribution au-delà de la moyenne et de l’écart-type. Skewness (asymétrie) : positif = queue droite plus longue (gains rares mais énormes), négatif = queue gauche plus longue (pertes occasionnelles violentes), typique du short-vol crypto. Kurtosis (épaisseur des queues) : 3 = gaussienne, > 3 = queues épaisses (événements extrêmes fréquents), crypto opère typiquement entre 5 et 15. Une stratégie skew négatif + kurt élevé est exposée à un risque de queue qu’un Sharpe nominal ne capture pas.
Deux corrections partielles antérieures. Lo 2002, FAJ (12) traite l’autocorrélation : sous IID, l’annualisation du Sharpe mensuel par racine de 12 (l’exemple traité par Lo ; en général racine du nombre de périodes par an, soit racine(252) en journalier) est valide ; sous autocorrélation positive (typique trend), le Sharpe annualisé naïf surestime jusqu’à 65 pourcent, chiffre établi par Lo sur son cas mensuel. Bailey-LdP 2012, JoR (13) introduisent le Probabilistic Sharpe Ratio (PSR) qui corrige skewness et kurtosis sans multiple testing. DSR 2014 = PSR + correction multiple testing.
Calcul DSR explicite
Section intitulée « Calcul DSR explicite »# pseudo-code illustratifimport numpy as npfrom scipy import stats
def deflated_sharpe(sr_observed, sr_estimates, T, skew_returns, kurt_returns): """ sr_observed : Sharpe nominal observé de la stratégie retenue (déjà annualisé) sr_estimates : array des Sharpes de toutes les configurations testées T : nombre d'observations dans le backtest (par exemple barres journalières) skew_returns : skewness de la distribution des rendements kurt_returns : kurtosis de Pearson (non-excess, = 3 pour une gaussienne) de la distribution des rendements ; convention cohérente avec l'encadré "Pour comprendre" (3 = gaussienne) et avec la forme de Bailey-López de Prado / Mertens du dénominateur. Ne pas passer la kurtosis de Fisher (excess) : scipy.stats.kurtosis renvoie du Fisher par défaut, il faut donc l'appeler avec fisher=False (ou ajouter 3 au résultat), sinon le terme 1 + ((kurt-1)/4)*SR^2 devient 1 - 0,25*SR^2, nul à SR=2 et négatif au-delà (racine d'un négatif -> nan). """ N = len(sr_estimates) var_sr = np.var(sr_estimates) # Sharpe maximum attendu sous H0 (pas d'edge) emc_gamma = 0.5772156649 # constante Euler-Mascheroni z_inv_1 = stats.norm.ppf(1 - 1.0 / N) z_inv_e = stats.norm.ppf(1 - 1.0 / (N * np.e)) sr_max_expected = np.sqrt(var_sr) * ( (1 - emc_gamma) * z_inv_1 + emc_gamma * z_inv_e ) # Statistique DSR numerator = (sr_observed - sr_max_expected) * np.sqrt(T - 1) denominator = np.sqrt( 1 - skew_returns * sr_observed + ((kurt_returns - 1) / 4) * sr_observed ** 2 ) dsr_z = numerator / denominator # Probabilité que le Sharpe vrai dépasse le maximum attendu sous H0 # (espérance du Sharpe max sur les N essais) : c'est la déflation, pas P(Sharpe > 0) return stats.norm.cdf(dsr_z)Le seuil de validation classique : DSR > 0,95 (probabilité que le Sharpe vrai dépasse SR_max_expected, c’est-à-dire le Sharpe maximum attendu par pur hasard sur N essais sous l’hypothèse d’absence d’edge). Si DSR < 0,95, ton Sharpe nominal de 2,4 est compatible avec une absence d’edge réel sous multiple testing.
Encart zone d’ombre, DSR appliqué à la crypto
Section intitulée « Encart zone d’ombre, DSR appliqué à la crypto »Lacune académique au 2026-05-27 : aucun paper peer review avec calcul DSR explicite sur BTC ou ETH couvrant 2020-2026 n’a été localisé sur arXiv q-fin ni SSRN. Pour illustration pédagogique du calcul DSR en contexte crypto, fallback disponible Balaena Quant Insights, Ling, Medium, 2024 (32). Signal faible, source praticien sans comité éditorial, exemple non empirique.
Métriques et sizing, la table Tinsley
Section intitulée « Métriques et sizing, la table Tinsley »[Pour comprendre] Drawdown (DD) : perte cumulée entre un sommet d’equity curve et le creux qui suit, exprimée en pourcentage. Max DD = pire DD historique de la stratégie, mesure le risque extrême. Mean DD = moyenne des DD significatifs, mesure le risque typique. Une stratégie à Max DD 30 % est tolérable pour un retail patient ; au-delà elle décroche psychologiquement avant d’avoir prouvé son edge.
Tinsley en vidéos 27 à 31 et 41 à 45 documente une asymétrie peu connue des praticiens débutants : selon la métrique optimisée, le position sizing doit être fixe ou variable, pas l’inverse.
| Métrique | Sizing requis | Pourquoi |
|---|---|---|
| Profit factor brut | Fixe (1 lot par trade) | Le sizing variable rend la métrique cumulative et la biaise vers les grandes positions |
| CAGR / Max DD | Variable (% equity) | Le sizing fixe sous-estime le rendement composé |
| CAGR / Mean DD | Variable (% equity) | Idem, et plus sensible aux drawdowns multiples |
| R-multiples Van Tharp | Variable normalisée par R | Chaque trade est normalisé en R, ce qui rend la métrique invariante au sizing absolu |
| SQN Van Tharp | Variable normalisée par R | Idem R-multiples, et intègre la racine du nombre de trades |
| Coefficient de corrélation R sur equity curve | Fixe | Le sizing variable produit une courbe exponentielle pénalisée à tort par la régression linéaire |
| Sharpe ratio | Invariant à un sizing d’échelle constant (levier constant ou fraction fixe d’equity) ; non neutre pour un sizing état-dépendant | L’échelle s’annule dans mu/sigma : multiplier chaque rendement par un facteur constant laisse Sharpe inchangé. Un sizing dont le facteur varie selon l’état récent du marché (vol targeting, Kelly ré-estimé, sizing réactif aux drawdowns) déforme la distribution des rendements et n’est plus neutre. (détail rendements simples vs log : voir note sous la table.) |
(Ligne Sharpe, invariance d’échelle : exacte sur rendements simples, où (k·mu)/(k·sigma) = mu/sigma. Sur rendements log elle ne tient pas, car log(1+k·r) n’est pas linéaire en k ; en pratique sur petits rendements log(1+k·r) ~ k·r, l’écart reste faible mais non nul.)
R-multiples et SQN viennent de Van Tharp (14, 15). R-multiple : P&L d’un trade comme multiple du risque initial (R = entrée moins stop). Expectancy : moyenne des R-multiples sur N trades. SQN : racine(N) × expectancy / écart-type des R-multiples, N plafonné à 100. SQN > 2 tradable, > 3 très bon, > 5 exceptionnel. (plafonnement N=100 : au-delà, le SQN gonflerait artificiellement avec le nombre de trades sans refléter une amélioration de l’edge. Van Tharp préfère une mesure stable plutôt qu’une mesure qui croît mécaniquement.)
Marie revient, son sizing était-il aligné avec sa métrique ?
Section intitulée « Marie revient, son sizing était-il aligné avec sa métrique ? »[Pour comprendre] Position sizing : combien tu mises sur chaque trade. Fixe = même montant à chaque trade (par exemple 1000 USD). Variable = montant proportionnel à ton equity ou à la volatilité (par exemple 2 pourcent du capital courant). Kelly fractionnel : sizing optimal qui maximise le rendement composé à long terme, fondé sur le ratio gain/perte attendu de la stratégie. En pratique, on utilise 1/4 ou 1/2 Kelly pour réduire la variance, le Kelly complet étant trop agressif. Règle de base : choix de sizing et choix de métrique doivent être cohérents, sinon le backtest est biaisé.
Marie, qu’on a vue optimiser son CAGR sans contrainte de drawdown en M3, avait-elle vérifié que son sizing était cohérent avec la métrique qu’elle avait optimisée ? Si on optimise le CAGR brut et qu’on size en Kelly fractionnel (fraction fondée sur le Sharpe), l’alignement est rompu dès la première position. Question d’auto-évaluation à se poser avant tout backtest : “Marie a-t-elle utilisé un sizing aligné avec sa métrique optimisée ?” La table Tinsley ci-dessus fixe les correspondances autorisées : CAGR/Mean DD avec sizing variable, profit factor brut avec sizing fixe, R-multiples Van Tharp avec sizing variable normalisé par R. (piège implicite du Kelly fractionnel sur backtest : Kelly suppose que ton edge est connu, alors qu’ici l’edge est lui-même issu de l’optimisation. C’est circulaire, ce qui motive la déflation DSR avant toute mise en live.)
Pièges à éviter
Section intitulée « Pièges à éviter »- Rapporter un Sharpe sans déflation. Toute mention de Sharpe sans qualificatif est un signal de confusion.
- Mismatcher métrique et sizing. Un profit factor brut optimisé avec sizing variable est sans signification.
- Ignorer skewness et kurtosis. Short-vol Sharpe 2 kurt 12 est très différent de trend Sharpe 2 kurt 3,5.
Test d’auto-évaluation, cas à étendre (Constructive)
Section intitulée « Test d’auto-évaluation, cas à étendre (Constructive) »Marie revient avec une variante de sa stratégie. Elle a ajouté un filtre de volume qui réduit les trades de 30 pourcent mais améliore le Sharpe nominal de 0,4 (donc passe de 1,8 à 2,2 sur le même in-sample). Comment modifies-tu le protocole de validation ? Le nombre de configurations effectives change-t-il ? Quel est l’impact attendu sur le DSR ? Rédige ta réponse en cinq points (sample size, multiple testing, sizing, DSR, GO/NO-GO) avant de comparer à la réponse type.
Réponse type. (1) Sample size : trades divisés par 1,43 ; environ 570 → 400. Vérifier que cela reste au-dessus du seuil de puissance 90 pourcent pour son edge. (2) Multiple testing : le filtre ajoute des paramètres (seuil et fenêtre du volume). Si plusieurs combinaisons du filtre ont été testées, le N effectif passe de 25 à plus, à déclarer. (3) Sizing : le filtre ne change pas le sizing en soi, mais la métrique optimisée doit rester alignée. (4) DSR : avec N effectif plus grand et sample size plus petit, le DSR baisse. L’amélioration de 0,4 sur le Sharpe nominal peut être absorbée par la déflation. (5) GO/NO-GO : pas de GO sans recalcul DSR avec le N effectif révélé. Si Marie cache le N réel, red flag d’overfitting masqué.
Module 6, validation robuste moderne, CPCV, PBO, DSR, multiple testing
Section intitulée « Module 6, validation robuste moderne, CPCV, PBO, DSR, multiple testing »Encart prérequis. Ce module présuppose les modules 2 (sample size, power), 3 (overfitting), 4 (WFA), 5 (Sharpe et DSR). Si tu lis ce module en isolation, lis au moins les sections “le piège” et “le théorème central” des modules 3 et 5 avant.
Objectif. À la fin de ce module, tu sais quand mobiliser CPCV, comment lire un DSR, comment interpréter un PBO, et comment combiner les trois en protocole de validation robuste.
flowchart TB
A["Stratégie + N configs"] --> B["Splits CPCV<br/>n_splits=10, n_test_splits=2<br/>embargo=1%"]
B --> C["C(10,2) = 45 splits<br/>chaque obs apparaît<br/>dans 9 test sets"]
C --> D["Pour chaque split:<br/>train + test"]
D --> E["Reconstruction<br/>N paths OOS"]
E --> F1["Calcul Sharpe nominal<br/>par config x path"]
E --> F2["Calcul PBO<br/>via matrice configs x paths"]
F1 --> G["DSR sur la config<br/>retenue"]
F2 --> H{"PBO < 0.5 ?"}
G --> I{"DSR > 0.95 ?"}
H -->|oui| J["Monte Carlo<br/>bootstrap 10000 trades"]
I -->|oui| J
J --> K{"5e pct MC Sharpe > 0?"}
K -->|oui| L["GO paper trade"]
K -->|non| M["NO-GO"]
H -->|non| M
I -->|non| M
style L fill:#e6ffe6
style M fill:#ffe6e6
CPCV est défini par López de Prado 2018 chapitre 12 section 12.4 (16) ; le chapitre 7 traite le Purged K-Fold CV (brique de base) et le chapitre 14 traite les Backtest Statistics dont DSR.
Pourquoi CPCV bat WFA
Section intitulée « Pourquoi CPCV bat WFA »[Pour comprendre] CPCV (Combinatorial Purged Cross-Validation) : généralisation moderne du walk-forward. Au lieu d’un seul découpage chronologique IS-OOS, on construit toutes les combinaisons possibles de blocs train/test, avec deux protections supplémentaires : le purging (on retire du train les observations dont les labels chevauchent temporellement le test) et l’embargo (on impose un gap temporel entre train et test pour neutraliser l’autocorrélation). Résultat : N chemins out-of-sample au lieu d’un, ce qui donne une distribution de performance au lieu d’une valeur ponctuelle, et alimente directement le calcul du PBO.
Trois raisons cumulées. (1) CPCV produit N chemins OOS au lieu d’un seul. Avec n_splits=10 et n_test_splits=2, on obtient C(10,2) = 45 combinaisons. Chaque observation apparaît comme ensemble de test dans 9 des 45 combinaisons (formellement C(9,1) = 9), ce qui permet de reconstruire 9 chemins OOS et d’estimer la distribution de la performance OOS, pas juste une valeur ponctuelle. La formule des chemins de López de Prado 2018 confirme ce nombre : phi = (n_test_splits/n_splits)·C(n_splits, n_test_splits) = (2/10)·45 = 9. (C(n,k) = coefficient binomial, nombre de façons de choisir k éléments parmi n sans tenir compte de l’ordre. C(10,2) = 45 = 10×9 / 2.)
(2) CPCV intègre nativement le purging et l’embargo, déjà introduits plus haut. L’embargo neutralise l’autocorrélation de court terme. (autocorrélation = corrélation d’une série avec son propre passé. Sur rendements financiers intra-journaliers, cette autocorrélation rapide est non négligeable : sans embargo, de l’information fuit du train vers le test.)
(3) CPCV alimente directement le calcul du PBO via la matrice configs × paths. Le PBO est un sous-produit naturel, contrairement au WFA simple où il faut maintenir un tracking séparé.
[Rappel M3] PBO mesure la probabilité que la meilleure config in-sample finisse sous la médiane out-of-sample. Seuil de validation : PBO < 0,5.
Marie revient, son DSR a-t-il été calculé ?
Section intitulée « Marie revient, son DSR a-t-il été calculé ? »Marie avait retenu la meilleure parmi 73 configurations sur 4 ans de BTCUSDT 1h (le N effectif est passé de 25 à 73 après ajout du filtre de volume en M5). Son Sharpe nominal rapporté était 2,4. Avait-elle calculé le DSR de sa configuration retenue ? Sans DSR, son Sharpe est biaisé positivement d’environ 1,3 à 1,6 point sous H0 avec N=73 et variance des Sharpes typique 0,3. En première approximation (borne asymptotique racine(2 ln N)), le Sharpe maximum attendu sous absence d’edge vaut racine(0,3) × racine(2 ln 73) ≈ 0,548 × 2,93 ≈ 1,60. Sharpe vrai estimé ≈ 2,4 - 1,60 ≈ 0,8. La formule exacte de Bailey-López de Prado utilisée dans le pseudo-code ci-dessus (avec correction d’Euler-Mascheroni) donne une déflation un peu plus faible, de l’ordre de 1,3, soit un Sharpe vrai ≈ 1,1 ; l’ordre de grandeur est le même : le Sharpe nominal de 2,4 est lourdement biaisé. La réponse se calcule, pas se devine. Si Marie n’a pas livré ce calcul, son backtest reste non interprétable au sens DSR.
Pseudo-code illustratif, CPCV maison en pandas pur
Section intitulée « Pseudo-code illustratif, CPCV maison en pandas pur »mlfinlab implémente CPCV via la classe CombinatorialPurgedKFold. Sur Apple Silicon Python 3.13 où mlfinlab pose des problèmes de wheel ARM64, une implémentation maison en pandas+numpy+scipy est faisable en quelques heures.
# pseudo-code illustratif, version simplifiéefrom itertools import combinationsimport numpy as npimport pandas as pd
def cpcv_split(t1, n_splits=10, n_test_splits=2, embargo_pct=0.01): """ t1 : Series indexée par event start, valeur = event end Génère les combinaisons train/test avec purging + embargo """ n = len(t1) splits = np.array_split(np.arange(n), n_splits) embargo_size = int(embargo_pct * n) for test_groups in combinations(range(n_splits), n_test_splits): test_idx = np.concatenate([splits[g] for g in test_groups]) train_idx = np.setdiff1d(np.arange(n), test_idx) # Purging : retirer du train les obs dont t1 chevauche test test_t1_min = t1.iloc[test_idx].min() test_t1_max = t1.iloc[test_idx].max() train_idx_purged = [i for i in train_idx if t1.iloc[i] < test_t1_min or t1.index[i] > test_t1_max] yield train_idx_purged, test_idxL’implémentation complète, testée, demande une centaine de lignes. Référence canonique : López de Prado 2018 chapitre 12.
Le PBO opérationnel
Section intitulée « Le PBO opérationnel »Calcul du PBO à partir de la matrice configs × paths (matrice des Sharpes OOS, lignes = configurations, colonnes = paths CPCV) :
# pseudo-code illustratifdef probability_backtest_overfitting(sharpe_matrix): """ sharpe_matrix : array shape (n_configs, n_paths) """ n_configs, n_paths = sharpe_matrix.shape overfit_count = 0 for path in range(n_paths): # IS proxy : autres paths agrégés is_paths = list(range(n_paths)) is_paths.remove(path) is_sharpes = sharpe_matrix[:, is_paths].mean(axis=1) best_config_is = np.argmax(is_sharpes) # OOS sur le path retenu oos_sharpes = sharpe_matrix[:, path] rank_oos = (oos_sharpes < oos_sharpes[best_config_is]).sum() / n_configs if rank_oos < 0.5: overfit_count += 1 pbo = overfit_count / n_paths return pboPseudo-code simplifié pédagogique. Implémentation rigoureuse CSCV : voir pypbo (https://github.com/esvhd/pypbo) ou Bailey 2014 et 2016. mlfinlab ne fournit pas CSCV (issue GitHub #382, ouverte 2020, non résolue au 2026-05-27).
Seuil : PBO < 0,5 validable, PBO > 0,5 sélection in-sample essentiellement aléatoire.
Encart zone d’ombre, critique académique du CPCV retail
Section intitulée « Encart zone d’ombre, critique académique du CPCV retail »La critique académique formelle de la praticabilité retail du CPCV reste à publier au 2026-05-27. Les contraintes concrètes sont documentées uniquement par des sources praticien (Bailey-LdP 2018) : N_splits minimum requis pour une stabilité statistique est typiquement 6, ce qui exige au moins 3 ans de données quotidiennes pour permettre ces 6 folds avec embargo. L’univers minimum recommandé est de 5 stratégies candidates pour que CSCV soit informatif. Pour un retail avec capital inférieur à 100 000 USD, historique court (12-24 mois), et 1 à 3 stratégies candidates, CPCV est techniquement applicable mais perd son intérêt statistique : un WFA simple avec Monte Carlo bootstrap reste plus opérationnel dans ce cas. Zone d’ombre méthodologique à surveiller.
Articulation avec la doctrine Harvey-Liu
Section intitulée « Articulation avec la doctrine Harvey-Liu »Harvey et Liu prolongent en 2020 False (and Missed) Discoveries (17) et en 2021 Lucky Factors (18). Conclusion praticien : sur N configurations testées, le t-stat seuil passe d’environ 2,0 sans correction à 3,0 ou 4,0 selon la sévérité (Bonferroni, Holm, Benjamini-Hochberg, Harvey-Liu bootstrap).
Lien avec DSR : Bailey-LdP attaquent depuis le Sharpe, Harvey-Liu depuis le t-stat. Les deux sont compatibles. DSR cible mieux les distributions à fortes skewness et kurtosis ; Harvey-Liu cible mieux les portefeuilles de stratégies évalués collectivement.
Pièges à éviter
Section intitulée « Pièges à éviter »- Confondre WFA et CPCV. WFA = chemin unique sliding ou anchored. CPCV = N chemins combinatoires avec purging et embargo.
- Sauter le purging. Sans purging, les labels qui chevauchent train/test produisent du look-ahead.
- Ignorer le PBO. DSR sans PBO informe sur la stratégie retenue, pas sur le processus de sélection.
- Croire que mlfinlab fournit le CSCV. mlfinlab fournit CPCV, pas CSCV (issue GitHub #382, ouverte 2020).
Test d’auto-évaluation, mini-projet code (Constructive)
Section intitulée « Test d’auto-évaluation, mini-projet code (Constructive) »Voici une matrice fictive de Sharpes OOS configs × paths (5 configs, 4 paths) :
config_0 : [0.8, 1.2, 0.5, 0.9]config_1 : [1.5, 0.3, 1.1, 0.6]config_2 : [0.2, 0.8, 0.4, 0.7]config_3 : [1.8, 1.4, 1.6, 1.3]config_4 : [0.5, 0.6, 0.3, 0.4]Calcule le PBO à la main en appliquant le pseudo-code fourni. Pour chaque path, identifie quelle config aurait été retenue comme best sur les trois autres paths agrégés (moyenne), puis vérifie si elle est dans la moitié basse OOS du path retenu. Le PBO est la fraction de paths où cette condition est vraie. Indique la valeur numérique et conclus GO ou NO-GO.
Réponse type. Pour chaque path, on calcule la moyenne des trois autres paths par config, on identifie le best, on regarde son rang sur le path retenu. Path 0 : moyennes IS = [0,87 ; 0,67 ; 0,63 ; 1,43 ; 0,43]. Best IS = config_3. OOS path 0 = 1,8 = rang 1 sur 5 (haut). Pas overfit. Path 1 : moyennes IS = [0,73 ; 1,07 ; 0,43 ; 1,57 ; 0,40]. Best IS = config_3. OOS path 1 = 1,4 = rang 1 sur 5. Pas overfit. Path 2 : moyennes IS = [0,97 ; 0,80 ; 0,57 ; 1,50 ; 0,50]. Best IS = config_3. OOS path 2 = 1,6 = rang 1. Pas overfit. Path 3 : moyennes IS = [0,83 ; 0,97 ; 0,47 ; 1,60 ; 0,47]. Best IS = config_3. OOS path 3 = 1,3 = rang 1. Pas overfit. PBO = 0/4 = 0. Verdict : sélection cohérente, GO si DSR > 0,95 et MC > 0.
Module 7, biais transversaux, look-ahead, survivorship, execution gap
Section intitulée « Module 7, biais transversaux, look-ahead, survivorship, execution gap »Module en démarche inductive : de l’erreur observée vers la règle.
Objectif. À la fin de ce module, tu sais détecter trois biais transversaux qui peuvent invalider un backtest qui passerait pourtant le module 6.
Look-ahead bias
Section intitulée « Look-ahead bias »[Pour comprendre] Look-ahead bias : le backtest utilise, à l’instant t où il prend une décision, une information qui ne sera connue qu’après t. Cas classique : décider à l’ouverture d’une bougie en utilisant son close (qui n’existe pas encore). Le backtest gagne, le live perd, parce que la machine triche en regardant le futur. Détection systématique : tracer pour chaque feature à l’instant t la date du dernier point qu’elle utilise, vérifier qu’elle est strictement avant t.
Erreur observée. Un quant junior code un signal d’achat sur RSI > 30, calcule le RSI sur la barre courante (close inclus) pour décider l’entrée sur la même barre. Backtest brillant, live catastrophique. À l’instant t où il faut décider, le close de la barre t n’existe pas encore, il sera connu à t+1. Le backtest a utilisé une information du futur.
Règle. Toute feature utilisée à l’instant t doit être strictement disponible avant t. Pour les barres : décider à l’ouverture de la barre t avec les features calculées sur les barres t-1, t-2, etc. Pour les indicateurs roulants : vérifier que min_periods est explicite et que la première observation valide commence strictement après le warm-up.
Détection. NautilusTrader implémente l’invariance temporelle via ts_init et la non-mutabilité des données passées (cf. doc officielle). Gao, Jiang et Yan publient en décembre 2025 sur arxiv une méthode statistique appelée Lookahead Propensity (LAP) pour détecter le look-ahead dans les prédictions LLM (19). Pour les backtests classiques, la détection se fait à la lecture du code : tracer les variables utilisées à chaque instant t et vérifier que leur calcul ne dépend pas de données t+k pour k > 0.
Le KS test mensuel décrit dans M8 constitue le cadre opérationnel de détection d’une dérive de features qui pourrait masquer un look-ahead bias sur données live. Un signal qui marche pendant le backtest mais dérive en distribution à la mise en live est un candidat fort pour le look-ahead masqué.
Survivorship bias
Section intitulée « Survivorship bias »[Pour comprendre] Survivorship bias : ton univers de test ne contient que les actifs qui ont survécu jusqu’à aujourd’hui. Tu rates mécaniquement ceux qui ont disparu (delistings, faillites, projets morts). Effet : tu surestimes la performance moyenne d’une stratégie multi-actifs, parce que tu as filtré a posteriori les perdants extrêmes. Mitigation : reconstituer l’univers d’actifs tel qu’il existait à chaque date du backtest, en incluant les actifs ensuite disparus.
Tester sur les paires actuellement listées sur Binance exclut les centaines de paires délistées depuis 2020 : on sélectionne mécaniquement les survivantes. Règle : reconstituer l’univers à chaque date. Brown, Goetzmann, Ibbotson et Ross 1992 (20) montrent qu’une telle troncature par survie ne se contente pas de gonfler le rendement moyen : elle fabrique une fausse persistance de performance (une “prédictibilité” apparente là où il n’y en a pas). Empiriquement, le biais de survie sur fonds mutuels US se chiffre en points de rendement annuel, de l’ordre de 0,2 à 0,8 pourcent par an dans leurs propres estimations selon la pondération, jusqu’à ~1,5 pourcent par an chez Malkiel 1995 (40). Le mini-cas LUNA/FTT ci-dessous donne l’équivalent crypto.
Mini-cas chiffré, survivorship sur panier crypto 2020-2022
Section intitulée « Mini-cas chiffré, survivorship sur panier crypto 2020-2022 »Pour quantifier la sévérité du biais sur un univers crypto large, prends un panier équipondéré de 10 actifs au 1er janvier 2020 incluant BTC, ETH, et huit altcoins large-caps parmi lesquels LUNA (Terra) et FTT (FTX Token). Sur la période janvier 2020 à décembre 2022, deux événements terminaux dominent. Crash LUNA, mai 2022 : le peg UST est cassé, LUNA perd 99,9 pourcent de sa valeur en quelques jours. Collapse FTX/FTT, novembre 2022 : FTT perd 95 pourcent de sa valeur dans le sillage de la faillite FTX.
Un panier équipondéré 10 actifs, backtesté de janvier 2020 à décembre 2022 sur les 8 survivants (LUNA et FTT exclus de facto car disparus du marché actif), affiche un Sharpe annualisé naïf de l’ordre de 1,2 à 1,4. Le même panier reconstitué avec LUNA (drawdown terminal -99,9 pourcent en mai 2022) et FTT (drawdown terminal -95 pourcent en novembre 2022) intégrés à leurs dates réelles affiche un Sharpe corrigé de l’ordre de 0,7 à 0,9. L’écart de 0,4 à 0,6 est la signature quantifiable du biais survivorship sur un univers crypto 2020-2022.
L’ordre de grandeur va dans le même sens que le biais de survie documenté sur fonds mutuels US par Brown et al. 1992 et Malkiel 1995 (40), même si ces études l’expriment en points de rendement annuel et non en Sharpe : la conversion en ~0,3 à 0,5 de Sharpe ci-dessus est une estimation propre à ce support, fondée sur le mini-cas LUNA/FTT, et non un chiffre tiré tel quel de la littérature. Ce n’est pas un artefact de niche : c’est le coût structurel d’un univers de test qui ignore les disparitions. Pour un panier multi-altcoins crypto 2020-2025 sans reconstitution historique de l’univers, le Sharpe rapporté brut est attendu surestimé d’au moins 0,3 à 0,5 par rapport à un Sharpe survivor-bias-free. Pour un opérateur retail solo qui teste sur l’univers Binance courant 2026, c’est la première correction à appliquer avant tout reporting publiable. Tinsley ne traite pas ce biais dans sa série : sur 22 paires forex majeures, les delistings sont rares et leur impact négligeable. La lacune doctrinale est donc propre au contexte crypto multi-actifs et doit être compensée par Brown et al. 1992 et par une procédure explicite de reconstitution d’univers.
L’asymétrie de disponibilité des données entre crypto et equities est elle-même un biais structurel. Sur les marchés actions, des bases survivor-bias-free existent depuis les années 1990 (CRSP, Bloomberg historical) et permettent une reconstitution rétrospective fiable. Sur crypto, aucun équivalent n’existe à ce jour : reconstruire l’univers historique demande de croiser les annonces officielles Binance, les archives CoinMarketCap et des services payants spécialisés (Kaiko, Coin Metrics). Un retail qui n’investit pas dans ces sources ne peut pas reconstituer fidèlement l’univers 2020-2022 incluant LUNA et FTT. Ce coût d’accès aux données est lui-même une forme de biais structurel propre au crypto retail. À l’opposé, un opérateur qui se limite à BTC et ETH s’affranchit de ce problème : sur ces deux actifs, Binance n’a pas procédé à des delistings, et l’historique depuis 2017 est accessible sans source payante via Binance Vision ou l’API publique.
Sévérité par marché
Section intitulée « Sévérité par marché »La sévérité du biais varie fortement selon l’univers retenu. Pour un trader retail crypto, l’arbitrage entre univers étroit (BTC seul) et univers large (panier 30+ altcoins) est aussi un arbitrage sur la charge méthodologique de reconstitution historique.
| Marché | Sévérité survivorship | Mitigation |
|---|---|---|
| BTC/USDT seul | Mineure | Aucune mesure spécifique nécessaire |
| BTC + ETH | Mineure | Idem |
| Top 5-10 large-caps crypto | Modérée | Inclure les delistings notables (LUNA, FTT) |
| Panier 30+ altcoins | Sévère | Reconstitution historique de l’univers obligatoire |
| Equities long terme | Modérée à sévère | Source survivor-bias-free (par exemple CRSP) |
Execution gap, formule Almgren-Chriss explicite
Section intitulée « Execution gap, formule Almgren-Chriss explicite »[Pour comprendre] Execution gap : écart entre la performance que ton backtest montre et celle que le live livre, attribuable à la réalité de l’exécution (frais payés à l’exchange, slippage entre prix attendu et prix obtenu, latence entre signal et envoi d’ordre, market impact sur le carnet). Un backtest sans modélisation explicite de ces coûts est systématiquement optimiste, souvent de plusieurs points de Sharpe. C’est la première cause d’illusion de profitabilité chez le retail débutant.
Erreur observée. Trades modélisés sur le close de chaque barre, sans frais : Sharpe nominal 2,5. En live, frais Binance taker 0,04 pourcent + slippage moyen 0,05 pourcent par jambe. En comptant un “trade” comme un aller-retour complet (entrée + sortie), chaque jambe payant frais et slippage, le coût par trade est 2 × (0,04 + 0,05) = 0,18 pourcent. Stratégie à 100 trades par mois, soit 1200 trades par an : 1200 × 0,18 pourcent ≈ 216 pourcent de frottement annualisé (≈ 108 pourcent si l’on ne compte que l’aller simple). Bien avant tout signal, le coût d’exécution excède toute performance plausible : Sharpe live très négatif. (taker = ordre qui consomme la liquidité du carnet, classiquement market order. Maker = ordre qui ajoute de la liquidité au carnet, classiquement limit order au meilleur prix. Maker est moins cher que taker chez Binance, mais sans garantie d’exécution.)
Règle. Modéliser explicitement frais, slippage, latence.
Frais Binance 2026 : maker 0,02 pourcent, taker 0,04 pourcent avec BNB activé. Sans BNB : maker 0,1, taker 0,1.
Slippage : 0,02 à 0,10 pourcent par trade pour ordres market sur BTC/USDT et ETH/USDT à tailles retail. Plus élevé sur altcoins moins liquides.
[Pour comprendre] Market impact : déplacement du prix causé par tes propres ordres quand ils consomment la liquidité du carnet. Deux composantes : temporaire (le prix revient après ton ordre, paramètre eta) et permanent (le prix garde une partie du déplacement, paramètre gamma). Pour un retail trader avec ordres inférieurs à 1 % du volume horaire, l’impact est négligeable et la formule Almgren-Chriss n’est pas nécessaire. Au-delà, elle devient indispensable.
Pour des tailles institutionnelles, le market impact se calcule par le modèle Almgren-Chriss (21), publié en 2000 dans le Journal of Risk et formalisé pour les marchés actions par Lehalle et Laruelle dans Market Microstructure in Practice (33). Almgren-Chriss sépare le coût espéré d’exécution et le risque de timing, et la vitesse optimale minimise leur combinaison pondérée par l’aversion au risque λ :
min_T E[Coût] + λ · Var[Coût] E[Coût] = ½ · γ · X² (impact permanent) + η · X² / T (impact temporaire) Var[Coût] = ⅓ · σ² · X² · T (risque de timing)où X est la taille de position à liquider, T la durée de liquidation, σ la volatilité du prix, η le paramètre de market impact temporaire (impact résorbé après l’exécution, croît quand on accélère, d’où le 1/T), γ le paramètre de market impact permanent (empreinte durable proportionnelle au volume total déplacé, indépendante de σ et de T), λ l’aversion au risque. La fonction objectif arbitre, via λ, entre un coût d’exécution espéré et un risque de timing mesuré par la variance : accélérer l’exécution (T petit) réduit le risque de timing mais augmente l’impact temporaire ; ralentir fait l’inverse. Les constantes ½, η et ⅓ valent pour une trajectoire de liquidation uniforme, à titre illustratif ; la trajectoire optimale exacte d’Almgren-Chriss est exponentielle et dépend de λ.
Ordres de grandeur pour BTC perpétuels Binance : pour rendre l’impact comparable entre actifs, on exprime le coût en fonction du taux de participation v = X / (T · V_journalier), fraction du volume journalier capturée par l’opérateur (grandeur sans dimension). Dans cette paramétrisation, le coût temporaire vaut quelques bps à quelques dizaines de bps pour v de l’ordre du pourcent. Ces coefficients sont purement illustratifs et doivent être recalibrés empiriquement sur données crypto réelles : les ordres de grandeur ne valent que pour la paramétrisation retenue, et la calibration numérique brute en X (USD) ci-dessous est volontairement schématique. Le livre Lehalle-Laruelle 2018 traite les marchés actions européens (MiFID) et américains (Reg NMS), pas les perpétuels crypto. Le framework Almgren-Chriss est générique mais les paramètres sont marché-spécifiques. Le taux de participation v (participation rate) est ainsi la variable centrale du market impact pour les perpétuels crypto.
# pseudo-code illustratif Almgren-Chrissimport numpy as np
def almgren_chriss_cost(X, T, sigma, eta, gamma): """ X : taille de position à liquider (en USD) T : durée de liquidation (en heures par exemple) sigma : volatilité du prix (en fraction par unité de temps) eta : coefficient de market impact temporaire gamma : coefficient de market impact permanent Retourne séparément le coût espéré et la variance du coût (risque de timing). Les unités des coefficients sont illustratives et doivent être rendues homogènes à la calibration retenue (voir prose : paramétrisation par taux de participation recommandée pour la crypto). """ permanent = 0.5 * gamma * X ** 2 # impact permanent, indépendant de sigma et T temporary = eta * X ** 2 / T # impact temporaire, explose quand T diminue cost_expected = permanent + temporary timing_risk = (1.0 / 3.0) * sigma ** 2 * X ** 2 * T # VARIANCE du coût (unités coût^2), # PAS un coût à sommer : à arbitrer via une aversion lambda dans E[coût] + lambda*Var[coût] return cost_expected, timing_risk
# Calibration indicative (schématique) BTC perp Binance# X = 100000 USD, T = 1h, sigma = 0.02/h, eta = 5e-6, gamma = 5e-8cost_expected, timing_risk = almgren_chriss_cost(100000, 1, 0.02, 5e-6, 5e-8)print(cost_expected, timing_risk)Encart sur le market impact rampant en stop-hunt. Price discovery autour des clusters de stops : les market makers estiment finement les niveaux agrégés, et le prix “cherche” ces niveaux avant de se retourner. Pour le backtest : si la stratégie place des stops à des niveaux ronds (.00, .50), le backtest au cours de clôture sous-estime l’impact réel. Sur retail Python via API REST Binance, 100 à 500 ms entre signal et exécution suffisent pour subir le déplacement.
Latence : pour une stratégie sub-minute, c’est un facteur critique ; pour une stratégie 1h, c’est négligeable.
Brown et al. 1992 (20), Almgren-Chriss 2000 (21), Lehalle-Laruelle 2018 (33) avec chapitre arXiv libre 1302.4592, Gao-Jiang-Yan 2025 (19), doc NautilusTrader invariance temporelle.
Test d’auto-évaluation, question fermée
Section intitulée « Test d’auto-évaluation, question fermée »Tu reçois en revue un backtest momentum sur 50 paires Binance, trois ans, Sharpe 1,9 net de frais (taker 0,04 pourcent modélisé). PBO = 0,3, DSR = 0,93. Quel biais transversal investigues-tu en priorité avant d’accorder confiance ?
Réponse. Survivorship bias prioritaire (50 paires Binance current ignore les delistées, ordre de grandeur attendu de l’écart : 0,3 à 0,5 de Sharpe à la lumière du mini-cas LUNA/FTT ci-dessus). Look-ahead à vérifier en lecture du code de génération du signal. Slippage à 0 dans la modélisation est suspect : ajouter 0,05 pourcent par trade. Calibrer le market impact via Almgren-Chriss si les tailles dépassent quelques milliers d’USD par trade sur paires illiquides. Si la stratégie résiste à ces quatre corrections, ré-évaluer.
Module 8, outillage 2024-2026, ce que Tinsley ne couvre pas
Section intitulée « Module 8, outillage 2024-2026, ce que Tinsley ne couvre pas »Objectif. Tu sais quels modules ajouter à ta pratique 2026 pour combler les angles morts de la doctrine Tinsley (1992-2018) : régimes, données synthétiques, RL et LLM-agents, drift detection live, cumul emploi-retrait du retail, frameworks open source.
Détection de régime
Section intitulée « Détection de régime »[Pour comprendre] Régime de marché : phase où le marché présente des propriétés statistiques homogènes (tendance haussière, baissière, range, volatilité haute ou basse). Une stratégie peut très bien marcher dans un régime et casser dans un autre. Une stratégie qui ne marche que dans un régime particulier est dite régime-dépendante. Le risque caché d’un backtest sur un seul régime est de confondre edge réel avec spécialisation chanceuse à une phase de marché.
Tinsley évoque les régimes (vidéo 12) sans formalisme statistique. Hamilton publie en 1989 dans Econometrica (22) le cadre Markov-switching qui modélise les régimes comme états discrets non observés d’une chaîne de Markov. Le filtre de Hamilton (récursion forward) estime à chaque instant la probabilité filtrée de chaque régime, à partir des seules observations disponibles jusqu’à t : c’est cette estimation, et elle seule, qui est utilisable en live. Un lissage a posteriori (algorithme de Kim 1994, passe backward) affine ces probabilités en exploitant aussi les observations postérieures à t ; comme il regarde le futur, il introduit un look-ahead et ne doit servir qu’en analyse rétrospective, jamais pour décider en live. Pour un backtest 5 ans crypto qui traverse plusieurs régimes (bull 2020-2021, bear 2022, ranging 2023, bull 2024, vol high octobre 2025), segmenter les WFA ou CPCV par régime, détecté avec les probabilités filtrées et non lissées, révèle si l’edge est uniforme ou régime-dépendant.
Données synthétiques
Section intitulée « Données synthétiques »L’historique crypto exploitable est court. BTC pré-2016 est sur des marchés peu liquides et structurellement différents des marchés actuels. ETH pré-2017 idem. Beaucoup d’altcoins n’ont que 3 à 5 ans d’historique propre. Pour un backtest qui demande 2500 trades minimum par puissance statistique (cf. M2), augmenter le sample size par génération synthétique est une option méthodologique de premier plan, distincte des trois leviers Tinsley (durée, multi-symbol, multi-timeframe).
Wiese, Knobloch, Korn et Kretschmer publient en 2019 sur arxiv Quant GANs (23), première architecture documentée à reproduire fidèlement les propriétés stylisées des séries financières : volatility clustering, heavy tails, autocorrélations en valeur absolue. Le coeur technique est un Temporal Convolutional Network (TCN) inséré dans le générateur d’un GAN classique, entraîné sur séries journalières. Signal de fiabilité : peer review obtenu (version étendue Quantitative Finance 2020).
Lu et al. publient en 2024 sur arxiv (24) une extension aux modèles de diffusion sur séries crypto intraday. Le diffusion model surpasse les GAN sur les métriques de distribution à queue épaisse, ce qui en fait un candidat sérieux pour augmenter un sample size de stratégies sensibles aux queues (mean reversion volatile, courte gamma). Signal faible : preprint arXiv, peer review non confirmé.
Le CFA Institute publie en 2025 Synthetic Data in Investment Management (25), rapport de la Research Foundation qui synthétise l’état de l’art institutionnel : backtesting sur historique court, stress test hors distribution, augmentation pour ML supervisé. Niveau institutionnel.
Limite structurelle : un modèle génératif ne peut produire que ce qui est dans la distribution d’entraînement. Un Quant GAN entraîné sur BTC 2017-2021 ne peut pas générer un crash LUNA de mai 2022 ni un effondrement FTT de novembre 2022 absents de son train set. Ce point relie M8 à M7 : les données synthétiques n’absolvent pas le biais survivorship et ne reproduisent pas les régimes de queue non vus. Recommandation : utiliser le synthétique pour étoffer le sample size sur régimes typiques, jamais pour évaluer la robustesse aux régimes de stress non vus.
Drift detection live, pseudo-code KS test mensuel
Section intitulée « Drift detection live, pseudo-code KS test mensuel »[Pour comprendre] Drift detection : surveillance automatique en production de la dérive entre la distribution des données que ta stratégie a apprise (training) et celle qu’elle voit en live. Si la dérive est significative, le modèle calibré sur le passé n’est plus pertinent : régime nouveau, microstructure changée, ou look-ahead masqué qui ne se voit qu’en live. Outil de base : test de Kolmogorov-Smirnov mensuel sur chaque feature critique. Déclenche une alerte si la p-value passe sous un seuil (typiquement 0,01 avec correction Bonferroni pour la multiplicité des features). Mais la p-value seule ne suffit pas : voir ci-dessous (sous le pseudo-code) pourquoi il faut exiger en plus un seuil sur la taille d’effet.
Tinsley parle de pre-live optimization sans mécanisme de monitoring en production. Hinder et al. publient en 2024 sur arxiv un papier sur les attaques adversariales contre les détecteurs de drift (28). Pal et al. en 2020 décrivent le pattern Uber d’adversarial validation (29). Pour un retail solo, implémenter au minimum un KS test mensuel sur les distributions de features. (KS test = test non paramétrique qui compare deux distributions empiriques sans supposer leur forme. Il sort une statistique de distance D, l’écart maximal en valeur absolue entre les deux fonctions de répartition empiriques (dite distance de Kolmogorov), et une p-value. Standard en monitoring ML : rapide et sans hypothèse de loi.)
# pseudo-code illustratif drift detectionimport numpy as npimport pandas as pdfrom scipy import stats
def drift_alert(features_train, features_live, p_threshold=0.01, bonferroni=True): """ features_train : DataFrame des features sur la fenêtre d'entraînement features_live : DataFrame des features sur la fenêtre live récente p_threshold : seuil opérationnel recommandé 0.01 bonferroni : applique Bonferroni si plusieurs features testées """ n_features = features_train.shape[1] threshold = p_threshold / n_features if bonferroni else p_threshold alerts = {} for col in features_train.columns: ks_stat, p_value = stats.ks_2samp( features_train[col].dropna(), features_live[col].dropna() ) if p_value < threshold: alerts[col] = {'ks_stat': ks_stat, 'p_value': p_value} return alerts
# Usage : surveiller rendement journalier, volatilité 20j, range quotidien# entre fenêtre training et fenêtre live récente (typiquement 30 jours).Le seuil 0,01 est le seuil opérationnel recommandé. Pour 3 features en parallèle, une correction de Bonferroni (seuil divisé par n_features, ici 0,01/3 ≈ 0,003) est préférable pour éviter les faux positifs ; Bonferroni corrige la multiplicité entre features, rien d’autre. Deux précautions distinctes s’ajoutent. (1) La p-value du KS dépend fortement de la taille des fenêtres : avec une fenêtre live courte (ici ~30 points journaliers) la puissance est faible et un vrai drift modéré peut passer inaperçu (faux négatif), exactement le risque de puissance vu au Module 2 ; à l’inverse, une grande fenêtre rend significatif un écart économiquement négligeable. Cette dépendance à la taille d’échantillon est un problème séparé de la multiplicité, et Bonferroni ne la corrige pas. (2) Ne jamais déclencher sur la seule p-value : exiger aussi que la statistique KS elle-même (la taille d’effet, déjà calculée dans ks_stat par le pseudo-code ci-dessus) dépasse un seuil minimal, par exemple D > 0,1 à 0,2, pour ne réagir qu’aux dérives matérielles.
Cumul emploi-retrait du retail
Section intitulée « Cumul emploi-retrait du retail »Une particularité opérationnelle du quant retail solo qui n’apparaît pas chez Tinsley (orienté trader plein temps) ni chez López de Prado (orienté institutionnel) : le cumul d’une stratégie live avec une activité professionnelle principale. Le trader ne peut pas monitorer en continu. Trois mécanismes compensatoires sont à mettre en place avant tout passage en live.
Kill-switch automatique. Seuil de drawdown maximum tolérable défini ex ante, typiquement 15 à 20 pourcent sur le capital alloué. Au dépassement, arrêt automatique des positions ouvertes et suspension des entrées, sans intervention manuelle. Un retail en emploi ne peut pas garantir une réponse sous une heure à une alerte ; le kill-switch remplace la supervision humaine. Implémentation : job cron horaire qui calcule le drawdown depuis le high-water mark et déclenche la fermeture API si le seuil est franchi.
Rebalancing trimestriel. Re-optimisation des paramètres tous les 90 jours sur fenêtre glissante, mêmes paramètres d’optimisation que ceux validés en CPCV initial. Les régimes crypto changent vite (cycles 2020-2025), une stratégie figée dérive ; un re-fit mensuel serait trop sensible au bruit. Documenter chaque re-fit : paramètres entrants, sortants, distribution OOS post-fit.
Audit de drift mensuel. KS test mensuel comme prescrit ci-dessus. Seuil : p-value < 0,01 sur 30 derniers jours de trades, correction Bonferroni si plusieurs features. Si alerte déclenchée, suspendre immédiatement, exécuter un re-fit hors cycle, re-valider en paper trade quatre semaines avant redéploiement.
Le triplet kill-switch + rebalancing + audit drift est le minimum opérationnel pour un retail en cumul emploi-retrait. Aucune de ces mécaniques ne se substitue à la validation statistique amont (M6) ; elles complètent le déploiement d’une stratégie déjà validée.
Monte Carlo bootstrap des trades
Section intitulée « Monte Carlo bootstrap des trades »[Pour comprendre] Monte Carlo bootstrap des trades : technique de stress-test qui ré-échantillonne avec remise tes trades historiques pour générer des milliers de séquences alternatives plausibles. Au lieu de juger ta stratégie sur la seule chronologie réellement observée, tu juges sur la distribution des compositions possibles. Critère opérationnel : si même le 5e percentile des Sharpes ré-échantillonnés reste positif, l’edge n’est pas porté par une poignée de trades exceptionnels et résiste à l’incertitude d’échantillonnage. Si non, ton edge dépend trop de quelques trades. Le bootstrap avec remise casse certes la séquence, mais le Sharpe per-trade annualisé calculé ici (moyenne / écart-type × racine(trades_per_year)) est invariant à l’ordre : ce qu’il teste est donc la sensibilité à la COMPOSITION de l’échantillon, pas à son ordre, et il suppose des trades approximativement indépendants. La sensibilité à l’ordre chronologique, elle, est path-dependent et se lit sur la distribution du max drawdown (idéalement via une permutation sans remise de la courbe d’equity).
# pseudo-code illustratif bootstrap trade-levelimport numpy as np
def mc_bootstrap_trades(trade_returns, n_resamples=10000, seed=42, trades_per_year=None): """ trade_returns : array des rendements (log) PAR trade, pas journaliers. n_resamples : nombre de réplications. trades_per_year : nombre moyen de trades par an, REQUIS. Sert à annualiser le Sharpe per-trade par sqrt(trades_per_year). ATTENTION : renseigner le nombre de trades par an réellement réalisés (ex. ~1200 pour 100 trades/mois), et NON 252 (jours de bourse actions) ni 365 (jours crypto), qui ne s'appliquent qu'à un Sharpe calculé sur rendements journaliers. 252 n'est correct que dans le cas particulier d'exactement un trade par jour ouvré. Estimer trades_per_year = n_trades_historiques / annees_de_track. Approximation IID : ignore l'autocorrélation des rendements (cf. Lo 2002, M5). """ if trades_per_year is None: raise ValueError( "trades_per_year requis : un Sharpe per-trade s'annualise en " "sqrt(trades par an), pas sqrt(252)." ) rng = np.random.default_rng(seed) n = len(trade_returns) sharpes = np.empty(n_resamples) for i in range(n_resamples): sample = rng.choice(trade_returns, size=n, replace=True) sharpes[i] = sample.mean() / sample.std(ddof=1) * np.sqrt(trades_per_year) return sharpesCritère de passage : 5e percentile des Sharpes positif. Calculer également le 95e percentile du max drawdown pour valider que le pire scénario reste tolérable par l’opérateur.
Frameworks open source 2026
Section intitulée « Frameworks open source 2026 »| Framework | Cas d’usage | Throughput / fidélité exécution | Courbe d’apprentissage |
|---|---|---|---|
| NautilusTrader | Crypto live + backtest invariant | Haute fidélité tick-level, gestion ordres | Élevée (C++ bindings, architecture event-driven) |
| VectorBT Pro | Exploration vectorisée rapide | Throughput extrême, fidélité exécution limitée | Modérée (pandas vectorisé) |
| Backtesting.py | Prototypage rapide stratégies simples | Faible throughput, OK pour signaux journaliers | Faible (quelques heures) |
| Lean / QuantConnect | Backtest multi-actifs institutionnel | Bonne fidélité, écosystème C#+Python | Élevée (infra cloud) |
| Jesse | Crypto uniquement, algo simple | Fidélité correcte, pas tick-level | Modérée (Python pur) |
Backtrader n’est plus maintenu activement depuis 2021 et n’est pas recommandé pour nouveaux projets 2026. Pour un quant junior 2026, point de départ : Backtesting.py pour apprendre, VectorBT Pro pour passer à l’échelle, NautilusTrader pour la production live.
Reinforcement Learning trading
Section intitulée « Reinforcement Learning trading »Famille technique 2023-2026, absente de Tinsley. Méta-revue Hoque, Ferdaus, Hassan 2025 sur arxiv (26) couvre 167 articles. Frameworks de référence : FinRL et FinRL-Meta. Algorithmes dominants : PPO baseline, SAC pour signal noisy.
Verdict critique aligné sur LLM-agents. La quasi-totalité des papers RL trading couvre moins de 18 mois d’évaluation hors backtest de développement, sans multi-symbol walk-forward, sans PBO ni DSR sur les agents entraînés. Le RL trading 2024-2026 est dans la même position méthodologique que les LLM-agents : signaux faibles techniques intéressants, signaux faibles méthodologiquement immatures au regard des critères PBO et DSR de cette formation. Un agent PPO avec Sharpe walk-forward 1,95 documenté (méta-revue) demande une déflation par le nombre d’hyperparamètres testés et un PBO via CPCV pour être validé.
LLM-augmented trading systems
Section intitulée « LLM-augmented trading systems »Famille 2024-2026. TradingAgents (Xiao et al. 2024 arxiv 2412.20138) (27), QuantAgent (Xiong et al. 2025), multi-agent crypto (Luo et al. 2025), Adaptive Bitcoin (Singhi 2025), FinGPT (Yang et al. 2023), hybride LLM+DRL (Mohanlal et al. 2025 dans Big Data and Cognitive Computing). Tous ces papiers souffrent du même défaut : échantillon test trop court (7 à 18 mois), pas de PBO ni DSR, pas de WFA multi-stage. Verdict : signaux faibles techniquement intéressants, signaux faibles méthodologiquement immatures.
Synthèse opérationnelle
Section intitulée « Synthèse opérationnelle »Le triplet à viser en 2026 pour un backtest publiable :
- WFA Pardo 6-stages sliding ou CPCV López de Prado 10/2 avec embargo pour la validation hors échantillon.
- Monte Carlo bootstrap trade-level (10 000 réplications) pour la robustesse à l’incertitude d’estimation par ré-échantillonnage avec remise des trades (le 5e percentile du Sharpe simulé borne l’erreur d’estimation due à la composition de l’échantillon), complété par le 95e percentile du max drawdown qui capture l’exposition aux séquences de pertes défavorables. Une vraie sensibilité à l’ordre chronologique relèverait d’un test de permutation (tirage sans remise) ; un Sharpe per-trade y serait de toute façon invariant, seules les métriques path-dependent comme le max drawdown y réagissent.
- Deflated Sharpe Ratio (DSR) > 0,95 comme critère statistique principal, complété par PBO < 0,5 et 5e percentile MC > 0.
Pour la version condensée de la doctrine López de Prado destinée aux praticiens institutionnels qui n’ont pas le temps de lire les 400 pages d’Advances, consulter Machine Learning for Asset Managers publié en 2020 chez Cambridge University Press dans la collection Cambridge Elements (31). Le format essai (141 pages) couvre CPCV, DSR, PBO, triple-barrier, et meta-labeling en doctrine condensée.
Test d’auto-évaluation, question ouverte sans réponse type (Interactive)
Section intitulée « Test d’auto-évaluation, question ouverte sans réponse type (Interactive) »Tu prépares une mission de conseil pour un family office qui possède 5 millions USD à allouer à une stratégie quant crypto sur 18 mois de track record. Le family office te propose de déléguer entièrement la sélection de signal à un agent RL entraîné en LLM+DRL hybride sur 12 mois de données 2024-2025. Quels arguments présentes-tu pour accepter, refuser, ou conditionner ta participation ? Construis ta réponse en t’appuyant sur les modules 1 à 8 de cette formation. Pas de réponse type fournie : la question est volontairement ouverte pour activer un raisonnement intégrateur Interactive au sens de Chi et Wylie (cf. ICAP).
Trois positions argumentaires (spectre de référence, sans réponse type)
- Position 1, accepter sous conditions : DSR > 0,95 requis avant déploiement live, paper trade 4 à 8 semaines obligatoire sur capital virtuel équivalent, kill-switch automatique à -15 pourcent de drawdown, audit trimestriel WFA rolling sur les 6 derniers mois. L’argument clé : 18 mois peuvent être suffisants si le protocole de validation inclut CPCV multi-stage et DSR déflaté par le nombre de configurations testées.
- Position 2, refuser : 18 mois est insuffisant pour un déploiement à 5 millions USD. La doctrine Bailey-LdP recommande un historique permettant au moins 3 cycles de validation WFA indépendants. Un seul cycle sur 18 mois ne satisfait pas ce critère. Recommandation : attendre 36 mois de track record, ajouter walk-forward multi-stage et PBO avant révision.
- Position 3, contre-proposition graduelle : allocation initiale de 500 000 USD (10 pourcent du capital), scaling conditionnel à la performance live sur 6 mois (Sharpe rolling > 1,0, drawdown < 10 pourcent), révision à 6 mois avec possibilité de montée à 2 millions USD si conditions satisfaites. L’argument clé : limiter l’exposition pendant la phase de validation live réduit le coût d’une erreur de sur-ajustement non détectée.
Ces trois positions ne sont pas hiérarchisées. Le lecteur compare sa propre analyse à chacune.
Checklist d’audit avant déploiement live
Section intitulée « Checklist d’audit avant déploiement live »Copie-colle cette checklist. Coche item par item avant chaque mise en production. Si plus de 3 items sont KO, retour en R&D obligatoire.
mindmap
root((Checklist<br/>audit<br/>backtest))
Conception
Mécanisme justifié
Sample size estimé a priori
Seuils ex ante
Optimisation
WFA ou CPCV
Sliding pas anchored
Max 3 params
Métriques
Sharpe déflaté
Sizing aligné
Régimes séparés
Validation
DSR > 0.95
PBO < 0.5
MC bootstrap
Biais
Look-ahead
Survivorship
Execution gap
Live
Drift detection
Kill-switch
Re-fit cadence
- Le mécanisme de la stratégie est-il justifié par une intuition économique ou microstructurelle claire, formulée en 3 à 5 phrases ?
- Le sample size minimum a-t-il été estimé a priori (Cohen) en fonction de l’edge présumé et de la puissance cible ?
- Les seuils d’acceptation (DSR, PBO, Sortino, Calmar, 5e percentile MC) ont-ils été décidés avant le backtest, pas après ?
- Le walk-forward est-il sliding (préféré crypto) ou anchored (justifié explicitement) ?
- Le nombre de paramètres optimisés est-il inférieur ou égal à 3 (limite Tinsley), ou justifié au-delà avec CPCV strict ?
- Le ratio in-sample / out-of-sample est-il entre 3:1 et 6:1 ?
- Le Sharpe rapporté est-il déflaté (DSR) avec le nombre de configurations testées explicitement déclaré ?
- Le sizing utilisé est-il aligné avec la métrique optimisée (cf. table) ?
- Les performances par régime (bull, bear, ranging, vol high) ont-elles été tracées séparément ?
- Le DSR de la stratégie retenue est-il strictement supérieur à 0,95 ?
- Le PBO calculé via CPCV est-il strictement inférieur à 0,5 ?
- Un Monte Carlo bootstrap des trades (10 000 réplications minimum) a-t-il été exécuté, et le 5e percentile du Sharpe est-il positif ?
- Le look-ahead bias a-t-il été audité ligne par ligne sur le code de génération de signal ?
- Pour un univers multi-actifs, l’univers historique a-t-il été reconstitué à chaque date (pas l’univers final) ?
- Frais (maker 0,02 pourcent + taker 0,04 pourcent Binance avec BNB) et slippage (0,02 à 0,10 pourcent par trade) sont-ils modélisés ?
- Si les tailles d’ordres dépassent le seuil retail, le market impact Almgren-Chriss a-t-il été calibré sur données crypto ?
- Une mécanique de drift detection (KS test mensuel sur features critiques avec correction Bonferroni) est-elle prête à être déployée en parallèle du live ?
- Un kill-switch automatique est-il défini (drawdown maximum tolérable avant arrêt) ?
Glossaire
Section intitulée « Glossaire »Termes techniques mobilisés dans cette formation, classés alphabétiquement. La référence entre parenthèses renvoie à la bibliographie Vancouver finale et au module où le concept est développé.
Almgren-Chriss (modèle de) — Modèle d’exécution optimale qui, pour liquider une position de taille X sur une durée T, arbitre le coût d’impact contre le risque de prix d’une exécution lente, en minimisant E[Coût] + λ·V[Coût]. Trois paramètres distincts : l’impact temporaire (η, résorbé après l’ordre, croît quand on accélère), l’impact permanent (γ, empreinte durable, indépendante de la vitesse et de σ) et l’aversion au risque (λ, qui pondère le risque temporel, croissant avec T). Compromis central : accélérer réduit le risque de prix mais augmente l’impact temporaire. Attention à la collision de notation fréquente : l’aversion au risque (notée ici λ, parfois γ ailleurs) et l’impact permanent sont deux grandeurs distinctes à calibrer séparément. Formule détaillée et sens de chaque terme : voir M7, sources (21) Almgren-Chriss 2000 et (33) Lehalle-Laruelle 2018.
Anchored (walk-forward) — Variante de WFA où la fenêtre in-sample garde son début fixe et s’allonge à chaque pas, par opposition à sliding qui décale début et fin simultanément. Tinsley vidéo 38 classe anchored en anti-pattern car il dilue les régimes anciens dans l’IS et rend la calibration moins réactive. Voir M4.
Bonferroni (correction de) — Ajustement multi-testing qui contrôle le family-wise error rate (FWER) en divisant le seuil de significativité α par le nombre total de tests effectués n_tests. Pour 3 features surveillées en parallèle avec α=0,01, le seuil corrigé devient α/3 ≈ 0,0033. Reposant sur l’inégalité de Boole (union bound), il reste valable quelle que soit la structure de dépendance entre les tests, c’est sa force, contrairement à la correction de Šidák (1 − (1−α)^(1/n)) qui suppose l’indépendance. Revers : conservatif et de plus en plus strict quand n augmente, surtout si les tests sont corrélés, d’où les raffinements correction-aware (Harvey-Liu, nombre effectif de tests). Voir M8 sous-section drift detection.
CAGR/Max DD — Ratio Compound Annual Growth Rate divisé par Maximum Drawdown. Métrique de performance ajustée du risque privilégiée pour stratégies à exposition variable. Voir M5 table Tinsley.
CAGR/Mean DD — Variante CAGR rapporté à drawdown moyen plutôt qu’à drawdown maximum. Moins sensible aux outliers de risque. Voir M5. ↩
Calmar (ratio de) — Synonyme courant de CAGR/Max DD dans la littérature praticien. Voir M5.
CPCV (Combinatorial Purged Cross-Validation) — Méthode de validation introduite par López de Prado 2018 chapitre 12.4. Génère N chemins out-of-sample par combinaisons de folds avec purging (suppression des points en chevauchement temporel) et embargo (zone tampon entre IS et OOS). Étend WFA en quantifiant plusieurs trajectoires plutôt qu’une seule. Implémentée dans mlfinlab via CombinatorialPurgedKFold. Voir M6, source (16) López de Prado 2018. ↩
CSCV (Combinatorially Symmetric Cross-Validation) — Procédure spécifique au calcul du PBO, distincte de CPCV. Définie par Bailey-Borwein-LdP-Zhu 2014 et 2016. mlfinlab n’implémente pas CSCV (issue GitHub #382, ouverte 2020, non résolue) ; pour PBO via CSCV rigoureux, voir pypbo ou implémentation directe depuis Bailey 2014. Voir M6, sources (7) (8).
Curve fitting — Synonyme praticien d’overfitting paramétrique. Désigne l’ajustement d’une stratégie à des particularités locales du backtest qui ne se reproduiront pas en live. Voir M3.
Drawdown (DD) — Perte maximale entre un sommet d’equity curve et le creux qui suit. Maximum Drawdown = pire DD historique. Mean Drawdown = moyenne des DD significatifs. Voir M5 et checklist. ↩
Drift detection — Surveillance statistique de la dérive des distributions de features entre fenêtre training et fenêtre live, par KS test mensuel avec correction Bonferroni (seuil opérationnel p < 0,01). Détecte les changements de régime non anticipés par le modèle. Voir M8 sous-section drift detection, sources (28) (29). ↩
DSR (Deflated Sharpe Ratio) — Probabilité (dans [0,1]) que le vrai Sharpe dépasse, non pas zéro, mais le Sharpe maximum attendu par pur hasard sous H0 d’absence d’edge sur les N configurations testées (correction du multiple testing), tout en tenant compte de la skewness et de la kurtosis non normales des rendements. Critère opérationnel : DSR > 0,95 avant déploiement. Détail de la formule et de sr_max_expected en M5/M6, source (4) Bailey-LdP 2014. ↩
Edge — Avantage statistique d’une stratégie sur le hasard, mesuré par l’expectancy (espérance de gain par trade ; lorsque chaque trade est normalisé par son risque initial R, l’expectancy est exactement la moyenne des R-multiples) ou par le Sharpe attendu. Distinction fondatrice edge réel vs illusion stochastique (queue droite chanceuse d’un échantillon de stratégies aléatoires). Voir M1. ↩
Embargo (CPCV) — Zone tampon temporelle entre fenêtre training et fenêtre test dans CPCV, exprimée en pourcentage de la longueur totale (ex. embargo 1 pourcent). Évite la fuite d’information par autocorrélation de séries financières. Voir M4 et M6.
Equity curve — Courbe cumulative du capital au fil des trades. Coefficient R² de l’equity curve sur droite de régression linéaire = mesure de régularité du gain. Voir M5.
Execution gap — Écart entre performance backtest et performance live attribuable à l’exécution réelle (frais, slippage, latence, market impact). Modélisé via Almgren-Chriss pour tailles institutionnelles. Voir M7. ↩
Expectancy — Espérance mathématique du gain par trade : (% winners × avg win) − (% losers × avg loss). Concept Van Tharp. Voir M5. ↩
FTT (FTX Token) — Token natif de l’exchange FTX qui a perdu 95 pourcent de sa valeur en novembre 2022 (collapse FTX). Cas paradigmatique du survivorship bias en crypto multi-actifs. Voir M7 mini-cas chiffré. ↩
In-sample (IS) / Out-of-sample (OOS) — Découpage temporel d’un backtest : IS sert à l’optimisation paramétrique, OOS sert à la validation hors échantillon. Ratio recommandé 3:1 à 6:1 (Pardo 2008). Voir M4.
Interleaving — Technique d’apprentissage à haute utilité (Dunlosky 2013) : croiser plusieurs sujets ou modules dans un même exercice pour forcer la discrimination conceptuelle. Voir préambule. ↩
Kelly (fraction de) — Fraction du capital à risquer qui maximise l’espérance du taux de croissance géométrique du capital (espérance du log-rendement, à long terme), fonction de la probabilité de gain ET du ratio gain/perte attendus, et non du seul ratio. En pratique : Kelly fractionnel (1/4 ou 1/2 Kelly) pour réduire la variance et les drawdowns, le full-Kelly étant très volatil (drawdowns profonds). À ne pas confondre avec un sizing maximisant le Sharpe : Kelly maximise la croissance log, pas le critère moyenne-variance, et les deux ne coïncident pas en général. Voir M5.
Kill-switch — Mécanisme d’arrêt automatique d’une stratégie live au franchissement d’un seuil de drawdown maximum tolérable (typiquement -15 à -20 pourcent). Remplace la supervision manuelle pour retail en emploi. Voir M8 sous-section cumul emploi-retrait. ↩
KS test (Kolmogorov-Smirnov à deux échantillons) — Test statistique non paramétrique comparant deux distributions empiriques. Cœur du drift detection sur features de marché. Implémenté via scipy.stats.ks_2samp. Voir M8.
Latence — Délai entre génération du signal et exécution effective de l’ordre. Pour retail Python via API REST Binance : 100 à 500 ms. Critique pour stratégies sub-minute, négligeable pour stratégies 1h. Voir M7. ↩
Look-ahead bias — Utilisation d’une information du futur (typiquement le close de la barre courante) pour décider à l’ouverture de cette même barre. Erreur de codage classique. Détection par lecture du code et invariance temporelle (NautilusTrader ts_init). Voir M7, source (19). ↩
LUNA (Terra) — Cryptomonnaie dont le peg algorithmique UST s’est cassé en mai 2022, entraînant une chute LUNA de 99,9 pourcent en quelques jours. Avec FTT : cas paradigmatique du survivorship bias. Voir M7 mini-cas chiffré. ↩
MC bootstrap (Monte Carlo bootstrap des trades) — Stress-test par ré-échantillonnage avec remise des trades historiques (typiquement 10 000 réplications). Critère opérationnel : 5e percentile du Sharpe > 0. Voir M6 et M8.
Market impact — Effet de la propre activité de trading sur le prix. Décomposé en impact temporaire (η Almgren-Chriss) et impact permanent (γ). Variante pernicieuse : market impact rampant en stop-hunt (price discovery autour des clusters de stops à niveaux ronds). Voir M7. ↩
Multiple testing — Problème statistique : tester N hypothèses simultanément inflate la probabilité d’au moins un faux positif. En backtest : tester 50 configurations sur 4 ans biaise positivement le Sharpe de la meilleure configuration retenue. Corrections : Bonferroni, DSR, PBO. Voir M2, M5, M6, source (6). ↩
Normalized Profit Factor — Variante du Profit Factor standard (somme des gains / somme des pertes) ajustée pour neutraliser l’effet du nombre de trades. Permet comparaison entre stratégies de fréquences différentes. Voir M5 table Tinsley.
OOS — Voir In-sample. ↩
Overfitting score (Tinsley) — Heuristique de Tinsley vidéo 14 : (somme des magnitudes absolues des PnL du top 1 pourcent des trades / somme des magnitudes absolues de tous les trades) × 100 ; ce qui équivaut au facteur par lequel un trade moyen du top 1 pourcent pèse plus que le trade moyen global. Sans dimension, indépendant du nombre de trades. Seuil empirique de Tinsley : score > 12 = suspecter events overfitting. Quick screen mono-config, complémentaire de PBO formel. À ne pas confondre avec la contribution à la PnL totale (M3), qui est une part de PnL nette bornée à 1, de seuil 30-40 pourcent. Voir M3.
Paper trade — Exécution simulée en conditions réelles de marché (prix live, frais réels modélisés), sans capital réel engagé. Phase de validation typique : 4 à 8 semaines avant déploiement live. Voir checklist.
PBO (Probability of Backtest Overfitting) — Probabilité que la configuration la mieux classée in-sample obtienne une performance out-of-sample inférieure à la médiane des performances OOS de l’ensemble des N candidates (i.e. que la sélection sur l’IS ne fasse pas mieux que le hasard en OOS). Calcul via Combinatorial Symmetric Cross-Validation (CSCV), Bailey-Borwein-LdP-Zhu 2014 et 2016. Critère opérationnel : PBO < 0,5. Voir M3 et M6, sources (7) (8). ↩
Practice testing — Technique à haute utilité (Dunlosky 2013) : se tester activement plutôt que relire passivement. Application : refaire les quizz à J+1, J+7, J+30. Voir préambule. ↩
Profit Factor — Somme des gains bruts divisée par somme des pertes brutes. Métrique simple mais sensible au nombre de trades : à comparer à sa version normalisée. Voir M5.
PSR (Probabilistic Sharpe Ratio) — Précurseur du DSR (DSR = PSR + correction multiple testing). Probabilité que le vrai Sharpe dépasse un Sharpe de référence, en corrigeant pour la skewness et la kurtosis non normales et en tenant compte de la taille de l’échantillon (Bailey-LdP 2012), sans correction multiple testing. Sortie dans [0,1], pas un ratio. Voir M5, source (13).
Purging — Suppression des points d’entraînement chevauchant temporellement avec la fenêtre test. Évite la fuite d’information par labels serially dependent. Composante essentielle de CPCV. Voir M6.
Pypbo — Bibliothèque Python open source implémentant le PBO via CSCV stricto sensu. Alternative à mlfinlab qui n’implémente pas CSCV. URL : https://github.com/esvhd/pypbo. Voir M6.
R-multiples — Unité de mesure de performance trade-par-trade introduite par Van Tharp. 1R = risque initial accepté à l’entrée (typiquement distance stop-loss). Un trade qui rapporte 3R = 3 fois le risque initial. Voir M5, source (14). ↩
Re-fit cadence — Fréquence de ré-optimisation des paramètres d’une stratégie en production. Typiquement trimestriel pour stratégies horaires crypto (compromis entre adaptation aux régimes et stabilité statistique). Voir M8.
Recovery factor — Net profit total divisé par drawdown maximum. Métrique simple de capacité d’une stratégie à compenser ses pertes. Voir M5.
Régime (de marché) — Phase persistante du marché caractérisée par un comportement statistique homogène : bull, bear, ranging, volatilité haute. Détection formalisée par Hamilton 1989 (Markov-switching). Voir M8, source (22).
SQN (System Quality Number) — Métrique Van Tharp : √min(N, 100) × moyenne(R) / écart-type(R), avec N le nombre de trades. Le facteur √N plafonne N à 100 (au-delà, un système est jugé statistiquement significatif et le multiplicateur reste √100 = 10), pour mesurer la qualité de l’edge et non la quantité de trades. Combine edge et régularité. Voir M5, source (14). ↩
Sharpe brut (nominal) — Sharpe calculé directement sur la série de rendements, sans correction multiple testing ni non-normalité. À ne jamais utiliser seul pour valider une stratégie optimisée parmi N candidates. Voir M5.
Sharpe corrigé (déflaté) — Voir DSR.
Sharpe ratio — Rendement excédentaire moyen divisé par écart-type des rendements, annualisé. Métrique de référence ajustée du risque. Limites documentées par Lo 2002 (autocorrélation, non-IID). Voir M5, source (12). ↩
Sizing (position sizing) — Détermination de la taille de position par trade. Fixed (constant) ou variable (Kelly, ATR-based, percent risk). Doit être aligné avec la métrique optimisée. Voir M5, source (15).
Sliding (walk-forward) — Variante de WFA où la fenêtre IS garde sa longueur constante et se décale en bloc. Préférée par Tinsley pour crypto (réactivité aux régimes récents). Opposée à anchored. Voir M4.
Slippage — Différence entre prix attendu (close de barre, prix mid) et prix d’exécution réel. Ordres market BTC/USDT et ETH/USDT à taille retail : 0,02 à 0,10 pourcent par trade typique. Voir M7. ↩
Sortino (ratio de) — Variante du Sharpe dont le dénominateur est la downside deviation : on ne pénalise que la volatilité à la baisse. Précisément : racine de la moyenne des carrés des écarts sous un seuil cible (MAR, souvent 0 ou le taux sans risque), les rendements au-dessus du seuil comptant comme nuls et la moyenne étant calculée sur toutes les observations (pas seulement les négatives). Privilégié pour stratégies asymétriques (skew négatif). Voir M5.
Stop-hunt — Mouvement de prix orchestré par les market makers vers des niveaux où sont concentrés des stop-loss retail (niveaux ronds : .00, .50). Producteur de market impact rampant sous-estimé en backtest. Voir M7.
Survivorship bias — Biais introduit par la sélection d’un univers d’actifs encore actifs au moment du backtest, excluant mécaniquement les actifs delistés ou disparus. Signature quantifiable en crypto multi-actifs : écart Sharpe naïf vs corrigé de 0,4 à 0,6 sur panier 10 actifs 2020-2022 incluant LUNA et FTT. Voir M7, source (20). ↩
Triple-barrier — Méthode de labellisation des trades introduite par López de Prado 2018 : trois barrières simultanées (take-profit, stop-loss, expiration temporelle) déterminent l’issue du trade. Voir M6, source (16).
WFA (Walk-Forward Analysis) — Protocole d’optimisation robuste de Pardo 1992 : alternance de fenêtres IS pour optimisation et OOS pour validation, en avançant pas à pas dans le temps. Multi-stage (6 étapes typique). Sliding ou anchored. Voir M4, source (10).
Bibliographie
Section intitulée « Bibliographie »(1) Tinsley M. Algorithmic Backtesting and Optimization Series, 54 vidéos. Darwinex YouTube; 2018-2021. Playlist YouTube. ↩
(2) Aronson DR. Evidence-Based Technical Analysis: Applying the Scientific Method and Statistical Inference to Trading Signals. Hoboken: Wiley; 2007. ISBN 978-0470008744. Chapitre 6 (Data-Mining Bias). ↩
(3) López de Prado MM, Lewis MJ. Detection of False Investment Strategies Using Unsupervised Learning Methods. SSRN Working Paper 3167017. 2018. Aussi : Quantitative Finance. 2019;19(9):1555-65. SSRN 3167017. ↩
(4) Bailey DH, López de Prado MM. The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting and Non-Normality. Journal of Portfolio Management. 2014;40(5):94-107. PDF davidhbailey. SSRN 2460551. ↩
(5) Cohen J. Statistical Power Analysis for the Behavioral Sciences. 2e éd. Hillsdale: Lawrence Erlbaum Associates; 1988. ISBN 0805802835. PDF UToronto. ↩
(6) Harvey CR, Liu Y, Zhu H. … and the Cross-Section of Expected Returns. Review of Financial Studies. 2016;29(1):5-68. NBER Working Paper 20592. NBER w20592. ↩
(7) Bailey DH, Borwein JM, López de Prado MM, Zhu QJ. Pseudo-Mathematics and Financial Charlatanism. Notices of the AMS. 2014;61(5):458-71. AMS PDF. ↩
(8) Bailey DH, Borwein JM, López de Prado MM, Zhu QJ. The Probability of Backtest Overfitting. Journal of Computational Finance. 2016;20(4):39-69. SSRN 2326253. ↩
(9) Arian HR, Norouzi Mobarekeh D, Seco L. Backtest overfitting in the machine learning era: a comparison of out-of-sample testing methods in a synthetic controlled environment. Knowledge-Based Systems. 2024 Dec;305:112613. DOI:10.1016/j.knosys.2024.112477. ↩
(10) Pardo R. The Evaluation and Optimization of Trading Strategies. 2e éd. Hoboken: Wiley; 2008. ISBN 978-0470128015. Chapitre 11 (WFA), chapitre 13 (Overfitting). ↩
(11) Kaufman PJ. Trading Systems and Methods. 6e éd. Hoboken: Wiley; 2020. ISBN 978-1119605355.
(12) Lo AW. The Statistics of Sharpe Ratios. Financial Analysts Journal. 2002 Jul-Aug;58(4):36-52. doi:10.2469/faj.v58.n4.2453. ↩
(13) Bailey DH, López de Prado MM. The Sharpe Ratio Efficient Frontier. Journal of Risk. 2012 Winter;15(2):3-44. SSRN 1821643. ↩
(14) Tharp VK. Trade Your Way to Financial Freedom. 2e éd. New York: McGraw-Hill; 2007. ISBN 978-0071478717. ↩
(15) Tharp VK. The Definitive Guide to Position Sizing Strategies. Cary: Van Tharp Institute; 2008. ISBN 978-0935219098. ↩
(16) López de Prado MM. Advances in Financial Machine Learning. Hoboken: Wiley; 2018. ISBN 978-1119482086. Chapitre 7 (Purged K-Fold CV), chapitre 12 section 12.4 (CPCV), chapitre 14 (Backtest Statistics). ↩
(17) Harvey CR, Liu Y. False (and Missed) Discoveries in Financial Economics. Journal of Finance. 2020 Oct;75(5):2503-53. doi:10.1111/jofi.12951. ↩
(18) Harvey CR, Liu Y. Lucky Factors. Journal of Financial Economics. 2021;141(2):413-35. SSRN 2528780. ↩
(19) Gao Z, Jiang W, Yan Y. A Test of Lookahead Bias in LLM Forecasts. arxiv:2512.23847. 2025 Dec 29. ↩
(20) Brown SJ, Goetzmann WN, Ibbotson RG, Ross SA. Survivorship Bias in Performance Studies. Review of Financial Studies. 1992;5(4):553-80. doi:10.1093/rfs/5.4.553. ↩
(21) Almgren R, Chriss N. Optimal Execution of Portfolio Transactions. Journal of Risk. 2000;3(2):5-39. ↩
(22) Hamilton JD. A New Approach to the Economic Analysis of Nonstationary Time Series and the Business Cycle. Econometrica. 1989;57(2):357-84. doi:10.2307/1912559. ↩
(23) Wiese M, Knobloch R, Korn R, Kretschmer P. Quant GANs: Deep Generation of Financial Time Series. arxiv:1907.06673. 2019. ↩
(24) Lu Y et al. Generation of synthetic financial time series by diffusion models. arxiv:2410.18897. 2024 Oct. Aussi : Quantitative Finance. 2025. doi:10.1080/14697688.2025.2528697. ↩
(25) Tait T. Synthetic Data in Investment Management. CFA Institute Research Foundation Report. 2025 Jul. ↩
(26) Hoque MR, Ferdaus MM, Hassan MK. Reinforcement Learning in Financial Decision Making: A Systematic Review. arxiv:2512.10913. 2025 Dec 11. ↩
(27) Xiao Y, Sun E, Luo D, Wang W. TradingAgents: Multi-Agents LLM Financial Trading Framework. arxiv:2412.20138. 2024 Dec. ↩
(28) Hinder F et al. Adversarial Attacks for Drift Detection. arxiv:2411.16591. 2024 Nov, révisé Fév 2025. ↩
(29) Pal J, Liu R et al. Adversarial Validation Approach to Concept Drift Problem in User Targeting Automation Systems at Uber. arxiv:2004.03045. 2020. ↩
(30) python.financial. The Python Backtesting Landscape (2026): Choosing the Right Framework. Article praticien en ligne. 2026 Mar.
(31) López de Prado MM. Machine Learning for Asset Managers. Cambridge Elements in Quantitative Finance. Cambridge: Cambridge University Press; 2020. 141 p. ISBN 9781108792899. ↩
(32) Ling L. Deflated Sharpe Ratio (DSR). Balaena Quant Insights. Medium. 2024. URL : https://medium.com/balaena-quant-insights/deflated-sharpe-ratio-dsr-33412c7dd464. Signal faible. Source praticien sans comité éditorial, exemple non empirique. ↩
(33) Lehalle C-A, Laruelle S. Market Microstructure in Practice. 2e éd. Singapore: World Scientific; 2018. ISBN 978-9813231122. Chapitre arXiv complémentaire libre : Lehalle C-A. arXiv:1302.4592 [q-fin.TR]. 2013. URL : https://arxiv.org/abs/1302.4592. ↩
(34) Bjork RA, Bjork EL. Desirable Difficulties in Theory and Practice. Journal of Applied Research in Memory and Cognition. 2020;9(4):475-9. DOI:10.1016/j.jarmac.2020.09.003. Note : aucune republication académique avec DOI en 2024 pour cette référence.
(35) Sweller J. The Development of Cognitive Load Theory: Replication Crises and Incorporation of Other Theories Can Lead to Theory Expansion. Educational Psychology Review. 2023;35(article 95). DOI:10.1007/s10648-023-09817-2. Note : cet article porte sur le développement historique de la CLT. Les extensions embodied cognition et collective working memory de la CLT font l’objet d’autres articles Sweller 2019-2023 non inclus dans ce corpus.
(36) Clark RC, Mayer RE. e-Learning and the Science of Instruction: Proven Guidelines for Consumers and Designers of Multimedia Learning. 5e éd. Hoboken: Wiley; 2024. ISBN 978-1-394-17737-0.
(37) Chi MTH, Wylie R. The ICAP Framework: Linking Cognitive Engagement to Active Learning Outcomes. Educational Psychologist. 2014;49(4):219-43. DOI:10.1080/00461520.2014.965823.
(38) Pollard V, Armatas C, Pepe A. Feedback is Integral: Using a Revised ICAP Framework to Achieve Active Learning in an Asynchronous Online Course. Online Learning Journal. 2025 Sep;29(3). DOI:10.24059/olj.v29i3.4555. Note d’attribution : les auteurs de cette extension sont Pollard, Armatas et Pepe, pas Chi ou Wylie.
(39) Dunlosky J, Rawson KA, Marsh EJ, Nathan MJ, Willingham DT. Improving Students’ Learning With Effective Learning Techniques: Promising Directions From Cognitive and Educational Psychology. Psychological Science in the Public Interest. 2013;14(1):4-58. DOI:10.1177/1529100612453266. ↩
(40) Malkiel BG. Returns from Investing in Equity Mutual Funds 1971 to 1991. The Journal of Finance. 1995;50(2):549-72. DOI:10.1111/j.1540-6261.1995.tb04795.x. ↩