Lab · overfitting de backtest
Calculadora do Deflated Sharpe Ratio
Qual a chance de o índice de Sharpe de um backtest ser real, uma vez contadas as configurações testadas para encontrá-lo? Um pacote Python e uma CLI sem dependências, conferidos contra todos os exemplos dos artigos de origem.
Um backtest chega como um índice de Sharpe, um comprimento de amostra e pouco mais. Deflacioná-lo faz uma pergunta diferente: com que frequência uma busca deste tamanho produziria um número tão bom sem nenhuma habilidade por trás. Preencha o backtest abaixo e cada quantidade se atualiza conforme você digita.
Deflated Sharpe Ratio calculator
Length bounds
The second is the data needed before a search that size stops producing 2.50 by chance.
Bailey and López de Prado (2014): a treasury seasonality backtest, best of 100 configurations. Published answer: SR₀ 0.1132 per day and DSR 0.9004, short of the 95% bar.
Deflated Sharpe Ratio
0.9004
below the 95% bar
Undeflated PSR
1.0000
probability the true Sharpe ratio beats zero, before the search is counted
Selection threshold SR₀
1.79
annualised, against 2.50 observed
Trials this result survives
46
at 95% confidence
Track record needed to pass
8.21 y
holding the trial count at 100
Sharpe ratio needed to pass
2.71
annualised, same sample and trials
Reproduce this result in the package
both snippets track the inputs above
dsr deflate --sharpe 2.5000 --annual --periods-per-year 250 --n-obs 1250 --trials 100 --trial-variance 0.5000 --skew -3.0000 --kurtosis 10.0000
from deflated_sharpe import deflated_sharpe_ratio
result = deflated_sharpe_ratio(
sharpe=0.15811388, # per period
n_obs=1250,
n_trials=100,
var_trials=0.0020000000,
skew=-3.0000,
kurtosis=10.0000,
)
result.dsr # 0.9004A matemática
Todas as quantidades são por período: um índice de Sharpe diário é o retorno médio diário sobre seu desvio-padrão, e T conta observações diárias. O Probabilistic Sharpe Ratio (Bailey e López de Prado 2012) é a probabilidade de o índice de Sharpe verdadeiro exceder um benchmark SR*, levando em conta a assimetria γ₃ e a curtose bruta γ₄ dos retornos:
Se N estratégias sem habilidade são testadas e seus índices de Sharpe estimados têm variância V, a melhor delas deve mostrar
onde γ ≈ 0,5772 é a constante de Euler-Mascheroni. O Deflated Sharpe Ratio é o Probabilistic Sharpe Ratio com esse máximo esperado como benchmark, , de modo que corrige pela busca e por retornos não normais ao mesmo tempo.
Dois limites de comprimento seguem da mesma álgebra. O comprimento mínimo de track record é o número de observações em que o PSR atinge uma confiança escolhida 1 − α, e o comprimento mínimo de backtest é o número de anos de dados antes que N tentativas parem de produzir um índice de Sharpe anualizado de E[max] por acaso (Bailey, Borwein, López de Prado e Zhu 2014):
Essas quatro expressões produzem todos os números da calculadora acima. Ela abre no exemplo trabalhado de Bailey e López de Prado (2014), um índice de Sharpe anualizado de 2,5 ao longo de cinco anos de retornos diários, escolhido entre 100 configurações cujos índices de Sharpe têm variância 0,5, com assimetria −3 e curtose 10. Esse backtest chega a 0,9004 e fica abaixo do limiar de 95%, enquanto os mesmos retornos teriam passado como o melhor entre 46 tentativas.
Por que um índice de Sharpe precisa ser deflacionado
Um pesquisador que testa cem versões de uma estratégia e reporta a melhor rodou cem experimentos e publicou o mais sortudo. Mesmo quando nenhuma das versões tem qualquer habilidade, a melhor delas mostra um índice de Sharpe respeitável, enquanto uma busca mais longa produz um vencedor de aparência ainda melhor. O Deflated Sharpe Ratio de Bailey e López de Prado (2014) estima a probabilidade de o índice de Sharpe verdadeiro da estratégia selecionada estar acima de zero uma vez levada em conta essa busca.
O demo abaixo torna o problema concreto. Cada estratégia nele tem índice de Sharpe verdadeiro exatamente zero, e ainda assim o melhor entre sessenta costuma mostrar um índice de Sharpe anualizado acima de 1.
Demo: the best of N strategies with no skill
Every strategy below has a true Sharpe ratio of exactly zero over 250 daily returns, and they share a market factor. The best one still looks tradeable. SR₀ is where the best is expected to land by luck alone.
best, annualised
1.90
participation ratio
3.8
Quanto tempo um track record precisa ter
A frequência importa mesmo sob o mesmo índice de Sharpe anualizado, porque menos observações por ano carregam menos informação, e caudas pesadas pesam mais que a frequência. Retornos mensais com os momentos do índice de hedge funds HFR precisam de quase cinco anos para mostrar que um índice de Sharpe de 2 supera 1, contra menos de três para retornos diários.
Figure: minimum track record length, years
How long a track record must be before an observed annualised Sharpe ratio is significantly above a benchmark at 95%. The outlined cell is the example in Bailey and López de Prado (2012).
| observed SR ↓ / benchmark → | 0.0 | 0.5 | 1.0 | 1.5 | 2.0 | 2.5 |
|---|---|---|---|---|---|---|
| 0.5 | 11 | · | · | · | · | · |
| 1.0 | 2.71 | 11 | · | · | · | · |
| 1.5 | 1.21 | 2.72 | 11 | · | · | · |
| 2.0 | 0.69 | 1.22 | 2.73 | 11 | · | · |
| 2.5 | 0.44 | 0.69 | 1.22 | 2.74 | 11 | · |
| 3.0 | 0.31 | 0.44 | 0.69 | 1.23 | 2.76 | 11 |
A dot means the observed Sharpe ratio does not exceed the benchmark, so no track record is long enough. Hover a cell to read it.
A contagem de tentativas que importa
N deve ser o número de configurações distintas testadas, incluindo as abandonadas cedo. Como variantes de estratégia são correlacionadas, trocá-lo por uma contagem efetiva como a razão de participação de autovalores parece mais cuidadoso, mas quando V é medida a partir das próprias tentativas isso corrige pela correlação duas vezes. Um fator comum move junto o índice de Sharpe de cada tentativa e portanto já encolhe a dispersão delas, o que coloca a correlação dentro de √V antes de N ser sequer tocado.
Rodar o lote no primeiro demo verifica isso. Com a contagem distinta, o melhor de um corpus sem habilidade supera SR₀ cerca de metade das vezes em qualquer correlação, que é o que um máximo esperado deve fazer. Com a razão de participação, 73 a 85 por cento dos corpora nulos correlacionados o superam na simulação de referência do pacote, de modo que um limiar construído assim deixa passar quase todo ruído puro.
Validação
O pacote reproduz todos os exemplos numéricos impressos nos três artigos de origem, e cada um é um teste que roda em Python 3.10 a 3.13 no Linux, macOS e Windows.
| exemplo | artigo | pacote |
|---|---|---|
| DSR, 100 tentativas, assimetria −3, curtose 10 | SR₀ ≈ 0,1132, DSR 0,9004 | 0,1132, 0,9004 |
| Mesma estratégia após 46 tentativas | 0,9505 | 0,9505 |
| Retornos normais após 88 tentativas | 0,9505 | 0,9505 |
| PSR, SR mensal 0,458 ao longo de 24 meses | 0,982 normal, 0,913 não normal | 0,982, 0,913 |
| MinTRL, SR 2 contra 1, diário / semanal / mensal | 2,73 / 2,83 / 3,24 anos | 2,73 / 2,83 / 3,24 |
| MinTRL, mensal, momentos do índice HFR | 4,99 anos | 4,99 |
| Tentativas permitidas por cinco anos de dados | 45 | 45 |
Testes de Monte Carlo verificam o resto. O PSR cruza 0,95 em cerca de 5% das amostras sem habilidade, e o máximo esperado casa com os máximos simulados, superestimando-os em 2,5% com dez tentativas e em menos de 1% a partir de cem. O comprimento mínimo de track record cai exatamente onde o PSR atinge seu nível de confiança.
O que um DSR não diz
Um DSR acima de 0,95 diz que a seleção dificilmente se explica apenas pela busca e pelo formato dos retornos. Nada diz sobre custos de transação, capacidade, look-ahead nos dados, mudança de regime ou tentativas que nunca foram registradas. Um DSR abaixo de 0,95 tampouco prova a ausência de habilidade, particularmente em amostras curtas.
Toda fórmula também assume retornos serialmente independentes. Posições mantidas ao longo de várias barras tornam os retornos autocorrelacionados, então o pacote fornece um tamanho efetivo de amostra AR(1) para passar no lugar da contagem bruta de observações.
Reprodutibilidade
DaruFinance / deflated-sharpe
Python · implementação de referência open-source
Invocação mínima
from deflated_sharpe import deflated_sharpe_ratio, to_period_sharpe, to_period_variance
result = deflated_sharpe_ratio(
sharpe=to_period_sharpe(2.5, 250), # annualised 2.5 on daily data
n_obs=1250, # five years
n_trials=100, # configurations tried
var_trials=to_period_variance(0.5, 250), # variance of their Sharpe ratios
skew=-3, kurtosis=10, # raw kurtosis: normal = 3
)
result.dsr # 0.9004, below the 95% bar
# or from the command line
# dsr deflate --sharpe 2.5 --annual --periods-per-year 250 --n-obs 1250 \
# --trials 100 --trial-variance 0.5 --skew -3 --kurtosis 10Referências
- [1]Bailey, D. H. & López de Prado, M. (2014). The Deflated Sharpe Ratio: correcting for selection bias, backtest overfitting and non-normality. Journal of Portfolio Management 40(5), 94–107.
- [2]Bailey, D. H. & López de Prado, M. (2012). The Sharpe Ratio Efficient Frontier. Journal of Risk 15(2), 3–44.
- [3]Bailey, D. H., Borwein, J. M., López de Prado, M. & Zhu, Q. J. (2014). Pseudo-mathematics and financial charlatanism: the effects of backtest overfitting on out-of-sample performance. Notices of the American Mathematical Society 61(5), 458–471.
- [4]Lo, A. W. (2002). The statistics of Sharpe ratios. Financial Analysts Journal 58(4), 36–52.

