Machine Learning em Trading: As 4 Armadilhas que Eu Vi na Prática

Mercados sao quase o pior cenario para ML: nao-estacionariedade, vazamento de dados, sinal-ruido baixo e overfitting. Onde o ML realmente ajuda e onde ele engana.

Atualizado em 21/08/2026

O número: a minha própria ferramenta de medir overfitting estava overfitada a um bug. A função de PBO da esteira reportava 0,91 num portfólio cujo valor verdadeiro era ~0,09: o ranking estava invertido e ela devolvia o complemento. Um red-team de código pegou. Guardo esse episódio como resumo de tudo que aprendi sobre machine learning em trading: as armadilhas não moram só no modelo, moram no dado, no funil de busca e até na régua que você usa pra se auditar. Este artigo cobre as quatro que eu vi de perto na minha operação, com o número real de cada uma.

Machine learning em trading tem uma taxa de fracasso enorme, e a causa quase nunca é o algoritmo. López de Prado, que dirigiu times de ML em fundos bilionários, catalogou os motivos: aplicar em série financeira as mesmas práticas que funcionam em visão computacional ou recomendação de filme. O mercado é o pior caso possível pra ML: sinal fraquíssimo afogado em ruído, dados autocorrelacionados, regimes que mudam e uma amostra efetiva minúscula. Eu rodo mineração sistemática de estratégias há anos, com dinheiro real na ponta, e cada armadilha da literatura eu encontrei em algum momento na minha esteira, com número pra mostrar. Já escrevi sobre duas delas em profundidade, o PBO, a probabilidade de overfitting do backtest, e o Sharpe deflacionado por múltiplos testes. Aqui o foco é o que é específico de ML: onde o aprendizado de máquina quebra de um jeito que o backtest tradicional não quebra, e o que eu faço a respeito.

O que a pesquisa mostra: em série temporal financeira, a validação cruzada aleatória fabrica resultado falso, porque as observações são autocorrelacionadas e o embaralhamento coloca informação do futuro no treino. A correção consolidada é validar por blocos temporais com purga das observações que se sobrepõem à fronteira e embargo após o teste (López de Prado, 2018).

Armadilha 1: vazamento temporal, ou por que a validação cruzada aleatória mente

A validação cruzada padrão (k-fold) embaralha as observações e sorteia quais vão pro treino e quais vão pro teste. Em dados independentes, isso funciona. Em série temporal financeira, isso é uma máquina de fabricar resultado falso, por dois mecanismos. Primeiro, as observações vizinhas são quase cópias umas das outras (a volatilidade de hoje parece com a de ontem, um trade aberto atravessa vários candles), então o modelo “testado” em pontos sorteados já viu os vizinhos daqueles pontos no treino. Segundo, com embaralhamento o treino contém literalmente o futuro do teste. O modelo aprende o regime de 2025 e é avaliado em 2024. A acurácia sobe, e o número não significa nada.

A solução que a literatura consolidou, e que eu uso, é a de López de Prado (2018): validação com purga (remover do treino toda observação cujo horizonte se sobrepõe ao período de teste) e embargo (uma janela extra de segurança depois do teste, pra matar a autocorrelação residual). Na minha esteira isso vira um walk-forward estrito por data: seleciono os robôs numa era, meço na era seguinte, 5 dobras expandindo de 2019 a 2026, com 300 carteiras sorteadas por dobra como referência do acaso. Nunca por índice de linha, sempre por data, porque já me queimei nisso também: uma versão do meu comparador de dobras alinhava por índice em vez de data e comparava períodos diferentes achando que eram o mesmo. Vazamento temporal tem mil disfarces.

Armadilha 2: o melhor de N, quando a busca é maior do que você admite

