← Voltar aos artigos
June 29, 2026
5 min read

O Deflated Sharpe Ratio: Quantos dos seus 'vencedores' de backtest sobrevivem ao multiple testing?

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

Parte da série "Backtests Without Illusions".

📄 Este artigo se transformou em um paper de pesquisa. Todo número abaixo vem de um único script determinístico que constrói uma verdade fundamental controlada — buscas em ruído puro, buscas com edge plantado e um grid de parâmetros correlacionado real — e então executa o Deflated Sharpe Ratio, o haircut de multiple-testing de Harvey-Liu e o Reality Check de White / SPA de Hansen contra ela, medindo diretamente a taxa de falsos positivos e o poder de detecção de cada método. Leia o paper online (versão interativa + PDF) em deflated-sharpe.marketmaker.cc, código e dados em github.com/suenot/deflated-sharpe-search.

Você roda um parameter sweep. Dezesseis comprimentos rápidos, quarenta lentos, 640 combinações de um cruzamento de médias móveis. O grid termina e uma célula brilha: um Sharpe anualizado de 3,9, um p-value de teste único de 6×10126\times10^{-12}. Doze zeros de significância. Você encontrou algo.

Ou você não encontrou nada, e a busca encontrou isso por você.

Uma busca de parâmetros não é um teste. É uma máquina para encontrar a mais sortuda entre N tentativas, e quanto mais tentativas você lhe dá, mais sortudo parece seu vencedor — com ou sem qualquer edge real por baixo. O melhor-dentre-N Sharpe é inflado por seleção da mesma forma que a mais alta entre mil pessoas aleatórias é alta: não porque a altura seja real, mas porque você procurou. As estatísticas de teste único impressas ao lado do vencedor — seu p-value, seu t-stat, seu "é significativo?" — foram desenhadas para uma hipótese pré-registrada. Alimente-as com o sobrevivente de uma busca e elas mentem, com confiança, sempre.

Este artigo mede exatamente o quão mal elas mentem, e depois mede três ferramentas que corrigem isso. O ponto central é uma verdade fundamental controlada: geramos retornos onde nós sabemos a resposta — às vezes ruído puro com zero de edge, às vezes um edge plantado de força conhecida — de modo que "o método acertou?" é um fato, não uma opinião. Aqui está a manchete, de saída. Em buscas de nulo conhecido, onde a resposta honesta é sempre "nenhuma descoberta", esta é a frequência com que cada teste grita lobo:

Teste Taxa de falsos positivos em buscas de nulo conhecido Veredito
"O melhor Sharpe é significativo?" ingênuo 1,000 aponta uma descoberta toda vez
Deflated Sharpe Ratio (DSR ≥ 0,95) 0,001 controlado
Haircut de Harvey-Liu — Bonferroni 0,057 ~controlado
Haircut de Harvey-Liu — Holm 0,057 ~controlado
Haircut de Harvey-Liu — BHY 0,007 controlado
Reality Check de White (bootstrap) 0,022 controlado

1.000 estratégias por busca, 1.000 observações cada, 2.000 buscas nulas independentes, Sharpe verdadeiro = 0 em todos os casos. Retornos Normais iid sintéticos, seed 0, α = 0,05, 252 períodos/ano. A taxa de falsos positivos do teste ingênuo não é alta — é exatamente um.

Leia a primeira linha até doer. Um teste que deveria disparar 5% das vezes em ruído puro dispara 100% das vezes — porque você não está mostrando a ele ruído puro, você está mostrando a ele o máximo de mil sorteios de ruído puro, e o máximo de mil lançadores de moeda sempre parece um gênio. Toda outra linha é um método que sabe disso e corrige. Este é o artigo inteiro: por que a primeira linha é 1,000, por que as outras não são, e o único lugar (a última seção) onde até os bons métodos precisam de uma segunda correção para se manterem honestos.

Ato 1 — A armadilha: uma busca fabrica Sharpe do nada

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

Comece com a armadilha mais limpa possível. Gere N=1000N = 1000 estratégias cujos retornos são ruído Normal padrão independente — sem drift, sem skill, Sharpe verdadeiro exatamente zero para todas elas. Cada uma tem T=1000T = 1000 observações. Agora faça o que toda busca de parâmetros faz: mantenha a melhor.

O melhor-dentre-1000 Sharpe por observação tem média 0,1027, o que anualiza para 1,63 (derivado: 0,1027×2521,630,1027 \times \sqrt{252} \approx 1,63). Esse não é um número modesto. Um Sharpe anualizado de 1,63 é o tipo de resultado que faz uma estratégia ser financiada, publicada, alocada. Ele veio de um gerador de números aleatórios com o drift ajustado para zero.

