Pesquisa / Working Paper · Revisado Maio 2026
Predictive Value of Within-Strategy Permutation Tests for Forward Selection
Evidence from Over 6 Billion Strategy-Level Permutations Across Three Asset Classes
Um teste empírico em larga escala sobre se permutações de Monte Carlo intra-estratégia, uma etapa-padrão de validação no desenvolvimento de estratégias quantitativas, de fato melhoram a seleção forward de estratégias. Em 437.911 configurações de estratégia sobre nove instrumentos abrangendo cripto, forex e commodities, 160 janelas walk-forward, e 26,5 bilhões de permutações de ponta a ponta, a resposta é não, mas por um motivo diferente do que uma versão de março de 2026 deste paper alegava. Nas estatísticas genuinamente dependentes do caminho para as quais o teste é bem definido, o filtro MC produz lift indistinguível de zero; nas estatísticas baseadas em soma, o resultado de lift negativo previamente reportado é reatribuído a um artefato de ordem de soma em ponto flutuante.
Ler no SSRN
abstract_id=6636018
Pacote de reprodutibilidade
Monte-Carlo-paper, Python, Rust e R verificados cruzados
As três descobertas
DESCOBERTA 1
Suas métricas-padrão de seleção são invisíveis ao teste.
Sob dimensionamento nocional fixo por trade, o cenário padrão da prática, ROI total, Sharpe em nível de trade e Profit Factor são cada um função apenas do multiconjunto de retornos por trade. Suas distribuições de rank MC são degeneradas por construção. Qualquer deslocamento para a esquerda observado nessas métricas é um artefato de ordem de soma em ponto flutuante no código vetorizado, não uma propriedade dos dados.
DESCOBERTA 2
Nas métricas onde o teste é bem definido, o sinal é ruído.
Maximum Drawdown, Calmar e Ulcer index são estatísticas dependentes do caminho genuínas. Seus ranks MC se agrupam a poucos pontos percentuais do baseline de reordenação aleatória de 50% em todos os instrumentos. Adicionar um filtro MC sobre uma simples comporta IS Profit Factor > 1 desloca a lucratividade OOS em menos de ±0,5 pp entre os nove instrumentos.
DESCOBERTA 3
No nível de portfólio, o sinal prediz na direção errada.
Combinar estratégias em portfólios equiponderados de 10 estratégias produz um deslocamento claro para a direita no rank MC-MDD, dependência de caminho real detectada. Mas o mesmo rank, usado como seletor forward-OOS, falha: portfólios no decil-topo por MC-MDD in-sample têm desempenho inferior ao decil-fundo em −3,48 pp agregando. MC detecta dependência de caminho; não prediz desempenho.
Resumo
Permutações de Monte Carlo intra-estratégia, embaralhar os retornos por trade de uma estratégia para avaliar significância, repousam sobre uma hipótese de permutabilidade que séries temporais financeiras violam. As propriedades diagnósticas do teste sob permutabilidade são bem estabelecidas. O que não foi avaliado é se agir com base na saída do teste de fato melhora a seleção forward de estratégias.
Avaliamos isso em 437.911 configurações de estratégia (8 famílias de indicadores; correlações de PnL por barra dentro da mesma família têm média de apenas |ρ̄| = 0,031, refutando a suposição comum de fluxos de retorno quase-duplicados entre variantes de parâmetros) sobre nove instrumentos abrangendo três classes de ativos, futuros perpétuos cripto (BTC, DOGE, BNB, SOL), majors forex (EUR/USD, USD/JPY, EUR/GBP), e commodities (XAU/USD, WTI Oil), e 160 janelas walk-forward. O pipeline produz 6.629.125 observações estratégia-janela e aproximadamente 26,5 bilhões de permutações de ponta a ponta: 6,63 bilhões de permutações MC intra-estratégia, 19,9 bilhões de permutações em bloco, e um pipeline de permutação em nível de barra padrão-ouro (~207 milhões de re-execuções completas de estratégia, construção Aronson/Masters) como verificação independente preservadora de dependência.
Em estatísticas dependentes do caminho (Maximum Drawdown, Calmar, Ulcer index, as métricas para as quais o teste de permutação intra-estratégia é matematicamente bem definido), adicionar filtro MC sobre uma simples comporta de lucratividade in-sample (IS Profit Factor > 1) produz lift incremental indistinguível de zero, o bootstrap por cluster de trimestre-calendário (61 clusters nos nove instrumentos) dá lift MC-MDD p50 agregado de +0,34 pp [+0,07, +0,62], que não sobrevive à correção de Bonferroni na família de seis variantes MC. Uma versão anterior deste paper reportava um resultado de lift negativo em estatísticas baseadas em soma (ROI / Sharpe / Profit Factor); esse resultado é reatribuído na revisão de maio de 2026 a um artefato de ordem de soma em ponto flutuante no código vetorizado de permutação, não a uma propriedade dos dados.
Duas verificações independentes reforçam o nulo corrigido. Um teste placebo no filtro artefactual produz lift com troca de sinal entre classes de ativos (cripto e ouro negativos, três pares forex positivos), um padrão que nenhuma teoria substantiva de não-permutabilidade prevê, mas o pitfall de soma em ponto flutuante sim. E um Monte Carlo de permutação em nível de barra padrão-ouro (reamostragem bootstrap estacionária dos retornos por barra com re-execução completa de estratégia, ~207 milhões de runs nos nove instrumentos) confirma edge genuíno in-sample em nível de barra mas reproduz o mesmo nulo na seleção forward.
Demo: Veja o deslocamento de ponto flutuante aparecer
Reordene o mesmo multiconjunto de retornos por trade milhares de vezes. Cada reordenação deveria produzir a mesma soma, matematicamente produz. Mas sob IEEE-754 estritamente-maior na soma vetorizada em lote, você verá uma reordenação ‘ganhar’ de outra com frequência não-trivial. A distribuição de rank colapsa em ~37 ± 2%, exatamente o deslocamento para a esquerda que a versão de março de 2026 confundiu com evidência de não-permutabilidade. Alterne o procedimento de soma para ver o artefato aparecer e desaparecer.
Mude para tratamento de empates por rank médio: a distribuição de rank salta para um nulo uniforme centrado em 50%. Mude para soma compensada de Kahan: ela colapsa em um sliver fino perto de 0. Os dados não mudaram, apenas a ordem em que os floats foram somados.
Por que isso acontece
Duas razões estruturais e um pitfall numérico:
- As métricas-padrão da prática são invariantes a permutação. Sob dimensionamento nocional fixo por trade, o cenário padrão da prática, ROI total, Sharpe em nível de trade e Profit Factor são cada um função apenas do multiconjunto de retornos por trade. Assumem o mesmo valor sob qualquer reordenamento e são invisíveis ao teste MC por construção (proposição no Apêndice A4 estendendo o resultado clássico de invariância do PF). O teste MC intra-estratégia nessas métricas é estruturalmente desinformativo independentemente de qualquer propriedade do processo gerador dos dados.
- Nas métricas dependentes do caminho onde o teste é bem definido, a ordenação realizada dos trades não separa ganhadores de perdedores out-of-sample. Maximum Drawdown, Calmar e Ulcer são funções genuínas da ordenação dos trades e produzem um nulo MC não-degenerado. Mas empiricamente a ordenação realizada é estatisticamente indistinguível de uma reordenação aleatória, ranks médios ficam a poucos pontos percentuais do baseline de 50% em todos os instrumentos, e o lift residual do filtro é no máximo uma fração de ponto percentual.
- Um artefato de ordem de soma em ponto flutuante inflou os números anteriores. Código vetorizado de permutação acumula lotes de retornos por trade reordenados em ordens de soma diferentes da ordem realizada, produzindo uma fração pequena mas não-zero de comparações IEEE-754 do tipo estritamente-maior entre duas somas matematicamente iguais. O sinal de lift negativo previamente reportado em estatísticas baseadas em soma foi quase inteiramente esse artefato. A revisão de maio de 2026 documenta o pitfall, distribui um reprodutor autocontido e propõe três correções (estatísticas dependentes do caminho, tratamento de empates por rank médio, ou soma com precisão exata).
- Ruído de amostragem na estimação de quantis de cauda. Mesmo em estatísticas dependentes do caminho, o rank MC é uma estimativa ruidosa de um quantil de cauda de uma distribuição nula desconhecida. O ruído se compõe ao longo do pipeline e domina qualquer sinal residual que sobre após as duas barreiras estruturais acima.
Demo: Escolha uma métrica, veja se MC consegue rankeá-la
Escolha qualquer métrica de seleção. Vamos reordenar um multiconjunto fixo de PnL 1.000 vezes e plotar a distribuição de valores da métrica. Qualquer métrica que colapsa em um único ponto é invisível ao teste MC intra-estratégia, nenhuma quantidade de permutação consegue rankear o que é matematicamente constante.
Profit Factor, ROI, Sharpe em nível de trade, win rate e Sortino todos colapsam. Maximum Drawdown, Calmar e Ulcer index distribuem-se em uma faixa não-trivial. O teste é bem definido apenas no segundo grupo, e em dados reais esses ranks centram perto de 50%.
Demo: Detecção não é predição
Escolha um instrumento e deslize K de 1 a 10 estratégias por portfólio. Veja a distribuição de rank MC-MDD in-sample deslocar para a direita de 50, o teste detecta corretamente que a geometria realizada de drawdown do portfólio é melhor do que uma permutação típica sugeriria. Depois cheque o painel da próxima janela OOS.
No resultado agregado dos 9 instrumentos, o mesmo rank que deslocou para a direita de 50 in-sample inverte como preditor: portfólios mais suaves IS têm desempenho inferior aos mais ruidosos em −3,48 pp out-of-sample. O teste MC detecta dependência de caminho real e negocia contra você.
Consequência prática
O sinal de rank MC por estratégia não carrega conteúdo positivo para seleção forward; adiciona tempo de computação e uma etapa mental extra que não desloca a distribuição OOS. No nível de portfólio o quadro é mais nítido: combinar estratégias produz um deslocamento para a direita nos ranks de MDD (a geometria de drawdown real do portfólio é melhor que o típico das permutações sugeriria), mas um teste forward-OOS mostra que o sinal reverte à média, portfólios no decil-topo por rank MC-MDD in-sample têm desempenho inferior aos do decil-fundo na próxima janela walk-forward em −3,48 pp agregando os nove instrumentos. MC no nível de portfólio é um detector de dependência de caminho, não um preditor de lucratividade futura.
No nível de portfólio, a diversificação por igual peso domina a seleção por filtro: 53–62pp de melhoria pela diversificação versus 3–5pp do melhor filtro. Portfólios multi-estratégia equiponderados atingem 89–98% de lucratividade OOS independentemente da escolha do filtro, consistente com a literatura mais ampla sobre portfólios ingênuos 1/N (DeMiguel et al., 2009).
Por que um sinal compartilhado pequeno demais para ser detectado em nível de estratégia se torna um sinal confiável em nível de portfólio é o tema de O sinal é coletivo. O trabalho de produção por trás desse projeto e do programa de pesquisa mais amplo do escritório usa o mesmo filtro proprietário da Daru Finance, uma construção diferente dos filtros de comparação avaliados neste paper.
Demo: Mova o slider, veja nada acontecer
Uma resposta comum da prática a um achado nulo é apertar o filtro. Arraste o limiar percentil MC de p0 a p99 e observe o intervalo de confiança do lift OOS. A faixa do IC nunca sai do intervalo de ±1 pp em torno de zero, não importa qual estatística dependente do caminho você escolha.
Demo: Threshold lift
Sweep the MC percentile threshold and the metric. The OOS top-bottom decile lift CI never leaves the ±1 pp band, while the IS PF > 1 gate alone delivers +4.54 pp.
The whole curve is the story: drag across every threshold and the selected metric, plus the faint trails of the others, stays pinned inside the ±1 pp band. The IS PF > 1 gate alone delivers +4.54 pp (the dashed line far above), so MC filtering adds noise around zero no matter which path-dependent statistic you pick. The MC-ROI* artefact curve drifts above zero only because the floating-point summation pitfall sign-flips on forex pairs (paper §8.4).
Agora cheque o gate IS PF > 1 sozinho, esse único filtro booleano entrega +4,54 pp de lift OOS. Apertar o limiar MC adiciona tempo de computação e ruído em torno de zero; a comporta de lucratividade in-sample faz o levantamento.
Resumo da metodologia
- Otimização walk-forward estrita: janelas in-sample de 10.000 candles para cripto (~10.000 horas de relógio para forex/commodities), avançando a cada 5.000 candles/horas, sem ajuste de parâmetros durante a avaliação OOS.
- Custos de transação realistas: 0,16% round-trip para perpétuos cripto (slippage + fee + funding), 1,4 pips para majors forex, spreads específicos por instrumento para commodities.
- 1.000 permutações MC intra-estratégia por par estratégia-janela (~6,63 bilhões no total) em estatísticas dependentes do caminho (MDD, Calmar, Ulcer); uma bateria de permutação por bloco em b ∈ {2, 3, 5, 10, 20} adiciona ~19,9 bilhões de runs no nível de portfólio; um pipeline padrão-ouro de permutação em nível de barra (reamostragem bootstrap estacionária dos retornos por barra com re-execução completa de estratégia, construção Aronson/Masters) adiciona ~207 milhões de re-execuções completas nos nove instrumentos como verificação independente preservadora de dependência. Aproximadamente 26,5 bilhões de permutações de ponta a ponta.
- Filtros de comparação na §3.4: uma bateria determinística de robustez (custo +50%, timing ±1 barra, parâmetro ±1 passo) sob condições de gating pareadas. A análise de portfólio (§6) cobre MC dentro da janela, decis forward-OOS e construção top-N-por-IS-PF em aproximadamente 160.000 portfólios.
Reprodutibilidade e divulgação
O repositório distribui scripts de análise apenas, cada figura, tabela e estatística inline do paper pode ser reproduzida rodando o pipeline distribuído contra qualquer saída estratégia-janela que conforme ao esquema documentado. O código abrange três linguagens: Python (13 scripts, orquestração, figuras, tabelas, e um reprodutor autocontido do pitfall de ordem de soma em ponto flutuante), Rust (7 crates paralelizadas com Rayon, as quatro novas crates dependentes do caminho mc_path_ranks, block_perm_path, portfolio_mc_path, portfolio_mc_oos, mais a legacy block_perm, o tensor de correlação e o pipeline sintético), e R (5 scripts re-derivando independentemente as principais alegações estatísticas em outra linguagem como validação cruzada metodológica). Todos os scripts usam sementes fixas (42); ICs bootstrap usam 10.000 reamostragens; os estimadores de lift são estáveis em três sequências independentes de seed (lift médio varia menos que 0,05 pp).
O pacote é explícito sobre o que não é distribuído: os dados brutos de barras/trades e as 437.911 configurações de estratégia permanecem proprietárias. Leitores reproduzem apontando os scripts para os próprios dados em nível de barra e universo de estratégias; o backtester de estratégias que produz os fluxos de trades que o pipeline consome é open source em github.com/DaruFinance/quant-research-framework-rs. Separadamente, o filtro de produção da Daru Finance, usado em consultoria e no programa de pesquisa mais amplo do escritório, é uma construção diferente dos filtros de comparação avaliados aqui, e não é o tema deste paper.
Checklist do praticante
Uma auditoria de oito itens para rodar contra seu próprio pipeline MC antes de confiar em sua saída. Os erros mais caros estão abaixo.
- 01
Cheque sua suposição de dimensionamento primeiro.
A proposição de invariância de multiconjunto assume dimensionamento nocional fixo por trade. Sob Kelly, fixed-fractional ou escalonamento por volatilidade, a invariância estrutural quebra, mas também quebra a maior parte da literatura prática que motiva o teste em primeiro lugar. Seja explícito sobre em qual regime você está.
- 02
Use tratamento de empates por rank médio no seu contador MC.
Substitua contagens estritamente-maior-que por correção de empates por rank médio: rank = (count_estritamente_menor + 0,5 × count_igual) / B. Essa única mudança remove o deslocamento para a esquerda produzido por ruído de soma IEEE-754 em métricas invariantes a permutação.
- 03
Ou mude para soma compensada / exata.
math.fsum em Python ou soma de Kahan em qualquer linguagem empurra o erro de arredondamento remanescente abaixo do limiar em que o artefato pode trocar o sinal de um ranking. Mais lento por chamada, mas elimina a classe do bug.
- 04
Use uma estatística dependente do caminho, não uma baseada em soma.
Se sua métrica de seleção está na família invariante de multiconjunto (ROI, Sharpe, Profit Factor, win rate, Sortino) o teste MC intra-estratégia é estruturalmente desinformativo independentemente da implementação. Mude para MDD, Calmar ou Ulcer se você quer que um nulo de permutação signifique algo.
- 05
Use ao menos B = 1.000 permutações.
Abaixo disso, a cauda do nulo é ruidosa demais para rankear de forma confiável e você verá deslocamentos arbitrários para a esquerda ou direita conduzidos por ruído de amostragem. O paper usa B = 1.000 ao longo.
- 06
Cluster seus erros padrão por período de calendário.
Erros padrão i.i.d. ingênuos vão convencê-lo de efeitos que não estão lá: o efeito de design em um painel de 9 instrumentos × 160 janelas é de aproximadamente 18×. Use um bootstrap por cluster de trimestre-calendário (~61 clusters), essa é a origem do IC headline no paper.
- 07
Não filtre pelo rank MC como seletor forward.
Use o teste MC como detector de dependência de caminho, não como preditor forward. O resultado no nível de portfólio mostra que mesmo quando MC detecta dependência de caminho real, o rank inverte como preditor OOS em aproximadamente −3,5 pp.
- 08
Trate permutação por bloco como detecção, não predição.
Permutação por bloco preserva autocorrelação local e produz um nulo um pouco mais estreito que a variante i.i.d. Ela não produz um sinal forward-selection positivo. Use-a para caracterizar estrutura de dependência, não para escolher estratégias.
Uma observação lateral que vale destacar
Correlações de PnL por barra dentro da mesma família têm média de apenas |ρ̄| = 0,031 em toda a amostra, refutando a suposição comum de que variantes de parâmetros de uma única família de indicador produzem fluxos de retorno quase-duplicados. Mesmo no par no 99º percentil, |ρ| médio é só 0,224, bem abaixo do nível |ρ| > 0,7 que a intuição de “quase-duplicado” preveria. Isso significa que o universo de 437.911 estratégias carrega muito mais informação independente do que uma leitura casual sugeriria.
Mesmo o Monte Carlo padrão-ouro de permutação por barra produz um nulo
Uma objeção razoável a este ponto: ‘o MC intra-estratégia de reordenação por trade é a variante barata, o MC de permutação por barra preservador de dependência de Aronson e Masters é o que eu de fato confio.’ O paper roda esse procedimento também, em escala: reamostragem bootstrap estacionária de retornos por barra com re-execução completa de estratégia, aproximadamente 207 milhões de runs nos nove instrumentos. Ele detecta edge genuíno in-sample em nível de barra, rank de PF 80–86 em cripto e commodities. Ele produz o mesmo nulo na seleção forward.
O controle placebo é o que torna a leitura à prova de falhas. O mesmo filtro artefatual que parecia agregar valor produz um lift que troca de sinal entre classes de ativos, negativo em cripto e ouro, positivo em três pares de forex, um padrão que nenhuma teoria de não-permutabilidade genuína prevê, mas que uma armadilha de soma em ponto flutuante reproduz exatamente. Uma vez corrigido esse artefato, o aparente edge de forex colapsa junto, e cripto e commodities se acomodam dentro de ±0,75 ponto percentual de zero. Assim, o procedimento padrão-ouro concorda com o barato na única pergunta que importa no momento da decisão: ele confirma que há estrutura real em nível de barra a encontrar in-sample, e confirma que essa estrutura não passa para a próxima janela walk-forward. Detecção não é previsão, e pagar pelo teste de permutação mais caro compra um nulo mais crível, não um nulo diferente.
FAQ
- Isso se aplica a estratégias de ações?
- O escopo empírico do paper é quatro perpétuos cripto, três majors forex e dois commodities. Os argumentos estruturais (invariância de multiconjunto, o pitfall de ponto flutuante, ICs por cluster de calendário) são características da linguagem de implementação e não dependem da classe de ativo. Não rodamos o procedimento em ações; isso é uma limitação de escopo deliberada sinalizada na §10.
- E quanto a Kelly / fixed-fractional / escalonamento por vol?
- Dimensionamento de posição dependente da equity quebra a proposição de invariância de multiconjunto, sob Kelly, a ordem em que os trades chegam muda o nocional por trade e portanto ROI e Sharpe. Então o argumento estrutural é mais estreito que a literatura prática que motiva o teste. Na prática, a maior parte dos testes MC de permutação publicados assume dimensionamento fixo porque é o que torna o nulo tratável; a crítica do paper se aplica especificamente a esse corpo de trabalho.
- Então o que eu deveria usar em vez disso?
- Dois procedimentos passam pela mesma auditoria forward-OOS e são metodologicamente apropriados. Reamostragem bootstrap estacionária em nível de barra com re-execução completa de estratégia (a construção Aronson/Masters) testa um nulo significativo preservador de dependência. Validação cruzada combinatória purgada (López de Prado) testa uma questão diferente. Ambos produzem o mesmo resultado nulo de seleção forward que o teste intra-estratégia nos dados aqui; ambos estão documentados na §10.
- Vocês testaram métodos de nulo no universo como o Reality Check de White?
- Fora do escopo. O Reality Check de White, o SPA de Hansen e o StepM de Romano-Wolf endereçam a hipótese de múltiplas comparações entre estratégias, não a hipótese de permutação intra-estratégia. Eles poderiam ser avaliados com a mesma metodologia de forward-lift que este paper introduz; deixamos isso para trabalho de follow-up.
- Onde está o código, e como reproduzo o demo de ponto flutuante?
- O pipeline completo está em github.com/DaruFinance/Monte-Carlo-paper. O reprodutor autocontido de ponto flutuante (python/fp_pitfall_demo.py) roda em menos de 30 segundos sem dados externos e reproduz o mesmo rank médio de ~37% que o paper documenta.
- Por que a revisão de maio de 2026 retrata um achado da versão de março de 2026?
- A versão de março reportava um lift MC uniformemente negativo de aproximadamente −1,2 pp em nove instrumentos. Esse resultado era conduzido por código de soma vetorizado que comparava dois floats matematicamente iguais sob IEEE-754 estritamente-maior. Uma vez corrigido, via empates por rank médio, soma exata, ou uma mudança para estatísticas genuinamente dependentes do caminho, o deslocamento para a esquerda desaparece. A revisão documenta o bug, distribui um reprodutor público e roda a análise corrigida na mesma escala.
Citar este paper
Veja também
Para um companheiro menos formal que percorre o cenário empírico mais amplo, e mostra onde o edge de fato vive em uma população de 533.638 estratégias quando o teste de permutação intra-estratégia é deixado de lado (em seleção sobre a população, reprodutível a partir de PnL diário realizado), leia O Edge Está no Processo.

