Gráfico volátil de preço do bitcoin em tela de trading
Trading

Overfitting no trading: por que robôs com backtest perfeito falham

Overfitting no trading é ajustar a estratégia ao ruído do passado. Veja como identificar, um exemplo em Python e como evitar com out-of-sample e walk-forward.

Imagem: Boletim Bitcoin

Por Redação Boletim Bitcoin

. Leitura de 6 min.

Overfitting no trading é ajustar uma estratégia ao histórico até ela “decorar” o passado, inclusive o ruído aleatório, em vez de capturar um comportamento que se repete. O resultado é o robô com backtest perfeito que perde dinheiro assim que vai para a conta real. É o erro mais comum, e mais caro, de quem começa no trading algorítmico.

Em resumo: quanto mais parâmetros e mais combinações você testa, maior a chance de o melhor resultado ser sorte. Para se proteger, use poucos parâmetros, reserve dados fora da amostra, faça walk-forward, inclua custos e desconfie de curvas de capital perfeitas. Um robô robusto tem desempenho razoável numa faixa ampla de parâmetros, não só num ponto.

O que é overfitting, em linguagem simples?

O termo vem da estatística e do aprendizado de máquina. Um modelo “sobreajustado” explica muito bem os dados que já viu e mal os novos, como mostra a figura clássica do verbete da Wikipedia.

Gráfico com pontos de duas classes separados por uma linha suave e por uma linha cheia de curvas que se ajusta a cada ponto A linha verde contorna cada ponto e acerta 100% dos dados conhecidos; a preta é mais simples e erra alguns. Em dados novos, a preta tende a se sair melhor. É o mesmo dilema de um robô com dezenas de filtros. Crédito: Chabacano, licença CC BY-SA 4.0, via Wikimedia Commons.

No trading, a “linha verde” é a estratégia que tem filtro de horário, filtro de dia da semana, três médias, IFR entre 37 e 61 e stop de 143 pontos. Cada filtro elimina algumas perdas do passado. Juntos, criam uma regra que só funciona naquele passado específico.

Por que o backtest perfeito engana?

Porque o mercado tem muito ruído. Se você testar combinações suficientes, alguma vai parecer brilhante por acaso, do mesmo jeito que, entre mil pessoas jogando moeda, alguém acerta dez caras seguidas.

Os pesquisadores David Bailey, Jonathan Borwein, Marcos López de Prado e Qiji Zhu chamaram isso de backtest overfitting em artigo publicado em 2014 nas Notices da American Mathematical Society. A conclusão: quanto mais configurações se testa, mais provável que o melhor backtest seja sobreajustado, e quase ninguém informa quantas tentativas fez (resumo no SSRN). Os autores argumentam ainda que, em certas condições, o resultado esperado fora da amostra pode ser negativo, não apenas zero.

3 parâmetroscom 20 valores cada
8.000backtests diferentes (20 × 20 × 20)
1"campeão" que pode ser só sorte

Exemplo em Python: o campeão do treino no teste

O código abaixo testa 174 combinações de médias móveis num período de treino (in-sample) e aplica o melhor par a um período de teste (out-of-sample) que não participou da escolha:

import itertools
import pandas as pd

df = pd.read_csv("btcusdt_1d.csv", parse_dates=["date"], index_col="date")
treino = df.loc[:"2022-12-31", "close"]   # in-sample
teste = df.loc["2023-01-01":, "close"]    # out-of-sample

def backtest(close, r, l, custo=0.001):
    rapida = close.rolling(r).mean()
    lenta = close.rolling(l).mean()
    pos = (rapida > lenta).astype(int).shift(1).fillna(0)
    ret = pos * close.pct_change().fillna(0) - pos.diff().abs().fillna(0) * custo
    return (1 + ret).prod() - 1

grade = [(r, l) for r, l in itertools.product(range(5, 55, 5), range(20, 210, 10)) if r < l]
resultados = {p: backtest(treino, *p) for p in grade}
melhor = max(resultados, key=resultados.get)

print(f"Combinações testadas: {len(grade)}")
print(f"Melhor no treino {melhor}: {resultados[melhor]:.1%}")
print(f"Mesmos parâmetros no teste: {backtest(teste, *melhor):.1%}")

O que importa não é o número exato, que depende dos dados, e sim a comparação. Se o retorno do teste for muito pior que o do treino, o “campeão” provavelmente explorou ruído. Um exercício melhor ainda é olhar a tabela inteira de resultados: se os vizinhos do melhor par também vão bem, há uma região estável; se o melhor é um pico isolado cercado de prejuízo, é overfitting. Os fundamentos do teste estão em backtest e o código base em Python para trading.

Sinais de que sua estratégia está sobreotimizada

Sinais de robustez

  • Poucos parâmetros, com lógica explicável
  • Resultado parecido em faixas amplas de valores
  • Funciona, com menos brilho, em outros ativos
  • Out-of-sample coerente com o in-sample
  • Centenas de operações na amostra

Sinais de overfitting

  • Curva de capital quase em linha reta
  • Parâmetros "quebrados" como 37, 143, 61
  • Muda de lucro para prejuízo com ajuste mínimo
  • Filtros criados para evitar perdas específicas
  • Poucas operações e taxa de acerto muito alta