Agora entregue o vencedor ao teste de significância ingênuo — aquele que toda biblioteca de backtest imprime de graça. Converta seu Sharpe em uma estatística t (t=SR^Tt = \hat{SR}\sqrt{T}), pegue o p-value unicaudal, chame de descoberta se p<0,05p < 0,05:

t=SR^T,p=1Z(t),"descoberta" se p<αt = \hat{SR}\sqrt{T}, \qquad p = 1 - Z(t), \qquad \text{"descoberta" se } p < \alpha

O p-value mediano de teste único desses vencedores de ruído é 0,000686 — três zeros de "significância" de uma estratégia sem edge. E entre 2.000 buscas nulas independentes, o teste ingênuo declara uma descoberta em todas elas: uma taxa de falsos positivos de 1,000. Não "inflada". Não "um pouco alta". Um teste que está certo, por construção, no máximo 5% das vezes em uma única hipótese nula está errado 100% das vezes no vencedor de uma busca.

O mecanismo não é sutil, uma vez nomeado. O teste ingênuo pergunta "esse Sharpe poderia surgir por acaso sob o nulo?" — uma pergunta justa para uma estratégia que você escolheu antes de olhar os dados. Mas você escolheu esta porque ela tinha o maior Sharpe entre mil. Você condicionou no máximo, e a distribuição amostral de um máximo não se parece em nada com a distribuição amostral de um único sorteio. É a mesma doença que nossa taxonomia de look-ahead bias diagnosticou pelo outro lado — lá, um vazamento de uma barra fabricou um Sharpe de 15 a partir de ruído; aqui, uma busca fabrica um Sharpe de 1,63 a partir de ruído sem vazamento algum, puramente por seleção. Mecanismo diferente, sintoma idêntico: um Sharpe de ótima aparência que não significa nada.

O número 1,63 é o importante, então guarde-o. Ele é o teto de ruído para esta busca: o Sharpe que você deveria esperar que a mais sortuda entre 1.000 estratégias de edge zero postasse. Qualquer teste honesto de um vencedor de busca precisa compará-lo não contra zero, mas contra isso — contra o que a sorte sozinha entrega quando você olha mil vezes.

Ato 2 — O kit de ferramentas: três formas de precificar a busca

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

Três programas de pesquisa, chegando independentemente, todos alcançam a mesma correção: parar de comparar o vencedor com zero, e passar a compará-lo com o que uma busca deste tamanho produz por sorte. Eles diferem em como constroem essa comparação.

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

O Probabilistic Sharpe Ratio faz uma pergunta mais afiada que "o Sharpe é positivo?" Ele pergunta: dado o comprimento da amostra e o formato dos retornos (skew, caudas gordas), qual é a probabilidade de o Sharpe verdadeiro exceder um 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)

Aqui ZZ é a CDF Normal padrão, γ^3\hat\gamma_3 o skew, e γ^4\hat\gamma_4 a curtose na convenção não-excedente (Normal ⇒ γ^4=3\hat\gamma_4 = 3; substitua por curtose excedente aqui sem somar 3 e a deflação sai errada). Defina SR=0SR^* = 0 e o PSR é apenas um teste de significância em amostra finita. A mágica está em escolher bem o SRSR^*.

O Deflated Sharpe Ratio é o PSR avaliado em um benchmark que não é zero, mas o máximo Sharpe esperado de toda a busca:

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)

onde Var[{SRn}]\operatorname{Var}[\{SR_n\}] é a variância entre todos os N Sharpes de trial (a dispersão que a própria busca produziu), γ0,5772\gamma \approx 0,5772 é a constante de Euler-Mascheroni, e os dois termos de Normal inversa são a aproximação de Teoria de Valores Extremos para o máximo esperado de NN sorteios Normais padrão. Em código, é curto demais para impressionar:

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))

Então o DSR é simplesmente o PSR com essa barra deflacionada:

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

O DSR é uma probabilidade. Declaramos uma descoberta quando DSR1α=0,95\text{DSR} \geq 1 - \alpha = 0,95: o Sharpe verdadeiro do vencedor supera o melhor esperado por sorte com 95% de confiança. Note a suposição estrutural embutida no SR0SR_0: os NN trials são tratados como independentes. O Ato 5 é inteiramente sobre o que acontece quando não são.

O haircut de Harvey-Liu (2015)

