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.
Calculadora do Deflated Sharpe Ratio
Limites de comprimento
O segundo é o volume de dados necessário antes que uma busca desse tamanho pare de produzir 2,50 por acaso.
Bailey e López de Prado (2014): um backtest de sazonalidade em treasuries, o melhor entre 100 configurações. Resposta publicada: SR₀ 0,1132 por dia e DSR 0,9004, abaixo do limiar de 95%.
Deflated Sharpe Ratio
0,9004
abaixo do limiar de 95%
PSR não deflacionado
1,0000
probabilidade de o índice de Sharpe verdadeiro superar zero, antes de contar a busca
Limiar de seleção SR₀
1,79
anualizado, contra 2,50 observado
Tentativas que este resultado suporta
46
a 95% de confiança
Track record necessário para passar
8,21 a
mantendo a contagem de tentativas em 100
Índice de Sharpe necessário para passar
2,71
anualizado, mesma amostra e tentativas
Reproduza este resultado no pacote
os dois trechos acompanham as entradas acima
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, # por período
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: o melhor entre N estratégias sem habilidade
Toda estratégia abaixo tem índice de Sharpe verdadeiro exatamente zero ao longo de 250 retornos diários e todas compartilham um fator de mercado, mas a melhor delas ainda parece negociável. SR₀ é onde essa melhor deve cair só por sorte.
melhor, anualizado
1,90
razão de participação
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.
Figura: comprimento mínimo de track record, anos
Quanto tempo um track record precisa ter antes que um índice de Sharpe anualizado observado fique significativamente acima de um benchmark a 95%. A célula destacada é o exemplo de Bailey e López de Prado (2012).
| SR observado ↓ / 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 |
Passe o cursor sobre uma célula para ler em palavras. Um ponto significa que o índice de Sharpe observado não excede o benchmark, então nenhum track record é longo o bastante.
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
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.

