Otimizando um Robô no Metatrader 5 — Parte 2
Continuando a série sobre otimizações, neste texto vou abordar a diferença entre teste e validação, o que são métricas customizadas de performance e a importância dos testes de robustez.
Como vimos na primeira parte desta série, um dos problemas de executar otimizações em estratégias automatizadas de trading, é incorrer em overfitting. Encontrar boas parametrizações no passado, porém sem Predictive Power, isto é, sem capacidade de generalização em dados reais, no live trading.
Para tentar mitigar este problema, aplicamos uma abordagem bastante difundida na Ciência de Dados. Separamos todo o histórico em período de teste e período de validação.
In Sample x Out of Sample
In Sample, é o nome dado ao período de teste, onde a estratégia será otimizada, isso é, o Metatrader 5 buscará a melhor parametrização de acordo com a função de avaliação informada, apenas nesse conjunto de dados.
Out Of Sample, é como chamamos o período de validação, onde a estratégia não será otimizada, para que não tenhamos o risco de sobreajustar (“overfitar”) a estratégia em todo histórico de dados disponível.
O objetivo final dessa abordagem é auferir se uma configuração proveniente da otimização, continua apresentando bons resultados em dados onde ela não foi otimizada.
No Metatrader 5, conseguimos aplicar esse tipo de teste de forma automática, ele se chama Forward Test
Para executar um teste Forward, deve-se selecionar a opção “Para Frente”, no Strategy Tester. As opções: 1/2, 1/3, 1/4, representam a proporção do período Out of Sample, em relação a todo período selecionado. Neste caso, o período de teste é de 01/01/2016 até 01/08/2021. Caso seja selecionada a opção “1/2”, metade do período será destinado para otimização (In Sample) e a outra metade para validação (Out of Sample).
Também podemos informar um período específico, conforme a imagem. Neste exemplo, será executada uma otimização de 01/01/2016 até 01/01/2020 (In Sample), em seguida, será executado um backtest de 01/01/2020 até 01/08/2021 (Out of Sample). Ao final, conseguimos relacionar os melhores resultados da otimização, com os resultados não otimizados (Para Frente)
Note que em testes Forward, uma nova aba chamada “Resultados para frente” é gerada no Metatrader 5, nela conseguimos comparar os resultados da otimização com os resultados do período Out of Sample.
Novamente, o objetivo final de todo esse processo é encontrar configurações que sejam boas no período otimizado, mas que permaneçam lucrativas no período de validação. Dessa forma, diminuímos a possibilidade do resultado estar com overfit.
Métricas Customizadas de Performance
Agora vamos dar uma pausa nos testes para falar de uma das funcionalidades mais importantes do Metatrader 5.
Na parte 1 desta série, comentamos para que serve uma função de avaliação.
É possível criar funções de avaliação customizadas. Isso é, você pode dizer para o metatrader exatamente como ele deve avaliar os resultados de cada execução de backtest/otimização e ranqueá-las de acordo com as suas regras específicas.
Embora, por padrão, já existam algumas métricas: Saldo máximo, Mínimo Rebaixamento, Fator de Recuperação, etc, todas elas possuem limitações. E você ter a possibilidade de informar seus próprios critérios de avaliação, pode gerar resultados bastante interessantes e direcionados ao que você está buscando.
Para isso, você deve ter acesso ao código do EA (Expert Advisor) e implementar suas regras na função OnTester(). Ao selecionar a opção “Critério Máximo do Usuário”, o Metatrader vai entender que ele deve aplicar a métrica customizada de performance para avaliar os resultados durante a otimização.
Eu costumo usar bastante este recurso, e estes são alguns exemplos de métricas que eu gosto de avaliar:
- Estabilidade da curva ao longo do tempo
- CAGR (Compound annual growth rate)
- Drawdown Médio ao longo de toda série
- CAGR/Máximo Drawdown
- CAGR/Média do Drawdown
- Período de estagnação da curva
Futuramente, pretendo escrever artigos específicos mostrando a implementação e aplicação de algumas dessas métricas.
Testes de Robustez
Como vimos anteriormente, separar o histórico de dados em período de teste e validação é uma boa prática para mitigar a chance de overfitting. Entretanto, apenas essa abordagem não é o suficiente para assegurar a robustez de uma estratégia. Precisamos executar outros tipos de testes com o mesmo objetivo: avaliar a probabilidade de um modelo performar bem, além dos dados otimizados.
Estes testes são conhecidos como Testes de Robustez.
Em meu processo de desenvolvimento de robôs/estratégias automatizadas, basicamente aplico 4 testes principais, são eles: Distribuição de Resultados, Distribuição de Parâmetros, Walk Forward Analysis (WFA) e Simulação de Monte Carlo.
Cada um deles possui um objetivo específico e juntos são capazes de identificar vários cenários de overfitting, antes que uma estratégia seja executada em conta real.
É nesta fase do processo que boa parte das estratégias morre, ou deve ser ajustada para seguir em frente. Sem dúvida essa é a etapa mais importante do processo, pois evita de executarmos estratégias que perfomarão mal no live trading.
No próximo artigo da série, irei detalhar cada um dos testes de robustez.
Se você gostou desse tipo de conteúdo e gostaria de acompanhar, siga @devtrader no instagram.