Harvey e Liu atacam o mesmo problema via ajustes de p-value de multiple-testing — a maquinaria clássica de "eu rodei M testes, não me deixe me enganar". Ordene os MM p-values de teste único p(1)p(M)p_{(1)} \le \dots \le p_{(M)} e infle-os:

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 é o instrumento contundente (controla a probabilidade de qualquer falso positivo multiplicando cada p-value por MM); Holm é sua prima em degraus, uniformemente mais poderosa. O terceiro, Benjamini-Yekutieli (BHY), controla a taxa de falsos positivos (false-discovery rate) — a fração esperada de suas rejeições que estão erradas — e, crucialmente, faz isso sob dependência arbitrária entre os testes, usando o normalizador harmônico no numerador:

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

Esse c(1000)=7,49c(1000) = 7,49 é o preço que o BHY cobra por não assumir que seus 1.000 trials são independentes — ele infla o limiar de FDR por um fator que cresce como lnM\ln M. O "haircut" em si é a métrica-chave: converta o p-value ajustado de volta em Sharpe e reporte quanto do Sharpe original você teve que cortar. Um haircut de 100% significa que o vencedor é inteiramente explicado por multiple testing; 15% significa que ele sobrevive em sua maior parte.

O Reality Check de White e o SPA de Hansen (2000 / 2005)

A terceira ferramenta não faz nenhuma suposição distribucional. O Reality Check de White pega os retornos reais de cada regra, forma a estatística de máximo entre regras, e faz bootstrap de sua distribuição nula diretamente:

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

onde fˉk\bar{f}_k é o desempenho médio da regra kk sobre o benchmark. Ele reamostra os retornos com o stationary bootstrap (Politis-Romano — blocos de comprimento aleatório para que a correlação serial sobreviva à reamostragem), recentraliza cada sorteio para satisfazer o nulo por construção, recalcula o máximo em cada sorteio, e reporta o p-value como a fração de máximos de bootstrap que superam o observado. O SPA de Hansen aprimora o RC de duas formas: studentização (divide a média de cada regra pelo seu próprio erro padrão, para que uma regra selvagem de alta variância não sequestre o máximo) e uma recentralização consistente e dependente da amostra do nulo. Nossa implementação adiciona a studentização, mas não a etapa completa de recentralização consistente — então onde quer que este artigo reporte um p-value do tipo SPA, leia como um Reality Check studentizado, não o SPA completo de Hansen. Onde o DSR pergunta "o vencedor é especial dentro desta busca?", o Reality Check pergunta "a melhor regra bate o caixa depois de contabilizar honestamente quantas regras eu tentei?" — e ele lida com regras correlacionadas nativamente, via bootstrap, sem nunca contar trials. Guarde essa distinção; a última seção gira em torno dela.

Ato 3 — A calibração é a prova inteira

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

Um método que não aponta nada também teria uma taxa de falsos positivos de zero — e seria inútil. Então o único teste significativo dessas ferramentas é um teste de dois lados: em dados de nulo conhecido elas precisam controlar falsos positivos em ou abaixo de α\alpha, e em dados de edge conhecido (próxima seção) elas ainda precisam disparar. Esta seção é a primeira metade.

Rode 2.000 buscas independentes, cada uma sobre 1.000 estratégias de edge zero, e conte quantas vezes cada método declara uma descoberta. Essa contagem, dividida por 2.000, é a taxa de falsos positivos — e como a verdade é sem edge, toda descoberta é falsa:

Teste Taxa de falsos positivos (α = 0,05)
Significância ingênua 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

Todo método fundamentado pousa em ou perto da linha de 5% — os dois haircuts de FWER um pouco acima dela, DSR/BHY/RC abaixo — enquanto o teste ingênuo fica em 100. (Bonferroni e Holm imprimem o mesmo 0,057 aqui, e não por sorte: para a única estratégia melhor, o primeiro passo de Holm é (M1+1)p(1)=Mp(1)(M-1+1)\,p_{(1)} = M\,p_{(1)}, idêntico a Bonferroni por construção, então é uma confirmação, não duas.) Mas o número mais profundo de todo o estudo não está nesta tabela — é o benchmark deflacionado que produz a coluna DSR. Em média entre as buscas nulas, o SR0SR_0 sai em um 0,1030 por observação, que anualiza para 1,63 (derivado: 0,1030×2521,630,1030 \times \sqrt{252} \approx 1,63) — o mesmo 1,63 que o vencedor médio de ruído posta (1,63). Isso não é coincidência; é a ideia inteira funcionando:

