Começaremos pelo problema.
Qual problema um WFA tenta resolver?
Sabemos que o processo de otimização de uma estratégia tem suas vantagens e desvantagens. A vantagem é a capacidade de encontrar o melhor conjunto de parâmetros para uma estratégia, com base em uma métrica de avaliação: maior lucro, menor risco, maior estabilidade, etc.
A desvantagem é quando otimizamos demais uma estratégia e o algoritmo de otimização se ajusta tanto aos ruídos que encontra resultados ótimos no passado, mas não necessariamente com capacidade de generalização em dados diferentes, este processo é conhecido como overfitting ou curvefit.
Falamos em detalhes sobre este processo aqui.
Dito isso, o objetivo principal da aplicação do método Walk Forward Analysis (WFA), é identificar de forma objetiva se uma estratégia tem sinais de overfitting ou não. Particularmente, considero o WFA uma das abordagens mais efetivas para este fim.
Além da identificação de overfitting, um WFA tenta elucidar as seguintes questões:
- A estratégia é Robusta? É capaz de ganhar dinheiro em conta real?
- Qual taxa de performance posso esperar em conta real comparado aos resultados de teste/otimização?
- Como as mudanças nos ciclos de mercado afetam a performance da estratégia?
- Quais os melhores parâmetros para executar a estratégia em live trading?
- Quando devo atualizar os parâmetros da estratégia?
Ao longo deste artigo, vamos entender como responder estas perguntas aplicando o método.
Mas afinal, o que é um WFA?
É uma técnica de validação cruzada (cross validation), proposta originalmente por Robert Pardo em seu livro The Evaluation and Optimization of Trading Strategies.
Consiste em executar uma bateria de testes e validações consecutivas, separando o histórico total de dados em janelas menores para avaliar a capacidade da estratégia em se ajustar a diferentes ciclos de mercado e a diferentes parametrizações.
Passo a Passo
Vou descrever todas as etapas necessárias para aplicação do método.
1. Definir variáveis/parâmetros e range de otimização
Como em uma otimização normal, é necessário definir o escopo de otimização da estratégia, quais parâmetros deseja-se otimizar: gatilhos de entrada, stop loss, stops gain, manejo de posição, break even, stop móvel, trailling stop, horário de operação, etc. As possibilidades são inúmeras e variam de estratégia para estratégia. Lembre-se de manter as boas práticas que também foram discutidas aqui. A principal, é manter baixo o número de parâmetros otimizados simultaneamente, preferencialmente entre 2 e 3.
2. Definir a função de avaliação
Função de avaliação é a métrica que indica para o otimizador o que ele deve buscar. O algoritmo de otimização vai ranquear os melhores resultados de acordo com a função de avaliação, a métrica padrão que gosto de usar é Fator de Recuperação. Mas é possível criar suas próprias métricas customizadas de performance. Entrei em detalhes sobre este assunto aqui.
3. Separar os dados entre In Sample e Out of Sample
Nesta etapa vamos separar nosso histórico de dados em janelas menores. Cada uma destas janelas vai ser divida em 2 períodos: In Sample (IS) e Out of Sample (OOS)
In Sample é como chamamos o período onde vamos otimizar a estratégia. Out of Sample é o período onde vamos validar os parâmetros obtidos no período In Sample.
O racional dessa prática é entender se os parâmetros otimizados em uma janela de tempo, continuam gerando bons resultados em um período que não foi usado pelo otimizador, ou seja, em dados desconhecidos.
Neste ponto do processo, precisamos definir qual padrão de configuração iremos adotar para dividir os períodos. Os mais comuns são:
- 80% teste / 20% validação (4:1)
- 75% teste / 25% validação (3:1)
- 66% teste/ 33% validação (2:1)
Essa decisão é importante pois ela define o peso que queremos dar para cada etapa do processo. Isso está diretamente relacionado com a significância estatística dos resultados gerados durante a otimização, e vai variar para cada estratégia.
Estratégias com frequência mais alta de operações podem ter um período de otimização menor, e vice-versa.
4. Separar o histórico total em steps
Já sabemos qual relação de In Sample e Out of Sample vamos usar. Então agora podemos definir quantos steps (ou stages/janelas/windows) iremos utilizar.
Dado que sabemos o tamanho total do histórico, precisamos dividir em quantos passos vamos quebrar o histórico em pequenas porções, cada uma delas contendo X meses In Sample e Y meses Out of Sample. Conforme a imagem abaixo:
Em amarelo: Período In Sample. Em azul: Período Out of Sample
No exemplo acima temos a seguinte configuração:
- Histórico Total: 5 anos (60 meses)
- In Sample: 24 meses
- Out of Sample: 6 meses
- Steps: 6
Você pode variar essas configurações, alterando todos esses parâmetros. Quanto menor a quantidade de meses em In Sample x Out of Sample, maior a quantidade de steps. Assim como, se o histórico de dados for maior, será possível montar diversas configurações diferentes.
Aqui não existe certo e errado. Apenas fique ligado em algumas boas práticas que eu gosto de usar:
- Não usar períodos Out of Sample menores que 3 meses.
- Não usar menos do que 6 steps
Atenção para Significância Estatística
Neste ponto, que precisamos ter em mente é o seguinte:
A quantidade de operações geradas durante a otimização é o suficiente para gerar resultados com significância estatística aceitável, capaz de produzir resultados confiáveis em período Out of Sample?
Pense nisso.
Executando um WFA
Agora que definimos todos os 4 passos necessários para planejar a execução do nosso WFA, podemos meter a mão na massa e iniciar o teste de fato.
Otimização — Validação
Esta é a etapa mais trabalhosa do processo. Para cada step vamos executar uma otimização dentro do período In Sample. Quando a otimização for concluída, a melhor combinação de parâmetros deve ser executada no período Out of Sample.
Ao concluir um step, catalogamos os resultados (com auxílio de uma planilha) tanto da execução IS, quanto da OOS. Vamos usar esses dados pra auferir os resultados e compará-los mais pra frente.
Mas quais dados devemos catalogar?
Este é um ponto importante e depende de um conceito primordial: Qual métrica será usada para avaliar o WFA?
Como já discutimos, o objetivo de um WFA é avaliar se os melhores resultados de uma otimização continuam gerando bons resultados em dados não otimizados.
Para medir isso, precisamos definir quais métricas devemos avaliar entre IS e OOS. A métrica mais clássica é Lucro.
O Lucro gerado na otimização é maior ou menor ao Lucro gerado em OOS?
Mas lembre-se que estamos testando 24 meses em IS e 6 meses em OOS. Para fazer uma comparação justa, precisamos normalizar esses dados. Comparar os valores na mesma base de cálculo. Uma forma de fazer isso, é comparar o Lucro Mensal, por exemplo.
Dessa forma, tiramos a média mensal do período IS e a média mensal do período OOS. Agora sim podemos compará-las.
Outras métricas podem ser usadas para comparar os resultados IS e OOS. Principalmente aquelas que envolvem risco, e não somente retorno. Tenha em mente que essas métricas precisam estar sempre normalizadas na mesma base de cálculo para que a comparação seja justa e faça sentido. Algumas métricas que gosto de usar:
- CAGR / Média do Drawdown
- CAGR / Máximo Drawdown
Repita esse processo de Otimização — Backtest — Coleta de dados para todos os steps.
Avaliando um WFA
Com os dados todos coletados, agora podemos avaliar se os resultados do WFA foram satisfatórios ou não. Em outras palavras, a estratégia está overfitada? A estratégia é robusta?
Avaliamos o resultado através de uma métrica chamada Walk Forward Efficiency (WFE)
Avaliando WFE
WFE abaixo de 50% indica que a estratégia não conseguiu gerar bons resultados em períodos não otimizados. É um sinal claro de overfitting.
Particularmente, gosto de usar como ponto de corte WFE de 70%.
WFE acima de 100% indica que a estratégia conseguiu performar melhor em períodos não otimizados. Este é um sinal excelente.
Análise de Outliers
Outro ponto interessante para avaliar nos resultados de um WFA é o comportamento de outliers, ou pontos fora da média. Se você obteve um WFE satisfatório, acima de 70% mas este resultado foi construído em poucos períodos, muito fora da média, este é um cenário ruim. Exemplo:
Em 6 steps, 4 foram negativos e em 2 deles tiveram valores absurdamente altos.
Este resultado foi construído através de outlier. A curva de capital obtida é totalmente instável e com grandes períodos de estagnação.
Curva Out of Sample
Os resultados OOS obtidos formam uma curva de capital importante. É o resultado da sua estratégia somente em dados não otimizados e ela deve ser analisada. Particularmente, não gosto de obter períodos consecutivos negativos em resultados OOS.
Pronto, se você chegou até aqui, você consegue finalizar um teste WFA de ponta a ponta. Com um WFE satisfatório, outliers controlados e curva OOS estável a estratégia passou no teste.
Mas será que ainda podemos melhorar a robustez? Adicionar ainda mais rigor estatístico? Claro que sim :)
Aqui lhe apresento o conceito de Walk Forward Matrix (WFM)
Walk Forward Matrix
Lembra da etapa de definição de períodos IS, OOS e quantidade de Steps? Nesta etapa é possível montar inúmeras configurações possíveis, somente variando estes parâmetros.
O que acabamos de fazer foi executar apenas 1 das combinações possíveis do WFA: 6 steps, 24 meses IS e 6 meses OOS para um histórico de 5 anos.
Mas qual seria o resultado se a configuração fosse: 12 steps, 12 meses IS e 4 meses OOS para um histórico de 5 anos? Ou então 18 steps, 9 meses IS e 3 meses OOS?
Esta variedade de configurações, chamamos de Walk Forward Matrix.
Quanto maior a combinação de testes Walk Forward fizermos, maior será o grau de robustez de uma estratégia.
Mas temos que concordar que executar otimizações, backtests e catalogar os dados para uma grande quantidade de steps em diferentes combinações é um trabalho árduo e nem um pouco produtivo.
Extreme Forward Analysis
É uma ferramenta, integrada ao Metatrader 5 que automatiza todo o processo dicustido neste artigo.