A pergunta central de qualquer validação não é “quanto rendeu?”, mas “esse resultado vai sobreviver no futuro?”. A maioria dos métodos populares responde mal a isso porque vaza informação do futuro para o passado. Este artigo mostra por que o k-fold quebra em séries financeiras e como a CPCV conserta o vazamento. Ele conversa diretamente com a análise walk-forward, com a divisão entre in-sample e out-of-sample, com a probabilidade de overfitting (PBO), com o teste de robustez no algotrading e com o Sharpe deflacionado por múltiplos testes.
Por que o k-fold padrão vaza em finanças
A validação cruzada k-fold é inválida para séries financeiras porque os dados não são independentes e identicamente distribuídos. O método clássico divide os dados em k partes iguais, treina em k−1 e testa na restante, repetindo k vezes e fazendo a média. Isso funciona quando cada observação é independente das demais — mas, segundo López de Prado (2018), mercados financeiros violam essa premissa de forma espetacular por duas propriedades.
A primeira é a autocorrelação: o valor da série em t não é independente do valor em t−1. Essa dependência serial é justamente o fenômeno que a maioria das estratégias tenta explorar. Embaralhar os dados antes do k-fold — prática comum para garantir folds aleatórios — destrói a estrutura temporal que dá sentido aos dados, tornando a validação inútil.
A segunda é o vazamento de dados / lookahead bias, mais sutil e igualmente fatal. Mesmo sem embaralhar, a estrutura sequencial do k-fold deixa informação do futuro contaminar o treino. Um split de 5 folds sobre 10 anos pode usar os anos 1-2, 3-4, 7-8 e 9-10 para treinar e testar em 5-6 — ou seja, o modelo avaliado em 2015-2016 foi treinado com dados de 2017-2020. Ele viu o futuro. O resultado é um Sharpe inflado e irreal.
Há ainda um agravante específico de trading: o rótulo é construído olhando para frente. Diferente de uma foto de gato, cujo rótulo é estático, o rótulo de um trade (“esta entrada deu lucro?”) só existe depois que o trade fecha, dias ou semanas depois da barra de entrada. Quando dois rótulos vizinhos no tempo se sobrepõem — porque ambos dependem de uma janela futura comum — uma observação no treino e outra no teste passam a compartilhar a mesma informação. É o que López de Prado chama de concorrência de rótulos (overlapping labels): mesmo cronologicamente separadas, as amostras não são independentes. É por isso que a correção precisa ser feita no nível do rótulo, e não apenas reordenando os folds.
Walk-forward melhora, mas continua frágil
O walk-forward respeita a flecha do tempo, mas é fortemente dependente do caminho. Nele os dados são divididos em blocos sequenciais: treina no bloco 1, testa no 2; treina em 1-2, testa em 3, e assim por diante (janela expansível). Isso elimina o lookahead grosseiro do k-fold sequencial — sempre treina no passado, testa no futuro.
O problema, conforme descreve a literatura de López de Prado, é que o parâmetro “ótimo” do walk-forward fica calibrado para a sequência específica de regimes que aconteceu naquela história. Se os últimos folds foram um bull market forte, o processo vai favorecer parâmetros adaptados a esse ambiente, que podem não ser robustos em geral. Além disso, o walk-forward entrega um número pequeno de conjuntos de teste, tornando a média final instável. É um único caminho histórico — e a história poderia ter sido outra.
Purge: o “air gap” entre treino e teste
O purge remove do treino qualquer amostra cujo período de formação do rótulo se sobreponha ao período de teste. Quando o rótulo de um trade olha para frente (ex.: “o preço subiu nos próximos 3 dias?”), uma observação perto do limite do treino depende de barras que pertencem ao teste. Avaliar essa observação no treino contamina a seleção com informação do futuro — é vazamento, ainda que indireto.
A solução é criar um vão informacional: descartam-se as observações do final do treino que tocam o período de teste. Imagine um split com treino nos índices 100 a 800 e teste em 820 a 1000. Se uma regra olha 3 dias à frente, avaliar o parâmetro no índice 798 já depende de dados em 799, 800 e 801 — perigosamente perto do teste. O purge elimina essa franja (ex.: índices 790-800) para que o desempenho de cada parâmetro seja julgado sobre dados limpos e completamente separados do teste que vem a seguir.
Embargo: o período de “cooldown” depois do teste
O embargo descarta uma faixa de observações logo após cada conjunto de teste para quebrar a dependência entre trials. Mercados têm memória: a dinâmica de um período de teste (digamos, um crash de alta volatilidade entre os índices 820 e 1000) tende a persistir por algum tempo depois (índices 1001 a 1010). Se um novo split começasse a treinar imediatamente em 1001, a seleção de parâmetros nesse split seria fortemente influenciada pelo rescaldo direto do teste anterior — criando correlação entre os trials e enviesando o resultado agregado.
Na formulação de López de Prado, o embargo costuma ser percentual: um embargo de 5% sobre 1000 observações exclui as 50 amostras imediatamente após o teste, para absorver o atraso de reação do mercado. O efeito é que cada uma das centenas de medições de desempenho vira uma amostra mais independente — e a distribuição final de scores fica estatisticamente mais confiável.
O salto combinatório: de UM número para uma DISTRIBUIÇÃO
A CPCV gera muitos caminhos de treino/teste que respeitam a cronologia, e não um único. Na descrição de López de Prado (2018), a série é dividida em N grupos sequenciais e, sistematicamente, escolhem-se todas as combinações de k grupos como conjunto de teste. O número de combinações treino/teste segue o coeficiente binomial C(N,k), e cada observação aparece em k conjuntos de teste, gerando φ[N,k] = (k/N)·C(N,k) caminhos de backtest distintos — todos com purge e embargo aplicados.
O efeito é profundo: para cada parâmetro testado, você não recebe mais um único score, mas uma distribuição de scores de desempenho — um para cada caminho. Um caminho pode treinar num bull market e testar num crash; outro treina num mercado lateral volátil e testa numa recuperação. Agregando centenas desses cenários, obtém-se uma leitura muito mais honesta da capacidade “todo-tempo” do parâmetro do que qualquer caminho único de walk-forward conseguiria. A CPCV troca a estimativa pontual frágil por uma distribuição robusta de desempenho.
O número de caminhos cresce rápido com a granularidade. Com N=6 grupos testando k=2 por vez, há C(6,2)=15 combinações treino/teste e φ = (2/6)·15 = 5 caminhos completos; subir para N=10 e k=2 já dá C(10,2)=45 combinações e φ=9 caminhos. Cada parte da série passa a ser testada várias vezes, sob vizinhanças diferentes, em vez de uma só. Esse é o ponto que separa a CPCV do walk-forward: o walk-forward testa cada trecho da história exatamente uma vez, numa ordem fixa; a CPCV testa o mesmo trecho em múltiplos contextos, o que é justamente o que constrói a distribuição. O custo é computacional — é “embaraçosamente paralelo”, então roda bem em vários núcleos — mas esse custo é o preço do rigor estatístico.
Selecionar pelo piso, não pelo pico
Com uma distribuição em mãos, a escolha deixa de ser “o maior número” e passa a ser “o piso mais alto”. A síntese de Quant Beckman (2025), construída sobre o arcabouço de López de Prado, propõe ranquear cada parâmetro pelo 10º percentil da distribuição — ou seja, “qual desempenho posso esperar mesmo nos 10% piores cenários históricos?”. Buscamos platôs, não picos: regiões de parâmetros que continuam boas sob muitos contrafactuais, em vez de parâmetros ótimos numa história específica e quebradiços em qualquer outra.
Visualmente, isso vira um box plot por parâmetro: a escolha é a caixa cujo bigode inferior é o mais alto, mesmo que sua mediana não seja a maior. E em vez de pegar o vencedor isolado — que pode ter ganhado por sorte nos caminhos sorteados — toma-se um pequeno grupo dos melhores candidatos (ex.: top 5) por mediana ponderada. Se os melhores N são vizinhos (28, 30, 31, 27, 33), há um platô estável; se estão espalhados (15, 48, 7, 82), a premissa da estratégia é suspeita. É o mesmo raciocínio do teste de robustez: estabilidade na vizinhança vale mais que um pico isolado.
A ligação com PBO e o overfitting de backtest
A CPCV é a infraestrutura que torna mensurável a probabilidade de overfitting. Quando você testa muitos parâmetros ou ideias na mesma história e escolhe o melhor, está sistematicamente selecionando erro de estimação positivo — o máximo de um conjunto de variáveis aleatórias quase sempre parece impressionante. Bailey, Borwein, López de Prado e Zhu (2014/2017), em “The Probability of Backtest Overfitting” (PBO), formalizaram exatamente isso: a probabilidade de que a configuração escolhida como melhor in-sample tenha desempenho out-of-sample abaixo da mediana. Os múltiplos caminhos da CPCV alimentam diretamente esse cálculo.
No mesmo espírito está o Deflated Sharpe Ratio, também de López de Prado: ele corrige o Sharpe observado descontando a inflação causada pela quantidade de tentativas e pela variância dos Sharpes testados. Quanto mais configurações você experimentou, mais alto o Sharpe precisa ser para significar algo. Em regra prática, o valor esperado do máximo Sharpe sob hipótese nula cresce com o número de testes — algo como E[máx SR] ≈ √(2·ln N / T). A CPCV não substitui essas correções; ela fornece a distribuição honesta sobre a qual o Sharpe deflacionado e a PBO operam.
Vale também distinguir o desempenho dos rótulos: a CPCV pode usar uma métrica mais honesta que o Sharpe padrão. A síntese de Quant Beckman (2025) aplica a Probabilistic Sharpe Ratio (PSR), que devolve a probabilidade de o Sharpe verdadeiro superar um benchmark levando em conta a assimetria e a curtose reais dos retornos — porque retornos de trading raramente são normais (têm cauda esquerda longa e fat tails). Um Sharpe alto com forte assimetria negativa é mais frágil do que parece, e a PSR pune isso. Combinada com a CPCV, você ranqueia parâmetros pelo 10º percentil da PSR — o piso de confiança estatística nos piores cenários — em vez do PnL bruto. É o oposto da otimização ingênua que produz o pico bonito e enganoso in-sample.
Onde a CPCV NÃO te salva
A CPCV é poderosa, mas tem limites honestos que López de Prado e a literatura derivada deixam claros. Ela protege contra o overfit de um parâmetro a um único caminho histórico — não contra o meta-overfitting: se você testar dezenas de ideias diferentes no mesmo dataset, todas com CPCV rigorosa, eventualmente uma vai parecer robusta por puro acaso. A única defesa é disciplina de pesquisa, racional econômico para cada estratégia e um hold-out final intocado.
Há outros limites: a CPCV assume que o futuro será uma recombinação do passado — não antecipa uma quebra estrutural genuína (um regime inédito). Ela exige série longa o bastante; em ativos com pouca história (uma cripto recente, um ETF novo) as janelas ficam curtas e os resultados, instáveis. E sua própria complexidade abre espaço para bugs silenciosos: um erro de um índice no purge pode reintroduzir vazamento sem o código nunca quebrar. A regra final continua sendo: validação rigorosa reduz o autoengano, não o elimina.
O que é purge na validação cruzada?
Purge é a remoção das amostras de treino cujo rótulo se sobrepõe no tempo ao período de teste. Como muitos rótulos em trading olham para frente (ex.: retorno dos próximos N dias), uma observação perto do limite do treino pode “enxergar” dados do teste. O purge corta essa franja para garantir que treino e teste não compartilhem informação — eliminando o lookahead bias na seleção de parâmetros.
Qual a diferença entre purge e embargo?
Purge remove amostras de treino que se sobrepõem ao teste; embargo descarta amostras logo APÓS o teste. O purge ataca o vazamento direto (rótulos que tocam o período de teste); o embargo ataca a dependência residual (a memória do mercado persiste após o teste e contaminaria o próximo split). Os dois juntos garantem que cada caminho de backtest seja uma amostra estatisticamente mais independente.
Quantos caminhos de backtest a CPCV gera?
A CPCV com N grupos e k grupos de teste gera φ[N,k] = (k/N)·C(N,k) caminhos de backtest distintos. Por exemplo, dividir os dados em N grupos e variar a combinação dos k testados produz dezenas a centenas de caminhos cronologicamente consistentes — cada um com purge e embargo — em vez do único caminho que o walk-forward entrega. Daí surge a distribuição de Sharpe, e não um número solitário.
CPCV substitui o walk-forward?
Não exatamente: a CPCV generaliza o walk-forward para múltiplos caminhos. O walk-forward é um único caminho temporal, sensível à sequência específica de regimes que ocorreu. A CPCV testa o parâmetro contra muitas recombinações dos regimes históricos, expondo fragilidade que um caminho só esconderia. O walk-forward continua útil pela simplicidade e por imitar a operação real; a CPCV entra quando você precisa de uma distribuição honesta de desempenho.
CPCV elimina o overfitting?
Não. A CPCV elimina o vazamento dentro de um caminho e dá uma distribuição honesta, mas não protege contra o meta-overfitting — testar muitas ideias até uma parecer boa por acaso. Por isso ela é usada junto com a probabilidade de overfitting (PBO) e o Sharpe deflacionado, mais um hold-out final intocado e um racional econômico para a estratégia.
Referências
- López de Prado, M. (2018). Advances in Financial Machine Learning. John Wiley & Sons. (Capítulos sobre purging, embargoing e Combinatorial Purged Cross-Validation.)
- Bailey, D.; Borwein, J.; López de Prado, M.; Zhu, Q. J. (2014/2017). The Probability of Backtest Overfitting. Journal of Computational Finance.
- Bailey, D.; López de Prado, M. (2014). The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting and Non-Normality. Journal of Portfolio Management.
- Quant Beckman (2025). Combinatorial Purged Cross Validation for Optimization. quantbeckman.com. (Síntese aplicada do framework com purge, embargo e seleção pelo 10º percentil da PSR.)
Presente para Leitores: Robô de Gradiente Linear Gratuito
Estou liberando o acesso ao meu setup pessoal de Gradiente Linear sem custo nenhum. É só clicar e me pedir o arquivo.
