Como um bug de autocorrelação inflou a acurácia do meu modelo em 30% - e como eu corrigi
Eu estava feliz. Meu modelo de IA para previsão de criptomoedas estava com 96% de acurácia no horizonte de 30 minutos. 96%! Eu já estava pensando em como gastar o dinheiro que ia ganhar.
Era mentira. O modelo não tinha aprendido nada. Eu tinha um bug.
O sintoma
Olhando o histórico de trades verificados, vi algo muito estranho:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... 300 zeros seguidos ...]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ... 200 uns seguidos ...]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... 400 zeros seguidos ...]
Nenhum modelo real acerta 200 vezes seguidas e depois erra 400 vezes seguidas em um mercado volátil. Isso não é aprendizado — é um artefato.
O diagnóstico
Meu sistema registrava um "trade" (snapshot) a cada 2 segundos. Para o horizonte de 30 minutos, isso significava ~900 snapshots acumulados. Mas o detalhe crucial: eles não eram 900 trades independentes — era exatamente o mesmo evento de mercado registrado 900 vezes de forma sobreposta.
Se o mercado subiu durante aqueles 30 minutos, todos os 900 snapshots eram contados individualmente como "acertos". Se caiu, como "erros". O modelo podia estar prevendo "COMPRA" 100% das vezes — a acurácia alta só refletia se o mercado tinha subido ou descido de forma direcional naquele período.
Isso se chama autocorrelação temporal (e uma forma clássica de data leakage). As amostras não eram estatisticamente independentes. Minha acurácia de 96% era, na verdade, apenas a porcentagem do tempo que o mercado passou em tendência de alta naquele mês de teste.
A solução: subsampling estatístico
A correção foi simples na teoria, mas exigiu reestruturar o pipeline de verificação e armazenamento dos dados:
_FATOR_SUBSAMPLE = {
5: 1, # 5s: registra a cada 1 tick
60: 5, # 1min: registra a cada 5 ticks (10s)
300: 25, # 5min: registra a cada 25 ticks (50s)
1800: 150, # 30min: registra a cada 150 ticks (5min)
3600: 300, # 1h: registra a cada 300 ticks (10min)
}
Agora, cada horizonte de tempo só registra 1 trade a cada N ticks. Para o horizonte de 30 minutos, o fator passou a ser 150. Ou seja, em vez de gerar 900 snapshots idênticos e viciados, passei a coletar apenas 6 amostras verdadeiramente independentes por período.
O resultado
A acurácia desabou de 96% para ~52%.
Doeu no ego, mas agora cada trade no histórico representa uma decisão real e independente do modelo, não um viés mascarado do mercado.
Troquei volume falso por qualidade real. E isso mudou tudo na hora de treinar a IA: sem o ruído e a falsa sensação de acerto da autocorrelação, o aprendizado tornou-se muito mais estável e as métricas finalmente passaram a refletir a realidade.
O que aprendi
Quando a acurácia parece boa demais para ser verdade, ela é. Sempre.
Desconfie imediatamente de blocos massivos de acertos ou erros consecutivos.
Verifique sempre a independência estatística das suas amostras (I.I.D.).
Nunca, jamais confie em métricas de validação sem auditar visualmente como os dados estão a ser fatiados.
Isto aplica-se a qualquer projeto de Machine Learning ou Data Science que lide com dados temporais (Time Series), não apenas ao mercado financeiro.
Referências:
Repositório no GitHub: https://github.com/EventHorizon-ia/EventHorizon
Painel de Auditoria Pública do Projeto:
https://eventhorizon-ia.github.io/trader-ai/dashboard.html