Todo pipeline de ML em trading tem uma etapa de busca: grade de hiperparâmetros, seleção de features, arquiteturas testadas. Na mineração genética que eu uso, essa busca é explícita e gigantesca: o gerador produz centenas de estratégias por rodada, milhares no acumulado do garimpo, e só uma fração sobrevive aos filtros. Esse é o N verdadeiro do meu funil. O melhor Sharpe entre N tentativas cresce com N mesmo quando nenhuma tentativa tem vantagem real: com um build de ~3 anos, o teto do puro acaso fica em Sharpe ~1,8 com 600 tentativas e ~2,5 com 60.000. “O minerador achou 600 estratégias lucrativas” descreve o ruído funcionando como esperado.

O erro clássico, que eu cometi, é deflacionar pelo N que sobrou em vez do N que foi buscado. A minha Estação de validação usava um n_trials de mentirinha (as poucas finalistas) até uma auditoria externa apontar que o número honesto é o do garimpo inteiro, milhares. A conta muda completamente. O tratamento formal disso está no artigo do Sharpe deflacionado; a versão curta: quem não registra o tamanho real da própria busca está se enganando com precisão de duas casas decimais. Arnott, Harvey e Markowitz (2019) colocam isso como item central do protocolo deles: manter contagem de tudo que foi testado, inclusive o que foi jogado fora.

Dois painéis: o PBO reportado 0,91 parecia saudável; o valor real era 0,09 - a função devolvia 1-PBO. Teste o sinal da sua régua

Armadilha 3: a régua quebrada, quando a métrica de proteção está errada

Essa quase ninguém conta, porque dói. Quanto mais sofisticado o pipeline, mais código de validação você escreve, e esse código também tem bugs. O meu caso: a função que calcula o PBO (via CSCV, o método de Bailey e López de Prado) estava com a direção do ranking invertida e reportava o complemento do valor certo. O painel mostrava PBO = 0,91 pra um portfólio cujo PBO real era ~0,09. Note a perversidade: 0,91 significaria overfitting quase certo, 0,09 significa processo saudável. Eu estava lendo o oposto da realidade na métrica que existe justamente pra me proteger da realidade. Só uma auditoria adversarial de código, agentes re-derivando os números de forma independente, pegou. A mesma auditoria achou mais de uma dezena de atalhos de implementação do tipo, incluindo um drawdown calculado sem o zero inicial.

A lição prática, que vale pra qualquer um que calcula métrica com código próprio: teste a direção da régua com um caso degenerado conhecido. Alimente a função com um caso obviamente overfitado e um obviamente limpo e confira se os números saem do lado certo. Depois do conserto, toda função que decide dinheiro na minha esteira ganhou teste unitário com invariante conhecido. Em ML isso é ainda mais crítico do que em backtest simples, porque a cadeia entre o dado e a decisão é mais longa: mais elos, mais lugares pra um sinal trocado passar despercebido.

Armadilha 4: o regime muda, e o modelo aprendeu o regime errado

Série financeira não é estacionária. O processo gerador dos dados muda, e um modelo treinado num regime carrega pro seguinte exatamente os vieses errados. Isso não é abstração: eu tenho o número nas minhas dobras. No walk-forward de 2019 a 2026, o controle de risco da minha esteira bateu 75 a 100% das carteiras sorteadas em 4 das 5 dobras. A dobra que falhou foi 2022 (percentil 35): o ano do trend violento de dólar, Fed contra o mundo, em que a seleção feita na era anterior tinha aprendido um mercado que deixou de existir. E o espelho disso: 2025-26 virou janela de chicote, que sabota as regras simples de tendência e poupa outras famílias de estratégia. O mesmo pipeline, avaliado em eras diferentes, conta histórias opostas.

A consequência pra ML é dura. Um modelo flexível extrai do treino muito mais estrutura que uma regra simples, e quando o regime vira, ele tem muito mais coisa errada memorizada. É por isso que a literatura de momentum de série temporal continua relevante depois de décadas enquanto modelos complexos morrem em anos: regra simples com fundamento econômico degrada devagar; padrão estatístico sem mecanismo degrada de uma vez. Minha resposta de engenharia foi parar de tratar estratégia como ativo permanente e tratar como safra: gera, valida, opera, e um disjuntor corta quando o comportamento sai do envelope. O walk-forward me mostrou que a seleção sozinha não segura um choque de regime; o desenho do sistema precisa assumir que ele vem.