A barra deflacionada fica exatamente no teto de ruído. O DSR não pede que um vencedor de busca supere zero. Ele pede que o vencedor supere a melhor pontuação que a sorte sozinha produz de uma busca deste tamanho — 1,63 anualizado aqui. Um vencedor que apenas iguala o teto de ruído pontua DSR ≈ 0,5 (uma cara-ou-coroa), razão pela qual o DSR médio nulo é 0,495, não algo pequeno. Para ser uma descoberta, o vencedor precisa superar 1,63 e mais um pouco — o suficiente para empurrar o PSR além de 0,95.

Isso reenquadra todo o exercício. O teste ingênuo mede distância de zero; toda busca supera essa barra trivialmente, razão pela qual ele é inútil. O DSR mede distância do teto de ruído, e superar essa barra é genuinamente difícil — como deveria ser. O haircut de Harvey-Liu e o Reality Check alcançam o mesmo controle por caminhos diferentes (uma inflação c(1000)=7,49c(1000)=7,49 para o BHY, uma distribuição de máximo por bootstrap para o RC), e pousam na mesma vizinhança: 0,001 a 0,057, em ou perto de α\alpha. O 0,057 de Bonferroni/Holm está um fio acima da linha de 5%, mas só um pouco: com 2.000 buscas de Monte Carlo, o erro padrão em uma estimativa de FDR perto de 0,05 é cerca de 0,005, então 0,057 fica aproximadamente 1,4 desvios padrão acima de α\alpha — ruído de Monte Carlo, não uma garantia quebrada. "Controla FWER" é uma promessa assintótica de qualquer forma, não exata em bits para T=1000T = 1000.

Ato 4 — Poder: ele ainda mantém os edges reais?

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

Controlar falsos positivos é só metade de um teste — um método paranoico que rejeita tudo pontua um perfeito 0,000 e é inútil. A outra metade: quando um edge genuíno está presente, o DSR o encontra?

Plante um. Em um campo de 1.000 estratégias, faça 25 delas carregarem um edge real de força conhecida e deixe o resto como ruído, então rode a busca e pergunte se o DSR aponta o vencedor. Varra o edge plantado de fraco a forte e o poder de detecção traça uma curva em S limpa (taxa de falso positivo mantida em ~0 durante todo o processo):

Sharpe verdadeiro plantado (anualizado) Poder de detecção do DSR Taxa de falso positivo do 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

Observe onde a curva vira. Abaixo do teto de ruído — um Sharpe anualizado verdadeiro de 0,79, bem abaixo de 1,63 — o DSR dispara 0,5% das vezes, corretamente se recusando a chamá-lo: um edge tão fraco é genuinamente indistinguível da sorte que uma busca de 1.000 trials gera, e fingir o contrário seria desonesto, não poderoso. Bem ao redor do teto a curva sobe abruptamente (0,09 em 1,27, 0,65 em 1,90). Em um Sharpe anualizado de 2,54 o poder é 0,998; em 3,17 é um perfeito 1,000. Edges fortes são retidos essencialmente sempre, falsos positivos ficam presos em zero, e o cruzamento de 50% de poder fica em um Sharpe anualizado de cerca de 1,73 (derivado por interpolação entre as linhas 1,27 e 1,90) — logo acima do teto de ruído de 1,63, exatamente onde uma barra honesta deveria colocá-lo: o ponto onde um edge começa a superar o que uma busca de 1.000 trials inventa.

Essa é a propriedade que você realmente quer, declarada como uma curva em S: edges abaixo do teto de ruído são corretamente descartados como sorte; edges confortavelmente acima dele são mantidos com poder se aproximando de um. O teste ingênuo, por contraste, "detecta" o edge plantado 67% das vezes mesmo em um Sharpe verdadeiro de 0,79 — mas esse número não tem significado, porque já vimos que ele detecta um edge inexistente 100% das vezes. Um teste que dispara em tudo não tem poder; não tem discriminação. O DSR troca um pouco de sensibilidade a edges marginais (as linhas 0,79 e 1,27) pela coisa que importa: suas descobertas são reais.

Ato 5 — A armadilha do praticante: grids correlacionados

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

Tudo até agora usou estratégias independentes — o cenário mais limpo possível, e aquele onde a suposição de independência do DSR vale exatamente. Grids de parâmetros reais não são assim, e é aqui que uma ferramenta usada ingenuamente vira uma nova forma de estar errado.

Pegue uma busca honesta de cruzamento de médias móveis: 16 comprimentos rápidos ×\times 40 lentos =640= 640 trials, cada um com 755 observações. Um grid assim está encharcado em correlação — fast=45/slow=120 e fast=45/slow=125 são quase a mesma estratégia, então suas séries de retorno se movem juntas. Correlação pareada média medida entre os 640 trials: cerca de 0,61. Essas não são 640 apostas independentes. Nem de longe.

