Atualizado em 02/08/2026
Direto ao ponto
A validação cruzada k-fold vaza informação em finanças, porque os dados não são independentes e o rótulo de um trade só existe depois que ele fecha. A CPCV, de Marcos López de Prado (2018), conserta isso com purge e embargo, e troca um número de desempenho por uma distribuição ao longo de vários caminhos de backtest. Eu rodei ela com 6 folds sobre 62 robôs e cerca de 31.026 carteiras avaliadas. Funcionou, e ainda assim eu quase mandei o portfólio errado para produção, por um bug que lia o resultado de trás para frente.
A pergunta de qualquer validação é se o resultado vai sobreviver ao futuro. A maioria dos métodos populares responde mal porque deixa informação do futuro entrar no treino sem ninguém perceber. Este artigo mostra onde o k-fold quebra em série financeira, como a CPCV fecha esse buraco, e o que aconteceu quando rodei o método no meu portfólio de verdade.
Ele conversa com a análise walk-forward, com a divisão entre in-sample e out-of-sample, com a probabilidade de overfitting, com o teste de robustez e com o Sharpe deflacionado.
Por que o k-fold padrão vaza em finanças
O k-fold divide os dados em k partes iguais, treina em k menos uma e testa na restante, repetindo k vezes. Isso vale quando cada observação é independente das demais. Mercado não é assim, e viola a premissa por duas vias.
A primeira é a autocorrelação. O valor da série em t depende do valor em t menos 1, e essa dependência serial é justamente o que quase toda estratégia tenta explorar. Embaralhar os dados antes de montar os folds, que é o hábito importado da ciência de dados, destrói a estrutura temporal e torna a validação inútil.
A segunda é o vazamento do futuro, mais sutil. Um split de 5 folds sobre 10 anos pode treinar nos anos 1 e 2, 3 e 4, 7 e 8, 9 e 10, e testar em 5 e 6. O modelo avaliado em 2015 foi treinado com dados de 2018. Ele viu o futuro, e o Sharpe que sai disso não significa nada.
Tem ainda um agravante que é só de trading: o rótulo é construído olhando para frente. O rótulo de uma foto de gato é estático. O rótulo de um trade, que é a resposta para “essa 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 dependem da mesma janela futura, uma observação no treino e outra no teste passam a carregar a mesma informação. López de Prado chama isso de concorrência de rótulos. É por isso que a correção precisa acontecer no nível do rótulo, e não só reordenando os folds.
Walk-forward melhora, e continua frágil
O walk-forward respeita a flecha do tempo. Treina no bloco 1 e testa no 2, treina em 1 e 2 e testa no 3, e assim por diante. Isso mata o vazamento grosseiro, porque sempre treina no passado e testa no futuro.
O problema é que ele depende do caminho. O parâmetro que sai como ótimo está calibrado para a sequência de regimes que aconteceu naquela história específica. Se os últimos blocos foram uma alta forte, o processo favorece parâmetros adaptados a esse ambiente. E como o walk-forward entrega poucos conjuntos de teste, a média final é instável. É um caminho só, e a história poderia ter sido outra.
Purge: o vão entre treino e teste
O purge remove do treino qualquer amostra cujo período de formação do rótulo encoste no período de teste.
Um exemplo torna concreto. Treino nos índices 100 a 800, teste em 820 a 1000. Se a regra olha 3 dias à frente, avaliar o parâmetro no índice 798 já depende dos dados em 799, 800 e 801, que estão colados no teste. O purge corta essa franja, por exemplo os índices 790 a 800, para que o desempenho de cada parâmetro seja julgado sobre dados completamente separados do teste que vem depois.
Embargo: o descanso depois do teste
O embargo descarta uma faixa de observações logo depois de cada conjunto de teste, para quebrar a dependência entre as rodadas. Mercado tem memória. Se o período de teste pegou um estresse de volatilidade entre os índices 820 e 1000, a dinâmica disso continua viva em 1001. Um split novo que começasse a treinar ali estaria sendo escolhido pelo rescaldo do teste anterior.
Na formulação de López de Prado o embargo é percentual. Cinco por cento sobre mil observações exclui as 50 amostras imediatamente posteriores ao teste. O efeito é que cada medição de desempenho vira uma amostra mais independente, e a distribuição final fica mais confiável.
O salto combinatório: de um número para uma distribuição
Aqui está o que dá nome ao método. A série é dividida em N grupos sequenciais, e sistematicamente se escolhem todas as combinações de k grupos como conjunto de teste. O número de combinações segue o coeficiente binomial, e cada observação aparece em k conjuntos de teste, gerando caminhos de backtest distintos, todos com purge e embargo aplicados:
\varphi[N,k] = \frac{k}{N} \times \binom{N}{k}Com N igual a 6 e k igual a 2, são 15 combinações de treino e teste, e 5 caminhos completos. Subindo para N igual a 10, são 45 combinações e 9 caminhos. Cada trecho da série passa a ser testado várias vezes, sob vizinhanças diferentes.
O efeito prático é outro tipo de resposta. Para cada parâmetro testado você não recebe mais um score, recebe uma distribuição de scores, um por caminho. Um caminho treina numa alta e testa num crash. Outro treina num lateral volátil e testa numa recuperação. Agregando esses cenários você lê a capacidade do parâmetro em vários mundos possíveis, e não só naquele que por acaso aconteceu.
O custo é computacional, e ele é honesto: o problema é paralelizável, então roda bem em vários núcleos, mas roda muitas vezes.
Selecionar pelo piso, e não pelo pico
Com a distribuição na mão, a escolha muda de pergunta. Deixa de ser qual parâmetro deu o maior número e passa a ser qual parâmetro tem o piso mais alto. A síntese de Quant Beckman (2025) sobre o arcabouço de López de Prado propõe ranquear pelo décimo percentil da distribuição, que responde qual desempenho esperar mesmo nos dez por cento piores cenários históricos.
Visualmente vira um box plot por parâmetro, e você escolhe a caixa cujo bigode inferior é o mais alto, mesmo que a mediana dela 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 grupo pequeno dos melhores. Se os melhores são vizinhos, como 28, 30, 31, 27 e 33, existe um platô estável. Se estão espalhados, como 15, 48, 7 e 82, a premissa da estratégia é suspeita.
O que aconteceu quando rodei isso no meu portfólio
Saindo da teoria. Eu rodei CPCV honesta com 6 folds sobre 62 robôs curados de um funil de 124 candidatos, janela de 2024 a 2026, avaliando cerca de 31.026 carteiras pelo algoritmo de seleção e com bootstrap de 8.000 reamostragens. O objetivo era escolher quais robôs entram no portfólio.
O primeiro resultado foi desconfortável e útil. Nos 53 robôs elegíveis, a probabilidade de overfitting calculada pelo método CSCV deu 0,91. Lido ao pé da letra, isso diz que ranquear robô por Sharpe não prevê nada sobre o desempenho futuro, e que a decisão certa seria segurar todos em vez de escolher o melhor. Foi o que eu fiz na época.
E o bootstrap concordava com o desconforto. Entre os cinco portfólios candidatos que a seleção produziu, nenhum teve probabilidade de vitória acima de 0,5 contra os outros. Empate estatístico. Cinco carteiras diferentes, e a matemática dizendo que eu não tinha como distinguir entre elas.
O bug que inverteu a leitura
Meses depois, numa auditoria do código, apareceu o problema. O cálculo estava reportando o complemento. O que eu li como probabilidade de overfitting de 0,91 era, na direção certa, algo em torno de 0,075. O número não era péssimo. Era ótimo.
Repare no tamanho do estrago possível. Um erro de sinal num indicador transformou “esse processo de seleção não vale nada” em “esse processo de seleção é sólido”, e nada no código quebrou. Não houve exceção, não houve alerta. O gráfico saiu bonito e o número saiu invertido.
A lição virou regra aqui dentro: a direção de um indicador precisa de teste com invariante conhecido. Alimentar o cálculo com um caso cuja resposta você já sabe, como uma série puramente aleatória, e conferir se o número sai do lado certo da escala. É barato e teria pego o erro no primeiro dia.
Tem uma ironia útil nessa história. A decisão que eu tomei com o número errado, que foi segurar todos os robôs em vez de escolher o melhor, continua sendo a decisão certa por outros motivos, ligados a diversificação efetiva e controle de cauda. Acertei o caminho lendo o mapa de cabeça para baixo. Foi sorte, e sorte não se repete de propósito.
| Medida | Valor | Contexto |
|---|---|---|
| Folds da CPCV | 6 | Build 2024 a 2026 |
| Robôs avaliados | 62 | Curados de um funil de 124 |
| Carteiras testadas | ~31.026 | Seleção gulosa sobre os folds |
| Reamostragens do bootstrap | 8.000 | Semente fixa, resultado reproduzível |
| PBO reportado (errado) | 0,91 | O código devolvia o complemento |
| PBO na direção certa | ~0,075 | Nos 53 robôs elegíveis |
| Portfólios em empate estatístico | 5 de 5 | Nenhum com p de vitória acima de 0,5 |
A ligação com PBO e o Sharpe deflacionado
A CPCV é a infraestrutura que torna mensurável a probabilidade de overfitting. Quando você testa muitos parâmetros na mesma história e escolhe o melhor, está selecionando erro de estimação positivo, porque o máximo de um conjunto de variáveis aleatórias quase sempre parece impressionante. Bailey, Borwein, López de Prado e Zhu (2014) formalizaram isso na PBO, que mede a probabilidade de a configuração escolhida como melhor in-sample render abaixo da mediana fora da amostra. Os múltiplos caminhos da CPCV alimentam esse cálculo.
No mesmo espírito está o Sharpe deflacionado, que desconta do Sharpe observado a inflação causada pelo número de tentativas e pela variância dos Sharpes testados. Quanto mais configurações você experimentou, mais alto o Sharpe precisa ser para significar alguma coisa. O valor esperado do máximo Sharpe sob hipótese nula cresce com o número de testes:
E[\max SR] \approx \sqrt{\frac{2 \ln N}{T}}A CPCV não substitui essas correções. Ela fornece a distribuição honesta sobre a qual a PBO e o Sharpe deflacionado operam.
Vale também trocar a métrica que entra na distribuição. A Probabilistic Sharpe Ratio devolve a probabilidade de o Sharpe verdadeiro superar um benchmark levando em conta assimetria e curtose reais dos retornos, que raramente são normais em trading. Um Sharpe alto com assimetria negativa forte é mais frágil do que parece, e a PSR pune isso. Ranquear pelo décimo percentil da PSR é o oposto da otimização ingênua que produz o pico bonito in-sample.
Onde a CPCV não te salva
Ela protege contra o ajuste de um parâmetro a um caminho histórico. Não protege contra o meta-overfitting: se você testar dezenas de ideias diferentes no mesmo conjunto de dados, todas com CPCV rigorosa, uma vai parecer robusta por acaso. A defesa aqui é disciplina de pesquisa, racional econômico para cada estratégia, e um pedaço final de dados que ninguém tocou.
Ela também assume que o futuro é uma recombinação do passado, e não antecipa quebra estrutural genuína. Exige série longa o bastante, então em ativo com pouca história as janelas ficam curtas e o resultado instável.
E existe o limite que eu vivi na pele. A complexidade do método abre espaço para bug silencioso. Um erro de índice no purge reintroduz vazamento sem o código nunca quebrar, e um erro de direção num indicador inverte a leitura sem levantar suspeita. Validação rigorosa reduz o autoengano. Não elimina.
Perguntas frequentes
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, por exemplo o 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.
Qual a diferença entre purge e embargo?
O purge remove amostras de treino que se sobrepõem ao teste, atacando o vazamento direto. O embargo descarta amostras logo depois do teste, atacando a dependência residual, porque a memória do mercado persiste e contaminaria o próximo split. Os dois juntos fazem de cada caminho de backtest uma amostra mais independente.
Quantos caminhos de backtest a CPCV gera?
Com N grupos e k grupos de teste, a conta é k dividido por N, multiplicado pelo coeficiente binomial de N escolhe k. Com 6 grupos testando 2 por vez são 5 caminhos, e com 10 grupos testando 2 são 9. Cada caminho tem purge e embargo aplicados, e é dessa multiplicação que nasce a distribuição de desempenho no lugar de um número solitário.
CPCV substitui o walk-forward?
Ela generaliza o walk-forward para múltiplos caminhos. O walk-forward é um caminho temporal só, sensível à sequência de regimes que ocorreu. A CPCV testa o parâmetro contra muitas recombinações dos regimes históricos e expõe fragilidade que um caminho esconderia. O walk-forward continua útil pela simplicidade e por imitar a operação real.
CPCV elimina o overfitting?
Não. Ela elimina o vazamento dentro de um caminho e entrega uma distribuição honesta, e não protege contra testar muitas ideias até uma parecer boa por acaso. Por isso ela anda junto com a probabilidade de overfitting, com o Sharpe deflacionado, com um hold-out final intocado e com um racional econômico para a estratégia.
Vale a pena implementar CPCV num projeto pequeno?
Vale se você seleciona entre muitos candidatos, que é quando o overfitting de seleção morde. Se você tem duas ou três estratégias e um racional econômico claro para cada uma, o walk-forward com um hold-out final resolve. E qualquer que seja a escolha, teste a direção dos seus indicadores contra um caso de resposta conhecida antes de confiar neles.
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). The Probability of Backtest Overfitting. Journal of Computational Finance.
- Bailey, D.; López de Prado, M. (2014). The Deflated Sharpe Ratio. Journal of Portfolio Management.
- Quant Beckman (2025). Combinatorial Purged Cross Validation for Optimization. Síntese aplicada com seleção pelo décimo percentil da PSR.
- Backtests e auditoria de código próprios do Invista Já, portfólio de robôs SQX, janela 2024 a 2026, in-sample.
- Machine Learning em Trading: As 4 Armadilhas que Eu Vi na Prática
- Overfitting no Backtest: A Probabilidade de a sua Estratégia Campeã Ser Sorte
- Sharpe Deflacionado: Por Que o meu Backtest Estava Inflado (com dado real)
- Anatomia de uma Estratégia Real: Keltner e Estocástico no EUR/USD, e a Degradação de Só 1%
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.
Quem escreve: Flávio Araújo
Trader algorítmico há mais de 13 anos, MBA em Mercado de Capitais e Derivativos. Mantém um laboratório próprio que já rodou mais de 20 milhões de backtests e analisou mais de 20 mil estratégias, e opera um portfólio de robôs acompanhado publicamente no blog. LinkedIn · Instagram · YouTube