Por que eu não uso ML fim-a-fim pra gerar sinal

A confissão que estrutura este artigo: depois de anos nisso, eu não uso machine learning fim-a-fim pra gerar sinal de entrada. Uso mineração sistemática de regras (busca genética sobre blocos de indicadores e padrões de preço) seguida de validação estatística dura: walk-forward por data com purga, deflação pelo N real do garimpo, PBO, bootstrap em blocos, benchmark contra carteiras aleatórias. A razão é aritmética de amostra. O varejo tem uma série de preços por mercado, meia dúzia de regimes por década, e sinal fraco. Um modelo de alta capacidade nesse dado encontra estrutura espúria mais rápido do que qualquer validação consegue descartá-la. Rodei esse filme mais de uma vez: robôs com +0,06% por trade in-sample que desabam pra ~0% quando medidos numa era que a busca nunca viu. O ML funciona. O problema é que, no meu tamanho de dado, o retorno marginal da sofisticação está todo do lado da validação, e quase nenhum do lado do modelo.

Os grandes fundos que fazem ML funcionar têm o que eu não tenho: dados alternativos em volume, centenas de mercados, times inteiros só pra infraestrutura de validação. López de Prado é explícito nisso: os fracassos vêm de aplicar a ferramenta sem o ecossistema. Pra quem opera no meu tamanho, a fronteira útil do ML está em papéis auxiliares (dimensionar posição, filtrar regime, controlar qualidade da execução), e mesmo aí só com a validação na frente. Sobre usar modelos de linguagem nesse fluxo, que é uma pergunta diferente, escrevi um artigo sobre LLMs na descoberta de estratégias: o mesmo princípio se aplica, a geração pode ser criativa, a validação tem que ser implacável.

O protocolo que ficou

Destilando as quatro armadilhas em prática, o que roda na minha esteira hoje, e que espelha em boa parte o protocolo de Arnott, Harvey e Markowitz (2019):

Mecanismo antes de otimizar. Toda família de estratégia precisa de uma razão econômica pra existir antes de eu gastar CPU nela. Padrão sem mecanismo é candidato a ruído por definição.

Validação por data, nunca por sorteio. Walk-forward com eras que a busca nunca viu, purga na fronteira, embargo depois. A validação cruzada aleatória fica proibida pra qualquer coisa com dimensão temporal.

N honesto. O número de tentativas registrado é o do garimpo inteiro, milhares, não o das finalistas. Toda métrica de significância é deflacionada por ele.

Régua testada. Função que decide dinheiro tem teste unitário com caso degenerado conhecido. A auditoria adversarial do código roda antes de qualquer conclusão virar decisão.

Assumir a morte do regime. Benchmark contra o acaso em cada era, disjuntor de perda no operacional, e a expectativa explícita de que a dobra tipo 2022 vai acontecer de novo e a seleção não vai segurar sozinha.

Nada disso é glamouroso, e é exatamente o ponto. A parte difícil de machine learning em trading nunca foi treinar o modelo. Foi sempre provar, contra a sua própria vontade de acreditar, que o resultado não é um artefato da busca. No meu caso, a prova mais valiosa que o processo já produziu foi contra mim: um Sharpe de backtest no percentil 100 de 2.000 carteiras aleatórias, e um medidor de overfitting de cabeça pra baixo. Os dois episódios estão contados em detalhe no artigo do PBO.

Os números deste artigo