Caso A — passeio aleatório (sem edge): todo método o elimina, corretamente

Rode o grid sobre um passeio aleatório puro. O vencedor parece tentador: params fast=45/slow=120, melhor Sharpe anualizado 0,81, p-value de teste único 0,081. Todo método enxerga através dele:

Método Resultado Veredito
DSR (K bruto = 640) 0,431 rejeita (< 0,95)
p do Reality Check 0,570 rejeita
p do tipo SPA (RC studentizado) 0,569 rejeita
Haircut de Harvey-Liu 100% rejeita

Comece pelo sinal que não precisa de nenhuma deflação: mesmo a significância de amostra finita não ajustada deste vencedor, PSR\text{PSR}-vs-zero, é apenas 0,918 — já aquém de 0,95 antes mesmo de corrigirmos por um único dos 640 trials. A deflação então o enterra: a barra é um SR0SR_0 por observação de 0,057, um ~0,91 anualizado (derivado: 0,057×2520,057 \times \sqrt{252}) — acima do 0,81 do vencedor. A melhor estratégia nem sequer alcança o teto de ruído, DSR ≈ 0,43 (pior que cara-ou-coroa), e o Reality Check, o teste do tipo SPA e um haircut de 100% concordam: nada aqui. Perfeito. Este é o caso fácil, e funciona — e, como veremos, permanece rejeitado em todas as contagens de trials efetivos que tentarmos.

Caso B — um edge de regime genuíno: o DSR bruto erra

Agora rode o mesmo grid sobre uma série de troca de regime que carrega um edge real, explorável. O vencedor é enfático: params fast=3/slow=55, melhor Sharpe anualizado 3,92 — este é o Sharpe in-sample, selecionado, ele próprio inflado por seleção pela busca (não um edge verdadeiro ou out-of-sample), mas o efeito de regime subjacente é genuíno — com um p-value de teste único de 6×10126\times10^{-12} e significância não deflacionada PSR\text{PSR}-vs-zero de essencialmente 1,000. Há um edge real aqui e o vencedor o encontrou. Observe o DSR bruto rejeitá-lo mesmo assim:

Método Resultado Veredito
DSR (K bruto = 640) 0,748 rejeita (< 0,95) ✗ deflacionado em excesso
p do Reality Check 0,0024 confirma ✓
p do tipo SPA (RC studentizado) 0,0038 confirma ✓
Haircut de Harvey-Liu 15% confirma ✓

O DSR bruto de 0,748 é uma falsa rejeição de um edge genuíno. A razão é a suposição de independência, agora violada gravemente: o DSR construiu sua barra deflacionada tratando 640 trials correlacionados como 640 sorteios independentes, o que infla o máximo esperado SR0SR_0 para um 0,221 por observação — ~3,51 anualizado (derivado: 0,221×2520,221 \times \sqrt{252}). Contra uma barra de 3,51, um vencedor de 3,92 a supera apenas modestamente, e o DSR pousa em 0,748 — aquém de 0,95. Duas coisas inflam essa barra: a contagem bruta (640 olhares em vez de um punhado de olhares efetivos), e a dispersão genuína de skill entre os trials — alguns pares de parâmetros realmente são melhores em uma série de regime, o que amplia Var[{SRn}]\operatorname{Var}[\{SR_n\}] e eleva o SR0SR_0 além do que a sorte pura sozinha entregaria. Ambos empurram na mesma direção, e a barra termina alta demais porque a busca nunca foi realmente 640 olhares independentes; foram algumas apostas independentes, amostradas 640 vezes.

Alimente o DSR com o número efetivo de trials em vez disso. A linha única usada acima é uma estimativa grosseira a partir da correlação pareada média:

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))

Com ρˉ0,62\bar\rho \approx 0,62 e N=640N = 640, isso colapsa o grid para um Neff1,6N_{\text{eff}} \approx 1,6 trials efetivos (derivado: 640/(1+639×0,62)640 / (1 + 639 \times 0,62)), e o DSR salta para 1,000. Mas pare antes de comemorar esse número, porque ele é a evidência mais fraca de toda esta seção. Em Neff1,6N_{\text{eff}} \approx 1,6 a barra deflacionada colapsa para um SR0SR_0 anualizado 0,25\approx 0,25 — essencialmente a média dos trials, essencialmente zero. A deflação ali está desligada: o DSR em Neff1,6N_{\text{eff}} \approx 1,6 está apenas reportando de volta a significância de amostra finita não deflacionada do vencedor (PSR\text{PSR}-vs-zero =1,000= 1,000). O veredito é herdado da significância bruta, não produzido pela correção de multiple testing. E a ressalva espelhada do lado do passeio aleatório: sua rejeição em Neff1,6N_{\text{eff}} \approx 1,6 vale apenas porque aquele vencedor já era marginal de forma independente para começar (PSR\text{PSR}-vs-zero =0,918<0,95= 0,918 < 0,95). Ancore todo o argumento em 1,6 e um cético estaria certo em duvidar: você desligou a correção e reportou o que estava por baixo.