Como evitar overfitting: o método

Defesas contra a sobreotimização

  1. Hipótese antes dos dadosTenha um motivo para a regra funcionar (tendência, reversão à média) antes de abrir o otimizador.
  2. Poucos parâmetrosCada parâmetro extra multiplica as combinações e a chance de achar sorte.
  3. Reserve o out-of-sampleSepare 20% a 30% do histórico mais recente e teste uma única vez.
  4. Walk-forwardOtimize numa janela, teste na seguinte, avance e junte só os trechos de teste.
  5. Escolha o platô, não o picoPrefira parâmetros no meio de uma região boa, não o máximo isolado.
  6. Teste em outros mercadosUma ideia de tendência que só funciona em um ativo é suspeita.
  7. Inclua custos e conte as tentativasAnote quantas versões testou; quanto mais, mais exigente deve ser a validação.

Walk-forward na prática

O método foi apresentado por Robert Pardo em 1992, segundo a Wikipedia. Exemplo com dados de 2019 a 2026:

RodadaOtimiza emTesta em
12019 a 20201º semestre de 2021
22º sem. de 2019 a 1º sem. de 20212º semestre de 2021
32020 a 20211º semestre de 2022
…avança 6 meses…
Finalaté 1º sem. de 20262º semestre de 2026

O desempenho que vale é o da soma dos semestres de teste, que simula como o robô seria reotimizado e usado na vida real.

Ferramentas que ajudam (e que podem atrapalhar)

O MetaTrader 5 tem otimização completa e um algoritmo genético rápido, que busca as melhores combinações cruzando e mutando conjuntos de parâmetros, segundo a ajuda sobre tipos de otimização. É poderoso, e por isso mesmo perigoso: o algoritmo genético encontra o pico de sorte com muita eficiência. Use junto com a opção “Forward” do testador, que reserva 1/2, 1/3 ou 1/4 do período para validação (ajuda do testador). Detalhes no guia de MQL5 Expert Advisor.

No TradingView, um primo do overfitting é a repintura: scripts que calculam diferente no histórico e em tempo real, por exemplo usando dados de candle ainda aberto ou de tempo gráfico maior sem confirmação, conforme a documentação de repainting. O resultado é o mesmo: backtest lindo, operação real ruim. O tutorial de Pine Script mostra como evitar.

O vídeo abaixo, em português, mostra como separar dados de otimização e de validação e por que o melhor resultado do otimizador raramente é o mais confiável.

Overfitting e robôs vendidos na internet

Muitos robôs comercializados exibem backtests de anos sem uma única semana ruim. Essa perfeição é, quase sempre, sinal de sobreotimização ou de lógicas como martingale e grid sem stop, que acumulam pequenos ganhos até uma perda enorme. Antes de pagar por um robô, peça histórico real verificável, explicação da lógica e teste em conta demo. As diferenças entre essas lógicas estão em estratégias de robôs, e os golpes mais comuns em golpes com criptomoedas.

Atenção: um robô sobreotimizado não falha devagar. Como ele foi ajustado para evitar as perdas do passado, a primeira situação nova costuma pegar o tamanho de posição inteiro. Tenha sempre stop, limite de perda diária e gestão de risco independentes da estratégia.

Conclusão

Overfitting não se resolve com mais otimização, e sim com menos: menos parâmetros, menos tentativas e mais validação em dados novos. A pergunta certa diante de um backtest não é “quanto ganhou?”, e sim “quantas versões foram testadas até chegar aqui e como ela se saiu nos dados que não viu?”. Para o panorama geral, veja o que é trading algorítmico.

Conteúdo informativo, não é recomendação de investimento.

Perguntas frequentes

O que é overfitting no trading?

É quando uma estratégia ou robô é ajustado tanto ao histórico que passa a capturar o ruído aleatório daquele período, e não um padrão real. O backtest fica excelente, mas o desempenho ao vivo desaba.

Como saber se meu robô está sobreotimizado?

Sinais comuns: muitos parâmetros, resultado que muda muito com pequenas alterações nos valores, desempenho ruim no período out-of-sample e curva de capital perfeita demais no histórico.

Como evitar overfitting?

Use poucos parâmetros, reserve dados out-of-sample, faça walk-forward, teste em outros ativos e períodos, inclua custos e prefira regiões de parâmetros estáveis em vez do pico isolado.

Otimizar parâmetros é sempre ruim?

Não. Otimizar é útil para entender a sensibilidade da estratégia. O problema é escolher o melhor resultado de centenas de tentativas e tratá-lo como expectativa futura sem validação em dados novos.

Referências

  1. Bailey, Borwein, López de Prado e Zhu: Pseudo-Mathematics and Financial Charlatanism (SSRN, 2014)
  2. Wikipedia: Overfitting
  3. Wikipedia: Walk forward optimization
  4. Investopedia: Overfitting
  5. MetaTrader 5: tipos de otimização
  6. MetaTrader 5: teste de estratégias (forward test)
  7. TradingView: Pine Script docs, Repainting
  • overfitting
  • sobreotimização
  • backtest
  • walk-forward
  • out-of-sample
  • robô de trading

Este conteúdo é informativo e não é recomendação de investimento. Encontrou um erro? Escreva para contato@boletimbitcoin.com.

Leia também