Python para backtesting forex — stack, ciclo e ressalvas honestas
O Strategy Tester do MT5 funciona enquanto a sua estratégia cabe dentro dos seus pressupostos — regras de entrada simples, um único instrumento, sem encanamento de dados complicado. Tente algo mais sob medida e a ferramenta começa a apertar, e é por isso que o pessoal sistemático mantém os seus backtests em Python há anos. As razões são diretas: controle total sobre as regras, bibliotecas de nível científico, qualquer fonte de dados dentro de um único script e um ciclo no qual o tempo entre a ideia e a curva de capital cai para minutos.
Por que os traders vão além do Strategy Tester
O Strategy Tester é bom em otimizar um expert em um par e um único intervalo de tempo — e é aí que ele para. Misture dados externos ao corretor, combine vários pares em um único sinal ou calcule um índice de Sharpe ao lado de uma distribuição de drawdown, e você acaba colando arquivos CSV no Excel. O Python condensa esse trabalho em um único script: as cotações da corretora fluem para o `pandas`, os dados macro se juntam pelo mesmo `merge` e as métricas de risco vêm de bibliotecas acadêmicas. O pano de fundo sobre como automatizar o ofício está no nosso guia de primeiros passos em trading algorítmico; vale também conhecer os conceitos de mercado que sustentam qualquer modelo antes de codá-lo.
O stack prático
O stack é curto. O tratamento de dados vive no `pandas` e no `numpy` — o primeiro cuida da série temporal e do resampling de M1 para H1, o segundo da aritmética vetorizada por baixo dos indicadores. O motor de backtest costuma ser o `backtrader` de Daniel Rodriguez, num estilo event-driven de Strategy e Cerebro, ou o `vectorbt` de Oleg Polakov quando você precisa varrer centenas de combinações de parâmetros em dezenas de segundos. Os gráficos vêm do `matplotlib` para relatórios estáticos e do `plotly` para revisão interativa. Os dados históricos entram pelo `yfinance` para fechamentos diários, pelo `ccxt` para cripto e pelo pacote oficial `MetaTrader5` para as cotações da corretora. Todo o stack é gratuito e de código aberto.
O ciclo de pesquisa — da regra à validação
Um projeto avança por quatro etapas que vale a pena manter separadas. Primeira: escreva as regras de entrada e saída em linguagem clara — se você não consegue dizer "eu compro quando a inclinação da EMA-50 é positiva e o fechamento imprime acima de uma máxima de vinte dias", não há motivo para abrir um editor. Segunda: traduza essas regras em expressões vetorizadas do `pandas` — uma condição ao longo de uma coluna inteira, sem laço barra a barra, razão pela qual dez anos de dados H1 são testados em segundos. Terceira: rode o motor sobre o histórico completo com comissão, slippage (derrapagem de preço), um stop e um take profit, e leia a curva de capital e a lista de operações. Quarta — onde os iniciantes silenciosamente pulam — valide fora da amostra: isole os últimos dois anos, otimize apenas na janela anterior e leia o veredito a partir de dados intocados. A mecânica de janela móvel está detalhada no nosso texto sobre análise walk-forward, e o contexto mais amplo de gestão de risco ajuda a interpretar cada métrica.
O que o Python não fará sozinho
Um usuário novato lê a documentação do `backtrader` e supõe que a biblioteca cuida de tudo. Não cuida. O motor padrão não sabe nada sobre o spread da sua corretora, não faz ideia de que as cotações derrapam cinco pips em torno de uma divulgação de notícia e não sabe que uma conta ECN cobra sete dólares por lote dos dois lados. Você digita isso tudo à mão — `commission`, `slippage_perc`, um modelo de spread personalizado que varia por hora. A segunda armadilha silenciosa é a qualidade dos dados: as séries gratuitas do `yfinance` carregam lacunas de fim de semana, e os dados tick da Dukascopy podem ser falhos em pares exóticos. O terceiro pecado é o amor por curvas suaves: um backtest in-sample com cinco parâmetros otimizados quase sempre anuncia 200 por cento ao ano até você remover uma variável e observar a curva sobre dados que o otimizador nunca tocou. Um teste realista costuma mostrar de 30 a 50 por cento menos do que a versão ingênua prometia.
Um exemplo ilustrativo — um projeto hipotético em EUR/USD
Suponha uma estratégia de abertura de Londres em EUR/USD usando barras M15: posição comprada (long) quando o preço imprime acima da máxima de cinco barras após as nove horas de Varsóvia, posição vendida (short) num rompimento abaixo da mínima; stop em 1,5 vezes o ATR de vinte períodos, take profit no dobro do stop. Você puxa os dados de 2018 a 2024 com o pacote `MetaTrader5`, carrega no `pandas` e faz resampling para M15. O backtest, com seis dólares de comissão por lote, um spread fixo de 0,8 pip fora das janelas de notícias e um pip de slippage de entrada aleatorizado, retorna uma taxa de acerto de 51 por cento, profit factor 1,28, drawdown máximo de 14 por cento e Sharpe 0,9. Dividir o histórico em quatro anos in-sample e dois anos out-of-sample reduz a média fora da amostra em cerca de um terço — deixando a decisão de implantação em terreno razoável, nada espetacular. Cada número acima é ilustrativo; mostra o formato da resposta, não uma promessa.
"Python tornou-se uma linguagem de programação e um ecossistema poderosos para o setor financeiro — para tudo, da análise de dados financeiros ao trading algorítmico e à gestão de risco." — Yves Hilpisch, 2018
Ressalvas honestas que pertencem a todo relatório
Quando o backtest se encerra, anexe uma pequena caixa de ressalvas. Primeira: qual spread você assumiu e se o alargou em torno de divulgações macro — a diferença entre um spread fixo de 0,8 e um realista de 2,5 pips durante o NFP é, muitas vezes, toda a vantagem. Segunda: se os dados estão livres de look-ahead bias, isto é, se você calcula um indicador a partir do fechamento da barra atual que ainda não conheceria em tempo real. Terceira: quantos parâmetros você otimizou de uma vez — cinco é o limiar acima do qual nem o walk-forward o protege mais. Quarta: se o resultado sobreviveu fora da amostra ou apenas no histórico completo. Sem essas quatro frases, um relatório é marketing, não uma auditoria. A oficina do trader na ForexMechanics cobre a rotina de pesquisa mais ampla.
O que fazer agora
- Instale o Python 3.11 ou mais recente com `pandas`, `numpy`, `backtrader`, `matplotlib` e o pacote oficial `MetaTrader5` — um único `pip install` traz o stack inteiro — e então baixe dois anos de dados H1 do par que você realmente opera e salve como um CSV, para que as iterações seguintes trabalhem a partir de uma fonte local estável.
- Escreva as regras da estratégia primeiro em linguagem clara — uma frase para cada uma: entrada, saída, stop loss e take profit — e só então traduza-as em expressões vetorizadas do `pandas`; mire em encaixar todo o teste em trinta linhas sem laço barra a barra, e resista a otimizar parâmetros nesta fase.
- Rode o backtest com comissão real, um spread constante e um pip de slippage aleatorizado, depois compare contra uma versão sem custos; a diferença diz quanto da vantagem assumida é um artefato da execução a preço médio — se os custos comem mais da metade do lucro bruto, a estratégia é fina demais para o live.
- Divida o histórico em quatro anos in-sample e um ano out-of-sample, otimize no máximo dois parâmetros na janela in-sample, congele o conjunto vencedor e rode o teste out-of-sample uma única vez; se a taxa de acerto cair mais de um terço, simplifique a lógica em vez de procurar uma otimização melhor.
- Mantenha um caderno simples — um arquivo Markdown no mesmo repositório — e, depois de cada backtest, escreva quatro frases: qual spread você usou, se os indicadores evitam look-ahead, quantos parâmetros você ajustou e se o capital out-of-sample ficou acima da metade do in-sample; sem esse diário, em três meses você esquecerá qual relatório era honesto.
Fontes e bibliografia
-
Backtrader Backtrader documentation — Introduction · oficjalna dokumentacja open-source'owej biblioteki Daniela Rodrigueza: model event-driven, klasy Strategy i Cerebro, integracja danych www.backtrader.com ↗
-
vectorbt vectorbt usage documentation · oficjalny przewodnik po wektorowym backtestowaniu w numpy/pandas — przykłady i sweep parametrów vectorbt.dev ↗
-
O'Reilly Media Yves Hilpisch — Python for Finance, 2nd Edition (2018) · kanoniczna pozycja o zastosowaniach Pythona w analityce finansowej, algorytmice i zarządzaniu ryzykiem www.oreilly.com ↗
-
MQL5 MetaTrader 5 Python Integration — official reference · oficjalne API pakietu MetaTrader5: pobieranie historycznych OHLC i tików, dostęp do konta i składanie zleceń z Pythona www.mql5.com ↗
-
pandas pandas — Time series / date functionality · referencja czasu w pandas: konwersje, resampling, indeksowanie i przesunięcia używane w każdym backteście pandas.pydata.org ↗
Perguntas frequentes
Preciso de Python avançado para começar?
Python básico é o suficiente — laços, listas, funções, importar bibliotecas e ler um CSV. Todo o resto é pandas, e você o pega no caminho, porque cada projeto de backtesting usa o mesmo punhado de operações: carregar dados, fazer resampling, calcular um indicador, definir uma condição de entrada e agregar resultados. Uma primeira estratégia geralmente cabe em trinta linhas de código, então não faz sentido esperar até "dominar Python por completo". O ritmo mais saudável é manter dois fios em paralelo: um curso curto de fundamentos (quatro a seis semanas, uma hora por dia) e o projeto real no qual você está praticando. Se você consegue montar uma planilha de Excel com fórmulas e entende o que é uma função, você tem o mínimo — o pandas substitui a planilha quase por completo, roda mais rápido e permite validar o trabalho corretamente fora da amostra.
Por que escolher backtrader em vez de vectorbt, ou o contrário?
As duas bibliotecas seguem filosofias diferentes. O backtrader é event-driven: o motor avança barra a barra, chama o método next() na sua classe Strategy e espelha o fluxo real do trading ao vivo — então acrescentar gerenciamento de posição, trailing stop ou saídas parciais é direto. O custo é a velocidade: dez anos de dados M5 em um único par podem levar alguns minutos. O vectorbt segue o caminho oposto — você expressa a estratégia inteira como operações vetorizadas sobre colunas do pandas, o motor calcula tudo em paralelo via numpy, e uma varredura de cem combinações de parâmetros termina em dezenas de segundos. O custo é a amplitude expressiva: uma lógica de entrada complexa que depende do estado do portfólio é mais difícil de codificar. Na prática, os traders mantêm as duas — vectorbt para exploração rápida e varreduras de parâmetros, backtrader para a validação final do melhor candidato com um modelo realista de comissão e slippage (derrapagem de preço).
Onde consigo dados históricos confiáveis?
Três fontes, em ordem de bom senso. Primeira: o pacote oficial MetaTrader5 — você recebe o histórico direto da sua própria corretora, então o spread, o swap (rollover) e a comissão no backtest correspondem ao que você verá depois numa conta real. É a opção mais honesta para qualquer estratégia que você pretenda implantar. Segunda: a Dukascopy publica dados tick e M1 para os pares principais desde 2003 — qualidade institucional, mas os spreads vêm da plataforma da Dukascopy, e não da sua corretora. Terceira: yfinance para fechamentos diários e ccxt para mercados de cripto — ambos servem para prototipagem, mas as lacunas de fim de semana e os minutos eventualmente ausentes os descartam para validar estratégias intradiárias. Documente a fonte no cabeçalho do script todas as vezes, para que seis meses depois você ainda saiba em que o relatório se baseou — um detalhe pequeno que salva o trabalho sempre que uma auditoria cair na mesa.
Como sei que um backtest é bom demais para ser verdade?
Quatro sinais bastam. Primeiro: uma taxa de acerto acima de 75 por cento em mais de duzentas operações — praticamente inalcançável fora do scalping em mercados muito estreitos, então o resultado aponta para look-ahead bias ou um erro nos dados. Segundo: uma curva de capital sem recuos significativos — estratégias reais registram drawdowns (rebaixamentos da conta) de dois dígitos, então uma linha ascendente limpa é um aviso de curve-fit. Terceiro: um profit factor acima de 3,5 — raríssimo no forex, onde só o spread ECN já consome uma parcela de dois dígitos da vantagem. Quarto: sensibilidade aguda aos parâmetros — quando mudar o período de uma média móvel de 14 para 12 derruba o resultado, a estratégia aprendeu o ruído em vez da estrutura. Quando quaisquer dois dos quatro sinais acendem ao mesmo tempo, o relatório é suspeito independentemente das métricas de destaque; simplifique a lógica, descarte um parâmetro ou dois e rode o teste de novo fora da amostra.