Lab

Lab · estatísticas populacionais

Densidade de Sharpe e scatter populacional (μ, σ, t)

Biblioteca de ajuste de distribuições e visualização para trabalhar com populações de estratégias de 38k+ variantes por ativo.

A matemática

Para cada estratégia i em um pool de N variantes, observada ao longo de T barras com retornos realizados ri,t, compute

Sob o nulo de retornos N(0, σ²) independentes, a estatística Sharpe studentizada tem uma distribuição Student-t com T − 1 graus de liberdade. Para T moderado, isso é bem aproximado por uma normal padrão.

A visualização populacional agrega N estatísticas-t em um histograma. Sob o nulo global (sem edge real em lugar nenhum) esse histograma é a distribuição empírica de N variáveis N(0, 1) i.i.d. Qualquer desvio, especialmente na cauda direita, é a assinatura no nível populacional de um subconjunto não-vazio de não-nulos verdadeiros.

Inflação por comparações múltiplas

No limiar de “significância de 5%” |t| > 1,96, a contagem esperada de falsos positivos em um pool de N = 38.000 estratégias extraídas do nulo global é

Qualquer estratégia individual passando |t| > 1,96 nesse pool é virtualmente desinformativa. O limiar corrigido por Bonferroni para controle populacional a 5% é , extremamente conservador e provável de matar todo o sinal. O movimento certo é controle de FDR via knockoffs (M/02) ou Benjamini–Hochberg, que a biblioteca reporta junto com a distribuição bruta.

Distribuição amostral do índice de Sharpe

Para o Sharpe deflacionado de Bailey & López de Prado (2014), o erro-padrão de um Sharpe observado depende de seu skew e curtose:

onde γ3, γ4 são skewness e curtose da distribuição de retornos por barra. Para retornos cripto com caudas pesadas isso pode inflar o SE em 30–50% relativo à baseline Gaussiana; a biblioteca reporta tanto o limite ingênuo quanto o deflacionado.

Exemplo trabalhado

Gere N = 2.000 estratégias com T = 200 barras cada. 5% (k = 100) carregam um edge verdadeiro com (logo Sharpe por barra de 0,06, anualizado ≈ 0,95 em frequência diária). As 1.900 restantes são puro ruído.

  • # esperado de |t| > 2 do pool de ruído: 1900 · (1 − Φ(2)) · 2 ≈ 87 falsas descobertas.
  • # esperado de |t| > 2 do pool de alpha: 100 · P(ti > 2 − √200·0,06) ≈ 100 · P(Z > 1,15) ≈ 12,5. Logo, aproximadamente 12 descobertas verdadeiras.
  • A FDP realizada no corte |t| > 2 portanto fica perto de 87 / (87 + 12) ≈ 88%. Esse é o baseline que você precisa bater com qualquer regra de seleção.

O demo abaixo regenera esse cenário ao vivo. Aumente a fração de alpha e veja a cauda direita da densidade de Sharpe crescer; o scatter (μ, σ) colore os pontos alpha-positivos em laranja via |t| > 2.

Demo: Sharpe density & (μ, σ, t) scatter

2000 strategies, T=200 bars each. Most are pure noise; 100 carry a small true edge.

N strategies2000
T bars200
α fraction (true edge)0.05
seed=3
planted α
119
|t|>2 selected
104
true discoveries
18
false discoveries
86
Sharpe density (orange = α-stratum)
-0.28-0.18-0.090.000.090.180.28Sharpe = mean / std
(μ, σ) scatter · orange = |t| > 2
-0.47-0.31-0.16-0.000.160.310.470.000.571.141.712.28per-bar mean μ

Figuras

Fig. 1:Densidade kernel populacional de índices de Sharpe OOS em mais de 130k observações estratégia-janela cobrindo o corpus completo de 30 ativos (baseline não-perturbado, n_trades ≥ 10). A densidade empírica é visivelmente mais larga que N(0,1), com caudas pesadas, com massa não-trivial na cauda direita que sobrevive a qualquer correção de multiplicidade honesta.
Fig. 2:Scatter (μ, σ) de cada estratégia OOS no corpus, colorida por quartil de win-rate. Curvas tracejadas em âmbar marcam a fronteira |t| = 2 na contagem mediana de trades. Estratégias do quartil superior em win-rate (verde) estão concentradas acima da linha |t| = 2, a assinatura no nível populacional de que a métrica de ranqueamento está encontrando estrutura cross-strategy real em vez de redesenhar o ruído.

Por que isso importa para estratégias sistemáticas

Populações de estratégias do tamanho com que trabalhamos (38k+ variantes por ativo) são basicamente intratáveis sem uma biblioteca para resumi-las. A biblioteca dá a mesma entrada para cada modelo a jusante: um tensor de resumo por estratégia com μ, σ, Sharpe, t, p-valor, e momentos de retorno por barra. M/01 (RMT) consome a estrutura de correlação dos retornos; M/02 (HC + knockoffs) consome as estatísticas-t; M/03 (TDA) consome as mesmas correlações que M/01 mas extrai invariantes topológicos; M/04 (EVT) consome retornos por barra diretamente. Rotinas de visualização são a ponte entre a população e o pattern-matching humano: o scatter (μ, σ) é onde você primeiro vê se seu subconjunto filtrado está em outro planeta em relação ao bulk, ou apenas em um canto ligeiramente mais sortudo do mesmo.

Reprodutibilidade

DaruFinance / strategy-stats

Python · implementação de referência open-source

Invocação mínima

from strategy_stats import population_summary, sharpe_kde, mu_sigma_scatter

# returns: N x T strategy returns matrix
summary = population_summary(returns, periods_per_year=252)
print(summary.head())   # mu, sigma, sharpe, t, p_value

ax = sharpe_kde(summary['sharpe'])
ax = mu_sigma_scatter(summary, color_by='t')

Referências

  1. [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. [2]Lo, A. W. (2002). The statistics of Sharpe ratios. Financial Analysts Journal 58(4), 36–52.
  3. [3]Harvey, C. R., Liu, Y. & Zhu, H. (2016). … and the cross-section of expected returns. Review of Financial Studies 29(1), 5–68.