Métrica Valor Contexto
PBO reportado pela função com bug 0,91 Ranking invertido devolvia o complemento
PBO real após o conserto ~0,09 Processo saudável, leitura era oposta
Walk-forward da esteira 5 dobras, 2019-2026 300 carteiras sorteadas por dobra
Desempenho vs carteiras sorteadas 75 a 100% Batidas em 4 das 5 dobras
Dobra que falhou (2022) percentil 35 Ano do trend violento de dólar
Robôs in-sample vs era nunca vista +0,06% → ~0% Retorno por trade desaba fora da busca

Machine learning funciona em trading?

Funciona em contextos com dado abundante e validação industrial, e em papéis auxiliares (sizing, filtro de regime, execução) mesmo no varejo. Como gerador de sinal fim-a-fim com o dado que o trader individual tem, a probabilidade de o resultado ser overfitting supera em muito a de ser vantagem. A carga da prova é do modelo, e a prova é walk-forward em era nunca vista, deflacionada pelo N da busca.

Por que a validação cruzada k-fold falha em série temporal?

Porque as observações financeiras são autocorrelacionadas e o embaralhamento coloca informação do futuro no treino. O modelo é avaliado em pontos cujos vizinhos ele já viu. A correção é validar por blocos temporais com purga das observações que se sobrepõem à fronteira e embargo após o teste, como formalizado por López de Prado (2018).

Quantos dados são suficientes pra treinar um modelo de trading?

Menos do que parece haver. Uma série diária de 10 anos tem ~2.500 pontos, mas a amostra efetiva é muito menor por causa da autocorrelação, e o número de regimes independentes (o que de fato importa pra generalização) é da ordem de meia dúzia. É por isso que modelos de alta capacidade overfittam tão rápido: a razão parâmetros/informação real é péssima.

O que é o protocolo de Arnott, Harvey e Markowitz?

Uma lista de verificação de 2019 pra pesquisa quantitativa com aprendizado de máquina: estabelecer fundamento econômico antes do teste, registrar todas as tentativas (inclusive descartadas), desconfiar de resultados sem mecanismo, cuidar de dados fora da amostra de verdade e reconhecer os incentivos de quem publica o backtest. É a versão formalizada do que qualquer processo honesto de mineração precisa fazer.

Onde os fundos de ML mais erram, segundo López de Prado?

Nos pecados de processo: trabalhar por silos replicando o mesmo esforço, usar dados não estruturados sem tratamento, validação cruzada com vazamento, ignorar custos e capacidade, e sobretudo o backtest como ferramenta de pesquisa em vez de verificação final. O denominador comum é tratar finanças como um problema comum de ML, quando o dado financeiro viola quase todas as premissas dos métodos clássicos.

Referências

  • López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley. (Purged cross-validation, embargo, CSCV.) link.
  • López de Prado, M. (2017). The 7 Reasons Most Machine Learning Funds Fail. SSRN. link.
  • Arnott, R. D.; Harvey, C. R.; Markowitz, H. (2019). A Backtesting Protocol in the Era of Machine Learning. Journal of Financial Data Science, 1(1), 64-74. link.
  • Bailey, D. H.; Borwein, J. M.; López de Prado, M.; Zhu, Q. J. (2017). The Probability of Backtest Overfitting. Journal of Computational Finance, 20(4). link.

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.

Quero meu Robô Gratuito
🔒 Acesso Direto no WhatsApp
⚠️ Aviso de risco: O conteúdo do Invista Já é educacional e informativo sobre algotrading e estratégias quantitativas e não constitui recomendação ou consultoria de investimento, nem oferta ou solicitação de compra ou venda de qualquer ativo. Operações no mercado financeiro envolvem risco de perda, inclusive do capital investido, e resultados passados não garantem resultados futuros. Avalie seu perfil de risco e, se necessário, consulte um profissional certificado antes de investir.

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

Flávio Araújo
Flávio Araújo

Engenheiro com MBA em Mercado de Capitais e Derivativos. Atua há mais de 10 anos no Mercado Financeiro, com 6 anos dedicados ao Algotrading e estratégias quantitativas. Especialista em validação de robustez e automação de investimentos.

Artigos: 171