Como evitar o Overfitting utilizando Walk Forward Validation

Por onde começar Fóruns Artigos Como evitar o Overfitting utilizando Walk Forward Validation

Este tópico contém 2 respostas, possui 2 vozes e foi atualizado pela última vez por  JANDERSON 2 anos, 11 meses atrás.

  • Autor
    Posts
  • #1691

    JANDERSON
    Mestre

    Olá pessoal, hoje gostaria de falar sobre um assunto que creio ser extrema importância, como saber se o meu backtest está indicando que o modelo que estou usando realmente encontrou um padrão no mercado que pode ser explorada (para ser convertida em lucro) ou simplesmente está sobreajustado (ou overfitting no inglês) a um padrão que só aconteceu no período do backtest, e não vai mais acontecer no futuro, ou mesmo encontrou um simples ruído do mercado. 

    O conceito de overfitting

    De acordo com o Wikipédia, sobre-ajuste (do inglês: overfitting) é:

    “Um termo utilizado, em aprendizagem de máquina, estatística e afins, para quando o modelo estatístico se ajusta em demasia ao conjunto de dados/amostra. É comum que a amostra apresente desvios causados por erros de medição ou fatores aleatórios, ocorre o sobre-ajuste quando o modelo se ajusta a estes.”

    Umas das técnicas utilizadas na análise de dados para evitar o overfitting é o que chamamos de cross validation, que consiste em separar uma pequena amostra do nosso conjunto total de dados que temos e realizar a otimização sem essa amostra de teste (chamada de amostra de validação), para que posteriormente seja possível testar os parâmetros escolhidos durante a otimização. Com isso é possível verificar se nosso modelo está realmente localizando um padrão nos dados, ou simplesmente, achou algum ruído que só existe no período de otimização, e não na amostra inteira.

    Walk Forward Validation

    O conceito de Walk Forward amplia o uso do cross validation, ele nos permite avaliar um modelo com menor interferência de ruídos e de padrões que ocorreram somente em um determinado período, mas que não fazem parte realmente do mercado.

    O que fizemos na verdade é dividir o nosso período de backtest em várias etapas e para cada etapa, nós fizemos um na primeira metade ou nos primeiros ⅔ desse período uma otimização, e depois pegando o melhor resultado fizemos a validação no período restante, fique tranquilo a imagem abaixo vai ajudar a entender melhor.

    walk_forward_validation

    Veja, que dividimos o processo em meses para ficar simples a compreensão do processo, porém dependendo do tempo gráfico que você for utilizar o sistema (por exemplo gráfico diário) talvez seja preciso utilizar blocos de tempo maior, pois pode ficar com poucos trades para análise posterior. 

    Se não ficou muito claro, não se preocupe, vamos fazer passo a passo para que fique bem claro o processo. Eu vou usar o metatrader e nosso exemplo as seguintes configurações para demonstrar o processo passo a passo:

    • Robô: Média móvel.
    • Ativo: Série histórica do Mini Indice sem ajuste (WIN$N)
    • Tempo Gráfico: H1
    • Conta Inicial: R$ 10K
    • Posição trade: 10 lotes

     

    Walk Forward – Etapa #1
    Screenshot_18

    Primeiro vamos realizar  uma otimização do dia 01/01/2015 até 01/05/2015 para fazer a otimização e depois a validação do período de 01/05/2015 até 01/06/2015.  

    No metatrader essas duas etapas são feitas de maneira automática, usando o testador de estratégia seleciono o período de data de 01/01/2015 até 01/05/2015 e habilito a opção para frente colocando custom e a data no campo ao lado de  01/05/2015.

    metatrader_otimização

    Na prática o que o metatrader irá fazer é executar um backtest de 01/01/2015 até 30/04/2015, reiniciar todos os valores dos resultados e trades e começar outro backtest com os mesmos parâmetros de entrada de 01/05/2015 até o período de 01/06/2015, ou seja, o opção pra frente no metatrader divide um o período total do backtest entre o período de otimização e validação.

    Agora é preciso selecionar a opção de de otimização: “algoritmo completo”, para que o metatrader rode uma otimização pegue todos os parâmetros de entrada que estão marcado nos parâmetros de entrada, eu deixo também a opção balance+max expected payoff para que o metatrader ordene por esses dois campos.

    Os parâmetros para otimização que vou utilizar nesse exemplos são só período da média de 3 até 100 de 2 em 2 e o número do barras máximas mantidas de 0 até 8 barras pelo posição atual para ser executado e vou colocar para otimizar esses parâmetros.

    Screenshot_9

     

    O número no canto inferior à direita mostra a quantidade de combinações que terá nossa otimização, quanto maior esse número, mais tempo demorá nossa otimização.

    Agora podemos iniciar o processo e o metatrader vai gerar uma lista de todos os resultados para cada um desses backtest, como já conhecemos, olhando na aba “Resultado da otimização” é possível ver essa lista.resultado_otimizacao_metatrader

    Eu vou dar um duplo clique na coluna retorno esperado (payoff), que é o meu parâmetro alvo da otimização, para que o metatrader vá colocando o melhor resultado dessa coluna na parte superior.

    Depois que a otimização estiver concluída, nós devemos então coletar os resultados, inclusive  trades, do período de validação desta etapa. Para fazer isso é preciso, selecionar o primeiro item da lista (nesse nosso caso ordenado pelo payoff) e clicando com o botão direito, executar o teste único.

    teste_unico_metatrader

    Com isso o metatrader irá executar um backtest detalhado (tanto no período de otimização quanto no de validação) somente para o melhor parâmetro, que podem ser vistos nas últimas colunas, nessa nossa etapa foi a média de 85 e o número de barras 0, agora é possível ver duas novas abas no testador de estratégia, a aba gráfico que mostra a curva gráfica e a aba “para frente” que mostra o relatório do backtest no período para frente, que é de 01/04/2015 até 01/05/2015, você deve gerar esse relatório, recomendo que salve em html com o número 1 na frente do nome do arquivo, pois ele será necessário posteriormente, para completar nossa análise, você poder fazer esse processo clicando na aba para frente e em qualquer parte do relatório clique com o botão direito do mouse Relatório>HTML:

    relatorio_metatrader

    E então digite o nome do arquivo que você quer colocar para o relatório:

    Screenshot_13
    Logo após salvar o relatório ele irá se abrir automaticamente para você no seu navegador, mantenha esse relatório aberto.

    Agora você deve abrir uma programa de planilha eletrônica (como por exemplo o excel) e copiar os trades do relatório web para a planilha eletrônica. (no relatório do metatrader os trades são chamados de ofertas), veja abaixo como fazer o processo:trades_relatorio_metatrader

    E então cole na planilha eletrônica. Você deve colar os trades sem formatação, no excel você faz isso clicando com o botão direto, opção colar especial e depois selecione a opção texto. Veja o resultado final:trades_metatrader_excel

     

    Porque foram excluídos os trades do tipo balance?

    Essa é uma pergunta importante, eles foram excluídos porque no metatrader as corretagens dos backtests são tratadas como um saque (tipo balance), como são trades que não existiram no modelo de fato, eles são excluídos para que em nossas análises posteriores, como monte carlos por exemplo, eles não sejam considerados e acabem sujando nosso resultado final.

     

     

    Walk Forward – Etapa #2 até #X

    walk_foward_metatrader_etapa_2

    Ok, Agora nós vamos novamente executar uma otimização só que usando todos os parâmetros de data um mês para frente, ou seja, o período de otimização vai ser de 01/02/2015 até 01/05/2015 e o período de validação vai de 01/05/2015 até 01/06/2015 e vamos fazer os mesmos passos que fizemos na primeira etapa:

    • Rodar a otimização, com o novo conjunto de datas
    • Ordenar a lista de resultados pelo “parâmetro alvo”, no nosso caso o payoff.
    • Rodar um backtest único para o melhor conjunto de parâmetros.
    • Salvar o relatório em Html detalhado da aba “para frente” do metatrader, usando o “Executar teste único no metatrader” com o número 2 na frente, para poder copiar os trades posteriormente (ou o número da etapa em questão na frente do arquivo)

    Só que agora ao invés de abrir um novo arquivo no excel para cópia dos trades, nós vamos simplesmente adicionar os trades copiados do relatório ao final da lista de trades gerados na primeira etapa. E assim, nós iremos adicionando os trades a cada nova etapa que será executada, pois essas lista de trades gerados com a soma de todos os períodos de validação é que serão analisados, para que possamos responder a seguinte pergunta: devo utilizar este modelo na minha conta?

    Vou repetir essa essa frase pois ela é importante:

    Usando a lista de trades gerados pela soma de todos os períodos de validação é que avaliamos e decidimos se o sistema deve ser operado, ou descartado. (pelo menos com os parâmetros otimizados utilizados)

     

    Resultado Final após 4 etapas

    Após executarmos nossas quatro etapas os resultados ficaram assim:

    resultado_walk_foward_etapas
    A nossa lista de trades final, as linhas dividem cada etapa (somente para melhor visualização):

    lista_final_trades_walk_forward

     

     

    E finalmente uma curva de capital para os trades gerados a partir da validação:

    Olhando assim não parece ser um sistema interessante, você concorda?

     

    Do Walk Forward para as operações em minha conta

    Usando a frase do Dr. Howard, amanhã é “out-of-sample” que quer dizer que o período de validação se assemelha ao “futuro”, ou seja, quando estamos operando de verdade em nossas contas.

    Então se encontrarmos um modelo satisfatório e que gostaríamos de utilizá-lo em nossa conta o que devemos fazer?

    Simples, devemos é realizar mais uma otimização como se fossemos continuar o processo para mais uma etapa (no nosso exemplo a etapa 5) e utilizar o melhor parâmetro da otimização para operar na conta real. Veja o exemplo abaixo:

    conta_real

    Obs: Aqui conta real significa uma conta que não é de backtest (não importa se são operações simuladas ou com dinheiro real)

     

    Fazendo uma análise mais aprofundada dos resultados dos trades gerados pelo Walk Forward

    Sinceramente quando comecei a escrever o artigo, não esperava que ele ficaria tão extenso, por isso, vou deixar a análise do resultados dos trades para a próxima semana, incluindo o uso da simulação de monte carlo para analisar o Drawdown esperado e também o alvo da conta para o modelo.

    Considerações finais

    Quantas etapas eu devo fazer o Walk Forward? Se você tem um sistema automático que faz o W. F. para você, é interessante usar de 6 a 10 etapas, porém, como no metatrader o processo é feito manualmente eu faço de 3 a 4 etapas, no geral.

    Outra observação importante é que o em inglês o termo para otimização é comumente chamado de in-sample e validação é comumente chamado de out-sample.

    Pessoal, por fim, espero que o material ajude, o que vou fazer é criar alguns presets utilizando esses parâmetros e acompanha-los junto com vocês (alguns eu já tenho acompanhado), o que acham?

    Qualquer dúvida, critica ou sugestão, fico a disposição.

  • #2027

    David Almeida
    Participante

    “…vou deixar a análise do resultados dos trades para a próxima semana, incluindo o uso da simulação de monte carlo para analisar o Drawdown esperado e também o alvo da conta para o modelo.”

    Olá Janderson!

    Ainda pretendes publicar um artigo sobre a análise dos resultados?

  • #2031

    JANDERSON
    Mestre

    Olá David,
    pretendo sim, porém, estou aguardando algumas modificações na nossa plataforma web, para poder fazer essas mudanças.

    Abraço.

Você deve fazer login para responder a este tópico.