← Retour aux articles
June 29, 2026
5 min de lecture

Le Deflated Sharpe Ratio : combien de vos 'gagnants' de backtest survivent aux tests multiples ?

#algotrading
#backtest
#overfitting
#statistics
#sharpe
#multiple-testing
#validation
🎯
Part 7 of 9 · Collection
Backtesting Without Fooling Yourself

Fait partie de la série "Backtests Without Illusions".

📄 Cet article est devenu un article de recherche. Chaque chiffre ci-dessous provient d'un seul script déterministe qui construit une vérité terrain contrôlée — des recherches sur pur bruit, des recherches avec edge implanté, et une véritable grille de paramètres corrélés — puis fait tourner dessus le Deflated Sharpe Ratio, la coupe de cheveux de Harvey-Liu pour tests multiples, et le Reality Check de White / le SPA de Hansen, en mesurant directement le taux de fausses découvertes et la puissance de détection de chaque méthode. Lisez l'article en ligne (version interactive + PDF) sur deflated-sharpe.marketmaker.cc, code et données sur github.com/suenot/deflated-sharpe-search.

Vous lancez un balayage de paramètres. Seize longueurs rapides, quarante longueurs lentes, 640 combinaisons d'un croisement de moyennes mobiles. La grille se termine et une cellule brille : un Sharpe annualisé de 3,9, une p-value de test unique de 6×10126\times10^{-12}. Douze zéros de significativité. Vous avez trouvé quelque chose.

Ou vous n'avez rien trouvé, et c'est la recherche qui l'a trouvé pour vous.

Une recherche de paramètres n'est pas un test. C'est une machine à trouver le plus chanceux parmi N essais, et plus vous lui donnez d'essais, plus son gagnant a l'air chanceux — avec ou sans véritable edge sous-jacent. Le Sharpe du meilleur-parmi-N est gonflé par la sélection de la même façon que le plus grand parmi mille personnes tirées au hasard est grand : non pas parce que la grande taille est réelle, mais parce que vous avez cherché. Les statistiques de test unique imprimées à côté du gagnant — sa p-value, son t-stat, son "est-ce significatif ?" — ont été conçues pour une seule hypothèse pré-enregistrée. Donnez-leur le survivant d'une recherche et elles mentent, avec assurance, à chaque fois.

Cet article mesure exactement à quel point elles mentent, puis mesure trois outils qui corrigent cela. Tout l'enjeu est la vérité terrain contrôlée : nous générons des rendements dont nous connaissons la réponse — parfois du pur bruit à edge nul, parfois un edge implanté de force connue — de sorte que "la méthode a-t-elle donné la bonne réponse ?" soit un fait, pas un jugement. Voici le résultat principal d'emblée. Sur des recherches à null connu, où la réponse honnête est toujours "pas de découverte", voici à quelle fréquence chaque test crie au loup :

Test Taux de fausses découvertes sur recherches à null connu Verdict
Naïf "le meilleur Sharpe est-il significatif ?" 1,000 signale une découverte à chaque fois
Deflated Sharpe Ratio (DSR ≥ 0,95) 0,001 contrôlé
Coupe de cheveux Harvey-Liu — Bonferroni 0,057 ~contrôlé
Coupe de cheveux Harvey-Liu — Holm 0,057 ~contrôlé
Coupe de cheveux Harvey-Liu — BHY 0,007 contrôlé
Reality Check de White (bootstrap) 0,022 contrôlé

1 000 stratégies par recherche, 1 000 observations chacune, 2 000 recherches nulles indépendantes, vrai Sharpe = 0 partout. Rendements Normaux iid synthétiques, seed 0, α = 0,05, 252 périodes/an. Le taux de fausses découvertes du test naïf n'est pas élevé — il est exactement égal à un.

Lisez la première ligne jusqu'à ce qu'elle pique. Un test censé se déclencher 5 % du temps sur du pur bruit se déclenche 100 % du temps — parce que vous ne lui montrez pas du pur bruit, vous lui montrez le maximum de mille tirages de pur bruit, et le maximum de mille lanceurs de pièce a toujours l'air d'un génie. Chaque autre ligne est une méthode qui le sait et corrige pour cela. C'est tout l'article : pourquoi la première ligne vaut 1,000, pourquoi les autres non, et le seul endroit (la dernière section) où même les bonnes méthodes ont besoin d'une seconde correction pour rester honnêtes.

Acte 1 — Le piège : une recherche fabrique du Sharpe à partir de rien

A parameter search depicted as a slot machine feeding a thousand random strategy curves through a funnel, with a single luckiest curve emerging labeled with a tempting Sharpe ratio while the discarded curves fade into noise behind it

Commençons par le piège le plus simple qui soit. Générons N=1000N = 1000 stratégies dont les rendements sont du bruit Normal standard indépendant — pas de dérive, pas de compétence, vrai Sharpe exactement nul pour toutes. Chacune a T=1000T = 1000 observations. Faisons maintenant ce que fait toute recherche de paramètres : garder la meilleure.

Le Sharpe par observation du meilleur-parmi-1000 vaut en moyenne 0,1027, ce qui s'annualise à 1,63 (calcul : 0,1027×2521,630,1027 \times \sqrt{252} \approx 1,63). Ce n'est pas un chiffre modeste. Un Sharpe annualisé de 1,63 est le genre de résultat qui fait financer une stratégie, publier un article, allouer du capital. Il provient d'un générateur de nombres aléatoires dont la dérive était réglée à zéro.