Então não ancore em um único estimador. O movimento honesto — e o mais forte — é calcular NeffN_{\text{eff}} de cinco formas padrão diferentes e ler o veredito em toda a faixa. Aqui estão cinco estimadores aplicados ao mesmo grid de sinal de 640 trials, cada um com a barra deflacionada que ele implica e o DSR que produz:

Estimador de trials efetivos NeffN_{\text{eff}} Barra deflacionada SR0SR_0 (anual) DSR Veredito
Correlação média 1,6 0,25 1,000 mantém
Razão de participação 2,4 0,43 1,000 mantém
PCA (95% da variância) 16 1,85 1,000 mantém
Kaiser (autovalores > 1) 21 2,00 0,999 mantém
Cheverud-Nyholt 370 3,31 0,845 rejeita
contagem bruta do grid (sem ajuste) 640 3,51 0,748 rejeita

Estimadores: correlação média é a fórmula N/(1+(N1)ρˉ)N/(1+(N-1)\bar\rho) acima; razão de participação (λi)2/λi2(\sum\lambda_i)^2/\sum\lambda_i^2 e as contagens PCA-95%/Kaiser leem a dimensionalidade efetiva a partir dos autovalores da matriz de correlação; Cheverud-Nyholt é um estimador de variância de autovalores da literatura de genética conhecido por superestimar sob quase-equicorrelação.

Agora o ponto se estabelece, e não é "qualquer ajuste te salva". Observe o meio-termo defensável — PCA-95% (Neff=16N_{\text{eff}} = 16) e Kaiser (Neff=21N_{\text{eff}} = 21). Estes não são o regime de deflação desligada; eles impõem uma barra SR0SR_0 anualizada real de 1,85 a 2,00 — um haircut sério, bem acima do ruído, uma penalidade genuína de multiple testing para 16-21 olhares efetivos. E o edge de 3,92 ainda a supera (DSR 1,000 e 0,999). O sinal sobrevive ao DSR para qualquer NeffN_{\text{eff}} abaixo de 144,8 (derivado do ponto de cruzamento); ele falha apenas sob o Neff=370N_{\text{eff}} = 370 de Cheverud-Nyholt, um estimador que comprovadamente superestima quando os trials são quase-equicorrelacionados — e mesmo a contagem bruta e não ajustada de 640 só empurra o DSR para baixo até 0,748, não até zero. O vencedor do passeio aleatório, rodado pelos mesmos cinco estimadores, é rejeitado em todos eles (não sobrevive para nenhum NeffN_{\text{eff}} acima de 1). Esse é o resultado real: não um único número sortudo, mas um veredito estável em toda a faixa de estimadores padrão de trials efetivos — o que é uma evidência muito mais forte do que confiar em qualquer um deles isoladamente.

Uma ressalva técnica sobre o estimador mais grosseiro, porque explica por que ele fica no extremo mais fraco: N/(1+(N1)ρˉ)N/(1+(N-1)\bar\rho) é na verdade o fator de redução de variância para a média de variáveis correlacionadas (quanto a média compra sob correlação ρˉ\bar\rho). O benchmark do DSR é uma quantidade de valor extremo — o máximo esperado dos trials — então usar uma redução de variância de média como sua contagem de trials é um descompasso funcional: correto na direção (correlacionado ⇒ menos trials efetivos), mas não a quantidade da qual a distribuição do máximo realmente depende. É exatamente por isso que os estimadores baseados em autovalores no meio da faixa são a leitura mais confiável, e por que a faixa, não o ponto, é o entregável.

A lição: use as duas ferramentas, e alimente o DSR com o N correto

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

