M/05 · Decomposição do viés de seleção
Decompondo o gap de Sharpe IS-OOS
Um orçamento de variância que divide a degradação de Sharpe in-sample para out-of-sample em viés de seleção, ruído de escolha de parâmetros e skill residual, em dez corpora cripto walk-forward profundos.
A matemática
Suponha que uma família de estratégias seja indexada por um parâmetro k = 1, …, K. Para cada k você observa um Sharpe in-sample SISk e um Sharpe out-of-sample SOOSk. A prática padrão, pegue o máximo in-sample e torça pelo melhor out-of-sample, define o gap IS-OOS como
Decomponha Δ aditivamente. Escreva cada SISk como um termo de skill verdadeiro mais um desvio de escolha de parâmetro mais ruído:
Então o gap se divide em três termos:
O primeiro termo é puramente mecânico. Para K extrações independentes N(0, σ²), o limite de Mills dá o máximo esperado
que é apertado em primeira ordem. O segundo termo é o σ dentro da grade herdado pelo k* escolhido. Apenas o terceiro termo, skill residual, deveria depender da estratégia realmente fazendo algo útil out-of-sample.
O orçamento de variância
O repositório complementar roda uma decomposição de duas vias da variância de Sharpe OOS sobre um painel (estratégia × janela), observando uma bateria de perturbações proprietárias por célula, o conjunto específico de perturbações é parte do trabalho de consultoria da Daru Finance e não é enumerado aqui. A identidade ao nível do painel é
onde Vparam = E[Vart SOOS(s, w, t)] é a variância dentro da célula entre perturbações (sensibilidade de fio-de-navalha), Vstrategy e Vwindow são diferenças de média entre estratégias e entre janelas, Vfinite = (1 + ½·Sh²)/n é o piso analítico de ruído de amostra finita, e R é a interação não explicada.
Exemplo trabalhado
Tome BTC_30m_27W do corpus cripto WFO profundo: 538k linhas OOS, 27 janelas walk-forward. O Sharpe OOS médio na população sobrevivente é −0,696. Vparam médio é 0,243. Taxa de lucratividade live-proxy (últimas duas janelas após o filtro de funil): 8,4%.
Agora plugue no nulo. Com uma grade de parâmetros de K = 400 combinações e σ = 1 (ruído típico de Sharpe IS em 500 trades, q ≈ 0,2), o limite do máximo esperado é
Ou seja: sob nenhuma habilidade, escolher o vencedor in-sample de uma grade de 400 produz um Sharpe IS esperado perto de +3,5, e uma expectativa OOS perto de zero. O gap empírico é confortavelmente reproduzido sem invocar edge real. O demo interativo abaixo recomputa isso toda vez que você move K ou σ.
Demo: predicted IS-OOS gap under a no-skill null
For a parameter grid of size K with iid N(0, σ²) IS Sharpes, the expected maximum is ≈ σ·√(2 log K). Move the sliders, the bar shows the predicted gap, decomposed into selection bias, parameter noise, and residual skill.
Under the null hypothesis of no skill, the entire IS-OOS gap is mechanical: scaling with √(log K) (selection) and σ (parameter noise). The residual skill term sits at zero.
At K=400 and σ=1, the expected-max-of-K Gaussians is ≈ 3.46, the entire IS-OOS gap a strategy population reports under the null can be reproduced without invoking any real edge.
Decomposição empírica
No corpus canônico de 10 ativos (ETH, BTC, LTC, TRX, XRP, LINK, ZEC, DOGE, BCH, AVAX, todos cripto 30m com ≥17 janelas walk-forward; 7,27M linhas OOS; 289.374 candidatos live-proxy), a decomposição de variância pooled é:
- Vparam, 18,6% (ruído de escolha de parâmetros entre perturbações).
- Vstrategy, 16,8% (efeito principal entre estratégias).
- Vfinite, 3,1% (piso analítico de amostra finita).
- Vwindow, 1,2% (médias entre janelas / proxy de regime).
- Residual / interação, 60,4%.
A degradação média de Sharpe IS-OOS neste corpus é 0,84. O termo de skill residual é estatisticamente indistinguível de zero, o gap é mecânico.
Nulo sintético
Para verificar que a decomposição não é um artefato da estrutura do painel, o mesmo pipeline roda em dados sintéticos com três classes plantadas (robusto / frágil / ruído) e um RNG determinístico. A forma da variância e o lift por decil se reproduzem, confirmando que a decomposição está identificando estrutura mecânica, não anomalias no corpus real.
Por que isso importa para estratégias sistemáticas
Duas consequências práticas. Primeiro, qualquer alegação de edge positivo a partir de maximização in-sample sobre uma grade de parâmetros de K precisa superar σ·√(2 log K) antes de ser levada a sério, e σ raramente é menor que 1 em estimativas de Sharpe a nível de barra em cripto. Segundo, Vparam é totalmente observável in-sample (é computado apenas da rodada IS, sem vazamento OOS), então pode ser usado como pré-filtro no momento da seleção de estratégias. Os empíricos WFO profundos sugerem que o decil de menor Vparam bate o maior por um fator de 2,2× em lucratividade live-proxy, monotonicamente.
Os frameworks de Sharpe deflacionado e PBO de Bailey-López de Prado atacam o mesmo problema pelo lado da estatística-teste. Esta decomposição é complementar: funciona no nível populacional em vez de por estratégia, e produz um preditor in-sample utilizável (Vparam) de lucratividade out-of-sample.
Reprodutibilidade
DaruFinance / strategy-overfitting
Python · implementação de referência open-source
Invocação mínima
from strategy_overfitting import (
load_metrics, decompose_oos_variance, param_vs_live_lift
)
# Walk-forward output: long-format DataFrame with
# columns: asset, strategy, window, perturbation, S_IS, S_OOS, n_trades
df = load_metrics(parquet_root="/data/strategies", min_trades=20, sharpe_clip=5)
# Two-way decomposition over (strategy x window) x perturbations
shares = decompose_oos_variance(df)
shares["share_v_param"] # 0.186 - parameter-choice noise
shares["share_v_strategy"] # 0.168 - between-strategy main effect
shares["share_v_window"] # 0.012 - regime / window
shares["share_v_finite"] # 0.031 - analytic finite-sample floor
shares["share_residual"] # 0.604 - interaction + unexplained
# Predictive validity: rank strategies by V_param (in-sample) and
# measure live-proxy profitable rate by decile.
lift = param_vs_live_lift(df, n_deciles=10)
lift.D1_pct, lift.D10_pct # e.g. 11.7, 5.3
Referências
- [1]Bailey, D. H., Borwein, J. M., López de Prado, M., & Zhu, Q. J. (2014). The probability of backtest overfitting. Journal of Computational Finance 20(4), 39–69.
- [2]Harvey, C. R. & Liu, Y. (2014). Backtesting. Journal of Portfolio Management 42(1), 13–28.
- [3]Lo, A. W. & MacKinlay, A. C. (1990). Data-snooping biases in tests of financial asset pricing models. Review of Financial Studies 3(3), 431–467.
- [4]López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley, ch. 11–12.