Donnons maintenant le gagnant au test de significativité naïf — celui que toute bibliothèque de backtest imprime gratuitement. Convertissons son Sharpe en statistique t (t=SR^Tt = \hat{SR}\sqrt{T}), prenons la p-value unilatérale, appelons cela une découverte si p<0.05p < 0.05 :

t=SR^T,p=1Z(t),"deˊcouverte" si p<αt = \hat{SR}\sqrt{T}, \qquad p = 1 - Z(t), \qquad \text{"découverte" si } p < \alpha

La p-value médiane du test unique pour ces gagnants du bruit est 0,000686 — trois zéros de "significativité" pour une stratégie sans edge. Et sur 2 000 recherches nulles indépendantes, le test naïf déclare une découverte dans chacune d'entre elles : un taux de fausses découvertes de 1,000. Pas "gonflé". Pas "un peu élevé". Un test qui, par construction, n'a raison au maximum que 5 % du temps sur une seule hypothèse nulle se trompe 100 % du temps sur le gagnant d'une recherche.

Le mécanisme n'a rien de subtil une fois nommé. Le test naïf demande "ce Sharpe particulier pourrait-il survenir par hasard sous l'hypothèse nulle ?" — une question légitime pour une stratégie choisie avant d'avoir regardé les données. Mais vous avez choisi celle-ci *parce qu'*elle avait le Sharpe le plus élevé parmi mille. Vous avez conditionné sur le maximum, et la distribution d'échantillonnage d'un maximum n'a rien à voir avec celle d'un tirage unique. C'est la même maladie que notre taxonomie du look-ahead bias avait diagnostiquée depuis l'autre bout — là, une fuite d'une barre fabriquait un Sharpe de 15 à partir de bruit ; ici, une recherche fabrique un Sharpe de 1,63 à partir de bruit sans aucune fuite, purement par sélection. Mécanisme différent, symptôme identique : un Sharpe qui a fière allure mais qui ne signifie rien.

Le chiffre 1,63 est celui qui compte, retenez-le. C'est le plafond de bruit de cette recherche : le Sharpe que l'on doit s'attendre à voir posté par la plus chanceuse de 1 000 stratégies à edge nul. Tout test honnête d'un gagnant de recherche doit le comparer non pas à zéro, mais à ceci — à ce que la chance seule produit quand on regarde mille fois.

Acte 2 — La boîte à outils : trois façons de tarifer la recherche

Three measurement instruments laid out on a workbench, each aimed at the same inflated Sharpe number: a deflating gauge lowering a benchmark bar, a set of graduated haircut scissors, and a bootstrap resampling wheel spinning off many shadow copies of a returns series

Trois programmes de recherche, arrivés indépendamment, aboutissent tous à la même correction : arrêter de comparer le gagnant à zéro, et commencer à le comparer à ce qu'une recherche de cette taille produit par chance. Ils diffèrent dans la façon de construire cette comparaison.

PSR et le Deflated Sharpe Ratio (Bailey & López de Prado, 2012 / 2014)

Le Probabilistic Sharpe Ratio pose une question plus fine que "le Sharpe est-il positif ?". Il demande : étant donné la longueur de l'échantillon et la forme des rendements (asymétrie, queues épaisses), quelle est la probabilité que le vrai Sharpe dépasse un benchmark SRSR^* ?

PSR(SR)=Z ⁣((SR^SR)n11γ^3SR^+γ^414SR^2)\text{PSR}(SR^*) = Z\!\left( \frac{(\hat{SR} - SR^*)\sqrt{n-1}}{\sqrt{\,1 - \hat\gamma_3\,\hat{SR} + \frac{\hat\gamma_4 - 1}{4}\,\hat{SR}^2\,}} \right)

Ici ZZ est la fonction de répartition Normale standard, γ^3\hat\gamma_3 l'asymétrie (skew), et γ^4\hat\gamma_4 le kurtosis dans la convention non-excédentaire (Normale ⇒ γ^4=3\hat\gamma_4 = 3 ; si l'on substitue le kurtosis excédentaire ici sans ajouter 3, la déflation est fausse). Avec SR=0SR^* = 0, le PSR n'est qu'un test de significativité à échantillon fini. La magie réside dans le bon choix de SRSR^*.

Le Deflated Sharpe Ratio est le PSR évalué à un benchmark qui n'est pas zéro mais le maximum de Sharpe attendu sur l'ensemble de la recherche :

SR0=Var[{SRn}]  ((1γ)Z1 ⁣(11N)  +  γZ1 ⁣(11Ne))SR_0 = \sqrt{\operatorname{Var}[\{SR_n\}]}\;\Big(\,(1-\gamma)\,Z^{-1}\!\big(1 - \tfrac{1}{N}\big) \;+\; \gamma\,Z^{-1}\!\big(1 - \tfrac{1}{N e}\big)\Big)

Var[{SRn}]\operatorname{Var}[\{SR_n\}] est la variance sur l'ensemble des N Sharpe d'essai (la dispersion produite par la recherche elle-même), γ0,5772\gamma \approx 0,5772 est la constante d'Euler-Mascheroni, et les deux termes en Normale inverse sont l'approximation par théorie des valeurs extrêmes du maximum attendu de NN tirages Normaux standard. En code, c'est presque trop court pour impressionner :

def expected_max_sharpe(sr_variance, N, mean_sr=0.0):
    """E[max of N independent SR estimates ~ N(mean_sr, sr_variance)]
    (Bailey & LdP 2014)."""
    g = EULER_MASCHERONI                       # 0.5772156649
    a = norm.ppf(1.0 - 1.0 / N)                # Z^{-1}(1 - 1/N)
    b = norm.ppf(1.0 - 1.0 / (N * E))          # Z^{-1}(1 - 1/(N e))
    return float(mean_sr + np.sqrt(sr_variance) * ((1.0 - g) * a + g * b))