Duas coisas se depreendem do Caso B, e ambas são estruturais:

  1. O tamanho bruto do grid é o N errado para o DSR sempre que os trials são correlacionados — e nenhum N efetivo único é o certo também. Colocar 640 em uma fórmula que assume independência deflaciona em excesso: fabrica um teto de ruído muito mais alto do que a busca de fato alcançou e enterra edges reais sob ele. O DSR precisa da contagem efetiva de trials — mas a correção não é confiar em um único estimador (muito menos o mais grosseiro, onde a correção se desliga perto de Neff=2N_{\text{eff}} = 2). É ler o veredito em toda a faixa de estimadores padrão (aqui 1,6 a 370) e ver se ele é estável. Para este edge, foi: mantido em todo lugar onde a deflação está genuinamente ativa (uma barra anual real de 1,85-2,00 em Neff=16N_{\text{eff}} = 16-2121), falhando apenas sob um estimador que superestima. Um veredito estável em toda a faixa é muito mais forte do que qualquer número isolado.
  2. Combine o DSR com um Reality Check. Note que o Reality Check e sua prima do tipo SPA (studentizada) acertaram o Caso B sem nenhuma cirurgia de contagem de trials (p = 0,0024 e 0,0038) — eles lidam com dependência nativamente, via stationary bootstrap, porque reamostram as séries de retorno correlacionadas reais em vez de contar apostas hipoteticamente independentes. Esse é o desempate para toda a confusão de N efetivo: o RC não precisa de NN. DSR e RC respondem perguntas diferentes: o DSR pergunta "o vencedor é especial dentro desta busca?" (e precisa saber quantos olhares efetivos a busca deu); o RC/tipo SPA pergunta "a melhor regra bate o caixa depois do data-snooping?" (e lê a dependência diretamente dos dados). Você quer os dois. Quando eles discordam — como o DSR de contagem bruta e o RC fizeram aqui — a discordância é diagnóstica: geralmente significa que seu NN está errado.

Esse é o mesmo alerta estrutural que nossos estudos speed-ladder e IPC-tax já haviam encontrado pelo lado da engenharia — uma busca rápida que roda um grid correlacionado enorme não está te comprando um número enorme de apostas independentes, e tratar o tamanho do grid como contagem de trials engana tanto seu otimizador quanto seu teste de significância. O companheiro futuro sobre a probabilidade de overfitting de backtest ataca o mesmo viés de seleção pelo lado da reamostragem (CSCV), e combina naturalmente com tudo aqui: o DSR precifica o vencedor, o PBO precifica o procedimento.

Notas de honestidade

Três ressalvas, ditas claramente, porque todo o ponto de um estudo controlado é não superestimá-lo.

  • Os retornos são sintéticos. Normal iid para os experimentos de calibração e poder, um processo de troca de regime para o caso de edge genuíno — escolhidos por verdade fundamental controlada, não por realismo de mercado. Retornos reais têm caudas gordas, são autocorrelacionados e não-estacionários, e os termos de skew/curtose do PSR existem precisamente para lidar com o primeiro desses. O entregável aqui é o método calibrado, não uma estratégia: só podemos provar que um teste controla falsos positivos rodando-o em dados onde nós sabemos que não há nada a descobrir. Isso exige fabricar a verdade fundamental.
  • Nenhum estimador de N efetivo é canônico — por isso reportamos cinco. A fórmula única de correlação média Neff=N/(1+(N1)ρˉ)N_{\text{eff}} = N/(1 + (N-1)\bar\rho) é legível por revisores e corretamente direcionada (mais correlação ⇒ menos trials efetivos), mas é o fator de redução de variância para uma média — um descompasso funcional com o benchmark de máximo do DSR — e perto de Neff<2N_{\text{eff}} < 2 ela desliga a deflação inteiramente. Os estimadores de autovalores (razão de participação, PCA-95%, Kaiser) são mais bem ajustados mas ainda heurísticos, e Cheverud-Nyholt superestima sob equicorrelação. A abordagem mais completa e fundamentada é o clustering de trials (Apêndice 3 do DSR de Bailey & López de Prado): agrupar trials por estrutura de correlação e contar clusters em vez de colapsar tudo em um único escalar. Reportamos a faixa inteira precisamente porque a escolha não está resolvida — um veredito estável em todos os cinco estimadores é a afirmação honesta; uma que dependesse de escolher um único estimador não seria.
  • O bootstrap é um Reality Check studentizado, não o SPA completo de Hansen, e as contagens de reamostragem diferem por experimento. Onde quer que este artigo diga "tipo SPA", significa Reality Check de White com studentização por regra; a recentralização completa, consistente e dependente da amostra de Hansen não está implementada. As taxas de falsos positivos de calibração usam 500 reamostras de stationary bootstrap por busca em 400 buscas; os dois p-values de RC/tipo SPA dos estudos de caso usam 5.000 reamostras cada. Comprimento médio de bloco 20 em todos os casos (Politis-Romano), α=0,05\alpha = 0,05, 252 períodos/ano para anualização. Mude isso e os números na terceira casa decimal se movem; a história — ingênuo 1,000 versus fundamentado 0,001-0,057, uma curva em S alcançando 50% de poder logo acima do teto de ruído, e uma armadilha de grid correlacionado cujo veredito precisa ser lido em toda a faixa de N efetivo — não muda.

