Em palavras simples — Há leakage quando o passado recebe uma pista que só estaria disponível depois da decisão. O backtest então resolve um problema mais fácil do que o sistema real.
Data leakage é a passagem de informação proibida entre etapas da pesquisa. O viés de antecipação (look-ahead bias) é o caso temporal em que a regra usa, direta ou indiretamente, informação futura. Ambos podem surgir nos dados, nas transformações, na seleção do modelo, na validação ou no simulador de ordens.
Distinções essenciais
| Problema | Exemplo |
|---|---|
| Look-ahead | usar o fechamento para sinalizar e comprar no mesmo fechamento sem mecanismo executável |
| Target leakage | uma feature incorpora informação derivada do resultado futuro |
| Contaminação entre splits | scaler, seleção de features ou imputação são ajustados antes de separar treino e teste |
| Data snooping | o resultado do teste orienta repetidamente parâmetros e regras |
| Survivorship | o universo histórico contém apenas os instrumentos que sobreviveram |
Os problemas podem coexistir, mas pedem controles diferentes. Separar treino e teste não corrige um dataset já revisado com o futuro; dados point-in-time não eliminam a seleção entre centenas de modelos.
Três relógios: sinal, ordem e fill
O relógio informativo define quando o input pode ser usado. O relógio decisório define quando o sinal termina. O relógio de mercado define quando uma ordem pode chegar e encontrar liquidez. Um resultado causal respeita:
evento ≤ disponibilidade ≤ sinal ≤ ordem ≤ fillLag operacional, cutoff, timezone, calendário e latência fazem parte da regra. Um “gap” entre treino e teste pode proteger contra sobreposição de labels, mas não substitui a análise desses relógios.
Onde o leakage se esconde
Features e transformações
Normalizar com média e desvio da amostra inteira, preencher missing com valor calculado no futuro, ajustar PCA ou selecionar features antes do split transfere informação. Cada etapa com estado deve ser ajustada apenas no treino e aplicada ao período seguinte. Fundamental e macro exigem vintages e datas de publicação.
Pesquisa e seleção
Consultar repetidamente o holdout, escolher a melhor janela após ver o teste ou publicar apenas estratégias vencedoras torna a avaliação parte do treinamento. O registro de tentativas e um teste final intacto tornam essa seleção visível.
Ordens e execução
Fills na máxima ou mínima da barra, fill de limite apenas porque o preço tocou, uso do volume completo antes do fim do intervalo e reequilíbrio com composição anunciada depois são formas de antecipação. O simulador precisa de sequência, latência, quantidade e prioridade compatíveis com os dados disponíveis.
Protocolo causal
- Definir o instante da decisão e o primeiro instante executável.
- Versionar os dados segundo publicação, ingestão e revisão.
- Separar os splits antes de ajustar qualquer transformação com estado.
- Recalcular features em modo walk-forward, sem acesso ao futuro.
- Preservar composição histórica e eventos corporativos.
- Modelar ordens e fills em eventos posteriores ao sinal.
- Registrar todas as consultas ao holdout e todos os candidatos.
- Reproduzir o processo evento a evento com assertions temporais.
Testes diagnósticos
Truncar o dataset numa data antiga e recalcular tudo: valores anteriores não devem mudar sem revisão explicitamente versionada. Atrasar artificialmente inputs deve atrasar sinais. Embaralhar o futuro ou usar labels aleatórias não deve produzir performance estável. Comparar batch com execução sequencial ajuda a encontrar transformações globais. Esses testes detectam classes de erro, mas não provam ausência total de leakage.
Dependência entre observações e etapas aprendidas
O vazamento também aparece quando duas linhas parecem diferentes, mas carregam parte do mesmo evento. Labels com horizontes sobrepostos, várias janelas do mesmo ativo ou ativos ligados por uma mesma divulgação podem atravessar a fronteira entre treino e teste. Ordenar cronologicamente continua necessário, mas pode não bastar: é preciso medir quanto tempo cada observação usa e impedir que a informação compartilhada contamine os dois lados.
Toda etapa que aprende com dados pertence ao treino: imputação, seleção de variáveis, winsorization, normalização, redução de dimensionalidade e escolha de limiares. Primeiro ela é ajustada dentro do segmento permitido; depois é aplicada, sem reaprender, ao segmento seguinte. Fazer o pré-processamento uma única vez no dataset completo torna o teste parcialmente conhecido, mesmo que o modelo principal nunca tenha visto suas linhas.
Há ainda uma diferença entre processamento em lote e operação sequencial. Um arquivo produzido ao fim do dia pode conter correções e registros que não existiam quando uma decisão intradiária foi tomada. Por isso, um teste causal deve reconstruir não só a data do dado, mas a ordem de chegada e a primeira janela de execução possível. Logs de ingestão, snapshots e testes de atraso ajudam a localizar essa ruptura.
Limites
Nem toda correlação forte é leakage, e um resultado fraco não garante pipeline causal. Algumas fontes não preservam vintages; microestrutura pode exigir dados indisponíveis; labels sobrepostas criam dependência mesmo com ordem temporal. Lacunas devem ser declaradas e testadas por sensibilidade.
Fontes
- Halbert White, A Reality Check for Data Snooping, Econometrica, 2000 — inferência quando o resultado selecionado emerge de muitas especificações.
- Robert D. Arnott, Campbell R. Harvey e Harry Markowitz, A Backtesting Protocol in the Era of Machine Learning — separação entre pesquisa, seleção, holdout e escassez de dados financeiros.
- David H. Bailey, Jonathan M. Borwein, Marcos López de Prado e Qiji Jim Zhu, The Probability of Backtest Overfitting — risco de sobreajuste decorrente da seleção entre muitas configurações.
- Federal Reserve Bank of St. Louis, FRED® versus ALFRED® — diferença entre história conhecida hoje e vintage conhecido no passado.
- scikit-learn, TimeSeriesSplit — validação cruzada ordenada no tempo e parâmetro de gap; documentação técnica oficial.