Le DSR est alors simplement le PSR avec cette barre déflatée :

def deflated_sharpe(sr_max, sr_estimates, T, skew=0.0, kurt=3.0, N=None):
    """DSR = PSR(sr_max, SR0). Returns (dsr, sr0)."""
    v = float(np.asarray(sr_estimates).var(ddof=1))   # dispersion of the search
    m = float(np.asarray(sr_estimates).mean())
    if N is None:
        N = len(sr_estimates)
    sr0 = expected_max_sharpe(v, N, mean_sr=m)
    return psr(sr_max, sr0, T, skew, kurt), sr0

Le DSR est une probabilité. Nous déclarons une découverte quand DSR1α=0,95\text{DSR} \geq 1 - \alpha = 0,95 : le vrai Sharpe du gagnant bat le meilleur attendu par chance avec 95 % de confiance. Notez l'hypothèse structurante cachée dans SR0SR_0 : les NN essais sont traités comme indépendants. L'Acte 5 porte entièrement sur ce qui se passe quand ce n'est pas le cas.

La coupe de cheveux de Harvey-Liu (2015)

Harvey et Liu attaquent le même problème par le biais des ajustements de p-value pour tests multiples — la machinerie classique du "j'ai fait M tests, ne me laisse pas me tromper moi-même". Ordonnons les MM p-values de test unique p(1)p(M)p_{(1)} \le \dots \le p_{(M)} et gonflons-les :

piBonf=min[Mp(i),1],piHolm=min ⁣[maxji{(Mj+1)p(j)},1]p_i^{\text{Bonf}} = \min[\,M\,p_{(i)},\,1\,], \qquad p_i^{\text{Holm}} = \min\!\Big[\max_{j\le i}\{(M-j+1)\,p_{(j)}\},\,1\Big]

Bonferroni est l'instrument brutal (contrôler la probabilité d'un faux positif quelconque en multipliant chaque p-value par MM) ; Holm est sa cousine step-down uniformément plus puissante. La troisième, Benjamini-Yekutieli (BHY), contrôle le taux de fausses découvertes — la fraction attendue de vos rejets qui sont erronés — et, point crucial, le fait sous dépendance arbitraire entre les tests, en utilisant le normalisateur harmonique au numérateur :

c(M)=j=1M1j,c(1000)7,49c(M) = \sum_{j=1}^{M} \frac{1}{j}, \qquad c(1000) \approx 7,49

Ce c(1000)=7,49c(1000) = 7,49 est le prix que BHY fait payer pour ne pas supposer que vos 1 000 essais sont indépendants — cela gonfle le seuil de FDR d'un facteur qui croît comme lnM\ln M. La "coupe de cheveux" elle-même est la métrique-punchline : convertir la p-value ajustée en Sharpe et rapporter la part du Sharpe original qu'il a fallu raser. Une coupe de 100 % signifie que le gagnant s'explique entièrement par les tests multiples ; 15 % signifie qu'il survit pour l'essentiel.

Le Reality Check de White et le SPA de Hansen (2000 / 2005)

Le troisième outil ne fait aucune hypothèse distributionnelle. Le Reality Check de White prend les rendements réels de chaque règle, forme la statistique de maximum-sur-règles, et bootstrappe directement sa distribution nulle :

RCT=maxk=1,,KTfˉkRC_T = \max_{k=1,\dots,K} \sqrt{T}\,\bar{f}_k

fˉk\bar{f}_k est la performance moyenne de la règle kk par rapport au benchmark. Il rééchantillonne les rendements avec le bootstrap stationnaire (Politis-Romano — blocs de longueur aléatoire pour que la corrélation sérielle survive au rééchantillonnage), recentre chaque tirage pour satisfaire l'hypothèse nulle par construction, recalcule le maximum à chaque tirage, et rapporte la p-value comme la fraction des maxima bootstrapés qui dépassent celui observé. Le SPA de Hansen affine le RC de deux façons : la studentisation (diviser la moyenne de chaque règle par sa propre erreur-type, pour qu'une règle unique à forte variance ne puisse pas détourner le maximum) et un recentrage cohérent et dépendant de l'échantillon de l'hypothèse nulle. Notre implémentation ajoute la studentisation mais pas l'étape complète de recentrage cohérent — donc partout où cet article rapporte une p-value de type SPA, il faut la lire comme un Reality Check studentisé, pas le SPA complet de Hansen. Là où le DSR demande "le gagnant est-il spécial au sein de cette recherche ?", le Reality Check demande "la meilleure règle bat-elle le cash après avoir honnêtement pris en compte le nombre de règles essayées ?" — et il gère nativement les règles corrélées, via le bootstrap, sans jamais compter les essais. Gardez cette distinction en tête ; la dernière section repose entièrement dessus.

Acte 3 — La calibration, c'est toute la preuve

A calibration chart contrasting one bar towering at a false-discovery rate of one against five short bars pinned near the alpha level of five percent, with a horizontal reference line marking the noise ceiling Sharpe of one point six three

Une méthode qui ne signale jamais rien aurait aussi un taux de fausses découvertes de zéro — et serait inutile. Le seul test valable de ces outils est donc bidirectionnel : sur des données à null connu, ils doivent contrôler les fausses découvertes à ou en dessous de α\alpha, et sur des données à edge connu (section suivante), ils doivent quand même se déclencher. Cette section traite la première moitié.