Conclusões

  1. Uma busca de parâmetros é uma máquina de multiple testing, e o teste de significância ingênuo é cego a isso. Em 1.000 estratégias de edge zero, o melhor Sharpe anualizado tem média 1,63 com mediana de p-value de teste único de 0,000686 — e o teste "é significativo?" declara uma descoberta 100% das vezes (taxa de falsos positivos 1,000). Um ótimo Sharpe do nada, certificado como significativo por um teste que nunca fez a pergunta certa.
  2. O Deflated Sharpe Ratio move o gol de zero para o teto de ruído. O DSR compara o vencedor não contra zero mas contra SR0SR_0, o melhor esperado por sorte de uma busca deste tamanho — que, para o caso nulo, pousa em um 1,63 anualizado, exatamente onde fica o vencedor médio de ruído (derivado: 0,1030×2520,1030 \times \sqrt{252}). Sua taxa de falsos positivos nula é 0,001; o haircut de Harvey-Liu (Bonferroni/Holm 0,057, BHY 0,007) e o Reality Check de White (0,022) alcançam o mesmo controle por outros caminhos.
  3. Ele mantém os edges reais. O poder de detecção do DSR traça uma curva em S que alcança 50% de poder em um Sharpe anualizado de ~1,73 — logo acima do teto de ruído de 1,63: 0,005 em um Sharpe verdadeiro anualizado de 0,79, 0,651 em 1,90, 0,998 em 2,54, 1,000 em 3,17, falsos positivos ~0 durante todo o processo. Edges abaixo do teto são corretamente considerados indistinguíveis de sorte; edges acima dele são retidos com poder se aproximando de um.
  4. Grids correlacionados quebram o DSR bruto — e nenhum N efetivo único o resgata; a faixa sim. Em um cruzamento de MA de 640 células (correlação pareada média ~0,61), o DSR de contagem bruta rejeitou falsamente um edge genuíno (selecionado in-sample, anual 3,92) (0,748 < 0,95) porque 640 trials correlacionados não são 640 apostas independentes. Mas a correção não é um único NeffN_{\text{eff}} mágico — na estimativa mais grosseira (Neff1,6N_{\text{eff}} \approx 1,6) a deflação está essencialmente desligada (barra ~anual 0,25) e o DSR meramente ecoa a significância bruta. A evidência real é que o edge é mantido em toda a faixa de estimadores padrão — DSR 1,000/1,000/1,000/0,999 em Neff=N_{\text{eff}} = 1,6/2,4/16/21, incluindo uma barra anual genuína de 1,85-2,00 no intervalo médio defensável PCA-95%/Kaiser — sobrevivendo para qualquer Neff<145N_{\text{eff}} < 145, e falhando apenas sob o 370 superestimado de Cheverud-Nyholt. O passeio aleatório é rejeitado em todo estimador. Leia a faixa, não um ponto.
  5. Combine o DSR com um Reality Check, porque eles respondem perguntas diferentes. O Reality Check e sua prima do tipo SPA (studentizada) confirmaram o edge real (p = 0,0024 e 0,0038) sem nenhuma cirurgia de contagem de trials — eles lidam com dependência nativamente via stationary bootstrap, que é exatamente o desempate quando o N efetivo é contestado. O DSR pergunta "o vencedor é especial dentro desta busca?"; o RC/tipo SPA pergunta "o melhor bate o caixa depois do data-snooping?" Uma discordância entre eles é um sinal de que seu NN está errado. Rode os dois.

O vencedor de uma busca é culpado até que se prove inocente. O p-value ingênuo não é uma prova de inocência — é o próprio testemunho inflado da busca, e ele vai atestar por ruído puro com doze zeros de confiança. Deflacione o benchmark para o que a sorte entrega, conte seus trials efetivos honestamente, e faça bootstrap do máximo para uma segunda opinião. O que superar as três barras pode de fato ser real. O que supera apenas a ingênua é a mais alta entre mil lançadores de moeda.

O experimento completo — o harness de calibração nula, a varredura de poder com edge plantado, as buscas em grid correlacionado, e cada número neste artigo regenerável a partir de um único script determinístico — está no paper complementar em deflated-sharpe.marketmaker.cc, com código e dados em 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

Fique à frente do mercado

Assine nossa newsletter para insights exclusivos sobre trading com IA, análises de mercado e atualizações da plataforma.

Respeitamos sua privacidade. Cancele a inscrição a qualquer momento.