Faisons tourner 2 000 recherches indépendantes, chacune sur 1 000 stratégies à edge nul, et comptons combien de fois chaque méthode déclare une découverte. Ce compte, divisé par 2 000, est le taux de fausses découvertes — et comme la vérité est aucun edge, chaque découverte est fausse :

Test Taux de fausses découvertes (α = 0,05)
Significativité naïve 1,000
Deflated Sharpe Ratio 0,001
Harvey-Liu — Bonferroni 0,057
Harvey-Liu — Holm 0,057
Harvey-Liu — BHY 0,007
Reality Check de White 0,022

Chaque méthode principiée se situe à ou près de la ligne des 5 % — les deux coupes FWER légèrement au-dessus, DSR/BHY/RC en dessous — tandis que le test naïf se tient à 100. (Bonferroni et Holm impriment le même 0,057 ici, et pas par hasard : pour la seule stratégie gagnante, la première étape de Holm est (M1+1)p(1)=Mp(1)(M-1+1)\,p_{(1)} = M\,p_{(1)}, identique à Bonferroni par construction, ce qui n'est donc pas une double confirmation.) Mais le chiffre le plus profond de toute l'étude n'est pas dans ce tableau — c'est le benchmark déflaté qui produit la colonne DSR. En moyenne sur les recherches nulles, SR0SR_0 ressort à un Sharpe par observation de 0,1030, qui s'annualise à 1,63 (calcul : 0,1030×2521,630,1030 \times \sqrt{252} \approx 1,63) — le même 1,63 que celui posté en moyenne par le gagnant du bruit (1,63). Ce n'est pas une coïncidence ; c'est l'idée tout entière qui fonctionne :

La barre déflatée se situe exactement au plafond de bruit. Le DSR ne demande pas au gagnant d'une recherche de battre zéro. Il lui demande de battre le meilleur score que la chance seule produit avec une recherche de cette taille — 1,63 annualisé ici. Un gagnant qui égale simplement le plafond de bruit obtient DSR ≈ 0,5 (pile ou face), ce qui explique que le DSR nul moyen soit 0,495, pas un petit chiffre. Pour être une découverte, le gagnant doit dépasser 1,63 et bien plus — assez pour pousser le PSR au-delà de 0,95.

Cela reformule tout l'exercice. Le test naïf mesure la distance à zéro ; toute recherche franchit cette barre trivialement, ce qui la rend inutile. Le DSR mesure la distance au plafond de bruit, et franchir cette barre est réellement difficile — comme il se doit. La coupe de cheveux de Harvey-Liu et le Reality Check atteignent le même contrôle par des chemins différents (une inflation c(1000)=7,49c(1000)=7,49 pour BHY, une distribution de maximum bootstrapée pour RC), et aboutissent dans le même voisinage : 0,001 à 0,057, à ou près de α\alpha. Le 0,057 de Bonferroni/Holm est légèrement au-dessus de la ligne des 5 %, mais de peu : avec 2 000 recherches Monte-Carlo, l'erreur-type sur une estimation de FDR proche de 0,05 est d'environ 0,005, donc 0,057 se situe à environ 1,4 écart-type au-dessus de α\alpha — du bruit Monte-Carlo, pas une garantie brisée. "Contrôle le FWER" est de toute façon une promesse asymptotique, pas exacte au bit près à T=1000T = 1000.

Acte 4 — Puissance : les edges réels sont-ils toujours conservés ?

An S-shaped detection-power curve rising from near zero to one as the planted true Sharpe increases along the horizontal axis, with a vertical dashed line at the noise-ceiling Sharpe of one point six three and the curve reaching fifty percent power just to the right of it, and a flat false-positive line pinned to the floor

Contrôler les fausses découvertes n'est que la moitié d'un test — une méthode paranoïaque qui rejette tout obtient un parfait 0,000 et ne sert à rien. L'autre moitié : quand un véritable edge est présent, le DSR le trouve-t-il ?

Implantons-en un. Dans un champ de 1 000 stratégies, faisons en sorte que 25 d'entre elles portent un véritable edge de force connue et laissons les autres comme du bruit, puis lançons la recherche et demandons si le DSR signale le gagnant. En balayant l'edge implanté de faible à fort, la puissance de détection trace une courbe en S nette (taux de faux positifs maintenu à ~0 tout du long) :

Vrai Sharpe implanté (annualisé) Puissance de détection DSR Taux de faux positifs DSR
0,79 0,005 0,000
1,27 0,090 0,000
1,90 0,651 0,000
2,54 0,998 0,000
3,17 1,000 0,000

Regardez la courbe s'infléchit. En dessous du plafond de bruit — un vrai Sharpe annualisé de 0,79, bien en dessous de 1,63 — le DSR se déclenche 0,5 % du temps, refusant à juste titre de le signaler : un edge aussi faible est réellement indiscernable de la chance générée par une recherche à 1 000 essais, et prétendre le contraire serait malhonnête, pas puissant. Juste autour du plafond, la courbe grimpe fortement (0,09 à 1,27, 0,65 à 1,90). À un Sharpe annualisé de 2,54, la puissance est 0,998 ; à 3,17, elle est un parfait 1,000. Les edges forts sont conservés pratiquement à chaque fois, les faux positifs restent cloués à zéro, et le point de croisement à 50 % de puissance se situe à un Sharpe annualisé d'environ 1,73 (calcul par interpolation entre les lignes 1,27 et 1,90) — juste au-dessus du plafond de bruit de 1,63, exactement là où une barre honnête devrait le placer : le point où un edge commence à dépasser ce qu'invente une recherche à 1 000 essais.

C'est la propriété que l'on veut réellement, formulée comme une courbe en S : les edges en dessous du plafond de bruit sont correctement écartés comme de la chance ; les edges confortablement au-dessus sont conservés avec une puissance approchant un. Le test naïf, en contraste, "détecte" l'edge implanté 67 % du temps même à un vrai Sharpe de 0,79 — mais ce chiffre est dénué de sens, puisque nous avons déjà vu qu'il détecte un edge inexistant 100 % du temps. Un test qui se déclenche sur tout n'a aucune puissance ; il n'a aucun pouvoir discriminant. Le DSR sacrifie un peu de sensibilité aux edges marginaux (les lignes 0,79 et 1,27) pour ce qui compte vraiment : ses découvertes sont réelles.

Acte 5 — Le piège du praticien : les grilles corrélées

A parameter-grid heatmap of moving-average crossover results glowing with strong pairwise correlation between neighboring cells, beside a horizontal axis of five different effective-trial estimates spanning from about two to nearly four hundred, with a shaded robustness band showing the genuine edge clearing the deflated bar across almost the entire range and only the far-right over-counting estimate dipping below

Tout ce qui précède utilisait des stratégies indépendantes — le cadre le plus propre possible, et celui où l'hypothèse d'indépendance du DSR tient exactement. Les vraies grilles de paramètres ne sont pas ainsi, et c'est là qu'un outil utilisé naïvement devient une nouvelle façon de se tromper.

Prenons une recherche honnête de croisement de moyennes mobiles : 16 longueurs rapides ×\times 40 longueurs lentes =640= 640 essais, chacun avec 755 observations. Une grille de ce type est trempée de corrélation — fast=45/slow=120 et fast=45/slow=125 sont presque la même stratégie, donc leurs séries de rendements évoluent ensemble. Corrélation moyenne par paire mesurée sur les 640 essais : environ 0,61. Ce ne sont pas 640 paris indépendants. Absolument pas.

Cas A — marche aléatoire (pas d'edge) : chaque méthode l'élimine, à raison

Faisons tourner la grille sur une pure marche aléatoire. Le gagnant a l'air tentant : paramètres fast=45/slow=120, meilleur Sharpe annualisé 0,81, p-value de test unique 0,081. Chaque méthode voit clair :

Méthode Résultat Verdict
DSR (K brut = 640) 0,431 rejette (< 0,95)
p Reality Check 0,570 rejette
p type SPA (RC studentisé) 0,569 rejette
Coupe de cheveux Harvey-Liu 100% rejette

Commençons par le signe qui ne nécessite même aucune déflation : même la significativité à échantillon fini non ajustée de ce gagnant, le PSR\text{PSR}-face-à-zéro, n'est que de 0,918 — déjà en dessous de 0,95 avant même de corriger pour un seul des 640 essais. La déflation enterre alors le tout : la barre est un SR0SR_0 par observation de 0,057, annualisé à ~0,91 (calcul : 0,057×2520,057 \times \sqrt{252}) — au-dessus du 0,81 du gagnant. La meilleure stratégie n'atteint même pas le plafond de bruit, DSR ≈ 0,43 (pire qu'un pile ou face), et le Reality Check, le test de type SPA, et une coupe de cheveux de 100 % s'accordent tous : rien ici. Parfait. C'est le cas facile, et il fonctionne — et, comme nous allons le voir, il reste rejeté à chaque nombre effectif d'essais que nous essayons.

Cas B — un véritable edge de régime : le DSR brut se trompe

Faisons maintenant tourner la même grille sur une série à changement de régime qui porte un véritable edge exploitable. Le gagnant est catégorique : paramètres fast=3/slow=55, meilleur Sharpe annualisé 3,92 — c'est le Sharpe in-sample, sélectionné, lui-même gonflé par la sélection de la recherche (pas un edge réel ou out-of-sample), mais l'effet de régime sous-jacent est authentique — avec une p-value de test unique de 6×10126\times10^{-12} et une significativité non déflatée PSR\text{PSR}-face-à-zéro essentiellement de 1,000. Il y a un véritable edge ici et le gagnant l'a trouvé. Regardez le DSR brut le rejeter quand même :

Méthode Résultat Verdict
DSR (K brut = 640) 0,748 rejette (< 0,95) ✗ sur-déflaté
p Reality Check 0,0024 confirme ✓
p type SPA (RC studentisé) 0,0038 confirme ✓
Coupe de cheveux Harvey-Liu 15% confirme ✓

Le DSR brut de 0,748 est un faux rejet d'un edge authentique. La raison est l'hypothèse d'indépendance, désormais violée de façon flagrante : le DSR a construit sa barre déflatée en traitant 640 essais corrélés comme 640 tirages indépendants, ce qui gonfle le maximum attendu SR0SR_0 à un par-observation de 0,221 — annualisé ~3,51 (calcul : 0,221×2520,221 \times \sqrt{252}). Face à une barre de 3,51, un gagnant de 3,92 ne la franchit que modestement, et le DSR atterrit à 0,748 — en dessous de 0,95. Deux choses gonflent cette barre : le compte brut (640 regards au lieu d'une poignée d'essais effectifs), et une véritable dispersion de compétence entre les essais — certaines paires de paramètres sont réellement meilleures sur une série à régime, ce qui élargit Var[{SRn}]\operatorname{Var}[\{SR_n\}] et élève SR0SR_0 au-delà de ce que la pure chance produirait seule. Les deux poussent dans le même sens, et la barre finit trop haute parce que la recherche n'était jamais réellement 640 regards indépendants ; c'était une poignée de paris indépendants, échantillonnés 640 fois.

Donnons au DSR le nombre effectif d'essais à la place. La formule utilisée ci-dessus est une estimation grossière à partir de la corrélation moyenne par paire :

def effective_n_trials(returns_matrix):
    """N_eff = N / (1 + (N-1) * rho_bar), clipped to [1, N].
    Correlated trials -> fewer independent bets."""
    C = np.corrcoef(returns_matrix, rowvar=False)
    rho_bar = max(np.nanmean(C[np.triu_indices(C.shape[0], k=1)]), 0.0)
    N = returns_matrix.shape[1]
    neff = N / (1.0 + (N - 1) * rho_bar)
    return float(min(max(neff, 1.0), N))

Avec ρˉ0,62\bar\rho \approx 0,62 et N=640N = 640, cela réduit la grille à un nombre effectif de Neff1,6N_{\text{eff}} \approx 1,6 essais (calcul : 640/(1+639×0,62)640 / (1 + 639 \times 0,62)), et le DSR bondit à 1,000. Mais arrêtons-nous avant de fêter ce chiffre, car c'est la preuve la plus faible de toute cette section. À Neff1,6N_{\text{eff}} \approx 1,6, la barre déflatée s'effondre à un SR0SR_0 annualisé 0,25\approx 0,25 — essentiellement la moyenne des essais, essentiellement zéro. La déflation y est désactivée : le DSR à Neff1,6N_{\text{eff}} \approx 1,6 ne fait que reproduire la significativité à échantillon fini non déflatée du gagnant (PSR\text{PSR}-face-à-zéro =1,000= 1,000). Le verdict est hérité de la significativité brute, pas produit par la correction pour tests multiples. Et la mise en garde symétrique côté marche aléatoire : son rejet à Neff1,6N_{\text{eff}} \approx 1,6 ne tient que parce que ce gagnant était déjà marginal indépendamment (PSR\text{PSR}-face-à-zéro =0,918<0,95= 0,918 < 0,95). Ancrer tout l'argument sur 1,6 et un sceptique aurait raison de hausser les épaules : vous avez désactivé la correction et rapporté ce qu'il y avait en dessous.

Ne nous ancrons donc pas sur un seul estimateur. Le geste honnête — et le plus solide — consiste à calculer NeffN_{\text{eff}} de cinq façons standard différentes et à lire le verdict sur l'ensemble de la bande. Voici cinq estimateurs appliqués à la même grille de signal à 640 essais, chacun avec la barre déflatée qu'il implique et le DSR qu'il produit :

Estimateur du nombre effectif d'essais NeffN_{\text{eff}} Barre déflatée SR0SR_0 (annuel) DSR Verdict
Corrélation moyenne 1,6 0,25 1,000 conservé
Ratio de participation 2,4 0,43 1,000 conservé
ACP (95% de la variance) 16 1,85 1,000 conservé
Kaiser (valeurs propres > 1) 21 2,00 0,999 conservé
Cheverud-Nyholt 370 3,31 0,845 rejeté
compte brut de la grille (sans ajustement) 640 3,51 0,748 rejeté

Estimateurs : la corrélation moyenne est la formule N/(1+(N1)ρˉ)N/(1+(N-1)\bar\rho) ci-dessus ; le ratio de participation (λi)2/λi2(\sum\lambda_i)^2/\sum\lambda_i^2 et les comptes ACP-95%/Kaiser lisent la dimensionnalité effective sur les valeurs propres de la matrice de corrélation ; Cheverud-Nyholt est un estimateur basé sur la variance des valeurs propres, issu de la littérature en génétique, connu pour sur-compter sous quasi-équicorrélation.

Le point atterrit maintenant, et ce n'est pas "n'importe quel ajustement vous sauve". Regardez le juste milieu défendable — ACP-95% (Neff=16N_{\text{eff}} = 16) et Kaiser (Neff=21N_{\text{eff}} = 21). Ce n'est pas le régime où la déflation est désactivée ; ils imposent une véritable barre SR0SR_0 annualisée de 1,85 à 2,00 — une coupe sérieuse, bien au-dessus du bruit, une véritable pénalité de tests multiples pour 16-21 regards effectifs. Et l'edge de 3,92 la franchit toujours (DSR 1,000 et 0,999). Le signal survit au DSR pour tout NeffN_{\text{eff}} en dessous de 144,8 (calculé à partir du point de croisement) ; il échoue seulement sous le Cheverud-Nyholt avec Neff=370N_{\text{eff}} = 370, un estimateur qui sur-compte de façon démontrable quand les essais sont quasi-équicorrélés — et même le compte brut non ajusté de 640 ne fait descendre le DSR qu'à 0,748, pas à zéro. Le gagnant de la marche aléatoire, passé par les mêmes cinq estimateurs, est rejeté à chacun d'eux (il ne survit pour aucun NeffN_{\text{eff}} au-dessus de 1). C'est le vrai résultat : pas un chiffre chanceux isolé, mais un verdict stable sur l'ensemble de la bande des estimateurs standard du nombre effectif d'essais — ce qui est une preuve bien plus forte que de faire confiance à un seul d'entre eux.

Une mise en garde technique sur l'estimateur le plus grossier, car elle explique pourquoi il se trouve à l'extrémité faible : N/(1+(N1)ρˉ)N/(1+(N-1)\bar\rho) est en réalité le facteur de réduction de variance pour la moyenne de variables corrélées (combien l'agrégation vous rapporte sous corrélation ρˉ\bar\rho). Le benchmark du DSR est une quantité de valeur extrême — le maximum attendu des essais — donc utiliser un rétrécissement basé sur la variance de la moyenne comme nombre d'essais constitue une inadéquation fonctionnelle : juste dans la direction (corrélé ⇒ moins d'essais effectifs), mais pas la quantité dont dépend réellement la distribution du maximum. C'est exactement pourquoi les estimateurs basés sur les valeurs propres, au milieu de la bande, sont la lecture la plus fiable, et pourquoi c'est la bande, et non le point, qui constitue le livrable.

La leçon : utiliser les deux outils, et donner au DSR le bon N

Two complementary instruments aimed at the same search winner from different angles: one labeled with the question is the winner special within this search, needing an effective trial count dial, the other labeled does the best beat cash after data-snooping, driven by a bootstrap that reads the correlation straight off the data

Deux choses ressortent du Cas B, et les deux sont structurantes :

  1. La taille brute de la grille est le mauvais N pour le DSR dès que les essais sont corrélés — et aucun N effectif unique n'est le bon non plus. Injecter 640 dans une formule qui suppose l'indépendance sur-déflate : cela fabrique un plafond de bruit bien plus haut que ce que la recherche a réellement atteint et enterre les edges réels en dessous. Le DSR a besoin du nombre effectif d'essais — mais la solution n'est pas de faire confiance à un seul estimateur (encore moins au plus grossier, où la correction se désactive près de Neff=2N_{\text{eff}} = 2). C'est de lire le verdict sur l'ensemble de la bande d'estimateurs standard (ici 1,6 à 370) et de voir s'il est stable. Pour cet edge, il l'était : conservé partout où la déflation est réellement active (une véritable barre annuelle de 1,85-2,00 à Neff=16N_{\text{eff}} = 16-2121), échouant seulement sous un estimateur qui sur-compte. Un verdict stable sur toute la bande est bien plus solide qu'un chiffre isolé.
  2. Associer le DSR à un Reality Check. Notez que le Reality Check et son cousin de type SPA (studentisé) ont correctement traité le Cas B sans aucune chirurgie sur le nombre d'essais (p = 0,0024 et 0,0038) — ils gèrent nativement la dépendance, via le bootstrap stationnaire, parce qu'ils rééchantillonnent les véritables séries de rendements corrélées au lieu de compter des paris hypothétiquement indépendants. C'est l'arbitre de tout ce fatras du N effectif : le RC n'a besoin d'aucun NN. Le DSR et le RC répondent à des questions différentes : le DSR demande "le gagnant est-il spécial au sein de cette recherche ?" (et a besoin de savoir combien de regards effectifs la recherche a comportés) ; le RC/type SPA demandent "la meilleure règle bat-elle le cash après data-snooping ?" (et lisent la dépendance directement dans les données). Vous voulez les deux. Quand ils sont en désaccord — comme le DSR au compte brut et le RC ici — le désaccord est diagnostique : cela signifie généralement que votre NN est faux.

C'est le même avertissement structurel que nos études sur l'échelle de vitesse et sur la taxe IPC rencontraient déjà côté ingénierie — une recherche rapide qui parcourt une énorme grille corrélée ne vous achète pas un énorme nombre de paris indépendants, et traiter la taille de la grille comme le nombre d'essais trompe à la fois votre optimiseur et votre test de significativité. L'article compagnon à venir sur la probabilité de surapprentissage de backtest attaque le même biais de sélection depuis le côté du rééchantillonnage (CSCV), et s'associe naturellement à tout ce qui précède : le DSR tarife le gagnant, le PBO tarife la procédure.

Notes d'honnêteté

Trois mises en garde, énoncées clairement, car tout l'intérêt d'une étude contrôlée est de ne pas la survendre.

  • Les rendements sont synthétiques. Normale iid pour les expériences de calibration et de puissance, un processus à changement de régime pour le cas d'edge authentique — choisis pour la vérité terrain contrôlée, pas pour le réalisme de marché. Les vrais rendements sont à queues épaisses, autocorrélés et non stationnaires, et les termes d'asymétrie/kurtosis du PSR existent précisément pour gérer le premier de ces points. Le livrable ici est la méthode calibrée, pas une stratégie : on ne peut prouver qu'un test contrôle les fausses découvertes qu'en le faisant tourner sur des données où l'on sait qu'il n'y a rien à découvrir. Cela nécessite de fabriquer la vérité terrain.
  • Aucun estimateur de N effectif n'est canonique — c'est pourquoi nous en avons rapporté cinq. La formule à une ligne de corrélation moyenne Neff=N/(1+(N1)ρˉ)N_{\text{eff}} = N/(1 + (N-1)\bar\rho) est lisible pour un relecteur et correcte dans la direction (plus de corrélation ⇒ moins d'essais effectifs), mais c'est le facteur de réduction de variance pour une moyenne — une inadéquation fonctionnelle avec le benchmark de maximum du DSR — et près de Neff<2N_{\text{eff}} < 2, elle désactive entièrement la déflation. Les estimateurs par valeurs propres (ratio de participation, ACP-95%, Kaiser) sont mieux adaptés mais restent heuristiques, et Cheverud-Nyholt sur-compte sous équicorrélation. L'approche plus complète et principiée est le regroupement des essais (Annexe 3 du DSR de Bailey & López de Prado) : regrouper les essais par structure de corrélation et compter les grappes plutôt que de tout réduire à un seul scalaire. Nous rapportons toute la bande précisément parce que le choix n'est pas tranché — un verdict stable sur les cinq estimateurs est l'affirmation honnête ; un verdict qui dépendrait du choix d'un seul estimateur ne le serait pas.
  • Le bootstrap est un Reality Check studentisé, pas le SPA complet de Hansen, et le nombre de rééchantillonnages diffère selon l'expérience. Partout où cet article dit "type SPA", cela désigne le Reality Check de White avec studentisation par règle ; le recentrage cohérent et dépendant de l'échantillon complet de Hansen n'est pas implémenté. Les taux de fausses découvertes de la calibration utilisent 500 rééchantillonnages bootstrap stationnaires par recherche sur 400 recherches ; les deux p-values RC/type SPA des études de cas utilisent 5 000 rééchantillonnages chacune. Longueur moyenne de bloc de 20 tout du long (Politis-Romano), α=0,05\alpha = 0,05, 252 périodes/an pour l'annualisation. Changez ces paramètres et les chiffres à la troisième décimale bougent ; l'histoire — naïf 1,000 contre principié 0,001-0,057, une courbe en S atteignant 50 % de puissance juste au-dessus du plafond de bruit, et un piège de grille corrélée dont le verdict doit se lire sur la bande de N effectif — ne bouge pas.

Points à retenir

  1. Une recherche de paramètres est une machine à tests multiples, et le test de significativité naïf y est aveugle. Sur 1 000 stratégies à edge nul, le meilleur Sharpe annualisé atteint en moyenne 1,63 avec une p-value médiane de test unique de 0,000686 — et le test "est-ce significatif ?" déclare une découverte 100 % du temps (taux de fausses découvertes 1,000). Un excellent Sharpe sorti de nulle part, certifié significatif par un test qui ne posait jamais la bonne question.
  2. Le Deflated Sharpe Ratio déplace le but de zéro au plafond de bruit. Le DSR compare le gagnant non pas à zéro mais à SR0SR_0, le meilleur attendu par chance d'une recherche de cette taille — qui pour le cas nul atteint un 1,63 annualisé, exactement là où se situe le gagnant moyen du bruit (calcul : 0,1030×2520,1030 \times \sqrt{252}). Son taux de fausses découvertes nul est 0,001 ; la coupe de cheveux de Harvey-Liu (Bonferroni/Holm 0,057, BHY 0,007) et le Reality Check de White (0,022) atteignent le même contrôle par d'autres voies.
  3. Il conserve les edges réels. La puissance de détection du DSR trace une courbe en S atteignant 50 % de puissance à un Sharpe annualisé d'environ 1,73 — juste au-dessus du plafond de bruit de 1,63 : 0,005 à un vrai Sharpe annualisé de 0,79, 0,651 à 1,90, 0,998 à 2,54, 1,000 à 3,17, faux positifs ~0 tout du long. Les edges en dessous du plafond sont correctement jugés indiscernables de la chance ; les edges au-dessus sont conservés avec une puissance approchant un.
  4. Les grilles corrélées cassent le DSR brut — et aucun N effectif unique ne le sauve ; c'est la bande qui le fait. Sur une grille MA crossover à 640 cellules (corrélation moyenne par paire ~0,61), le DSR au compte brut a faussement rejeté un edge authentique (in-sample sélectionné, annuel 3,92) (0,748 < 0,95) parce que 640 essais corrélés ne sont pas 640 paris indépendants. Mais la solution n'est pas un seul NeffN_{\text{eff}} magique — à l'estimation la plus grossière (Neff1,6N_{\text{eff}} \approx 1,6), la déflation est essentiellement désactivée (barre ~annuelle 0,25) et le DSR ne fait qu'écho à la significativité brute. La véritable preuve est que l'edge est conservé sur toute la bande des estimateurs standard — DSR 1,000/1,000/1,000/0,999 à Neff=N_{\text{eff}} = 1,6/2,4/16/21, incluant une véritable barre annuelle de 1,85-2,00 au juste milieu défendable ACP-95%/Kaiser — survivant pour tout Neff<145N_{\text{eff}} < 145, et échouant seulement sous le Cheverud-Nyholt sur-comptant à 370. La marche aléatoire est rejetée à chaque estimateur. Lisez la bande, pas un point.
  5. Associez le DSR à un Reality Check, car ils répondent à des questions différentes. Le Reality Check et son cousin de type SPA (studentisé) ont confirmé l'edge réel (p = 0,0024 et 0,0038) sans aucune chirurgie sur le nombre d'essais — ils gèrent nativement la dépendance via le bootstrap stationnaire, ce qui est exactement l'arbitre quand le N effectif est contesté. Le DSR demande "le gagnant est-il spécial au sein de cette recherche ?" ; le RC/type SPA demandent "le meilleur bat-il le cash après data-snooping ?" Un désaccord entre eux est un signal que votre NN est faux. Faites tourner les deux.

Le gagnant d'une recherche est coupable jusqu'à preuve du contraire. La p-value naïve n'est pas une preuve d'innocence — c'est le témoignage gonflé de la recherche elle-même, et elle se portera garante du pur bruit avec douze zéros de confiance. Déflatez le benchmark à ce que la chance délivre, comptez honnêtement vos essais effectifs, et bootstrappez le maximum pour un second avis. Ce qui franchit les trois barres pourrait bien être réel. Ce qui ne franchit que la naïve est le plus grand parmi mille lanceurs de pièce.

L'expérience complète — le harnais de calibration nulle, le balayage de puissance à edge implanté, les recherches en grille corrélée, et chaque chiffre de cet article régénérable à partir d'un seul script déterministe — se trouve dans l'article compagnon sur deflated-sharpe.marketmaker.cc, avec le code et les données sur github.com/suenot/deflated-sharpe-search.

blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Gardez une longueur d'avance sur le marché

Abonnez-vous à notre newsletter pour des insights exclusifs sur le trading IA, des analyses de marché et des mises à jour de la plateforme.

Nous respectons votre vie privée. Désabonnement possible à tout moment.