Neo traderBot

Neo traderBot

Você sabia?

Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!

Conceitos básicos

Técnicas de Otimização robusta

Leitura estimada: 10 minutos 302 views
Reproduzir vídeo

Introdução

Até o presente documento vimos os conceitos básicos de otimização. Abordamos dois algoritmos bastante utilizados para otimizar estratégias baseadas em indicadores técnicos: Grid Search e Algoritmo Genético – e abordamos sobre segregação de dados e overfitting.

Aqui vamos avançar um pouco mais e falaremos sobre técnicas de otimização robusta. Tais técnicas consistem em realizar a otimização e verificar o quão sensível é o desempenho de uma dada estratégia a diferentes situações de mercado e variações dos parâmetros ótimos.

O domínio de técnicas de otimização robusta é fundamental para execução de um processo de otimização de estratégias de maneira mais consistente, fornecendo mais informações para análise do possível desempenho e identificação de estratégia com maior potencial de serem lucrativas quando submetidas a dados novos.

A técnica de otimização robusta mais difundida é denominada Walk Forward Optimization.

Walk Forward Optimization (WFO)

A técnica de Walk Forward Optimization (WFO) foi apresentada inicialmente por Robert Pardo em seu livro “The Evaluation and Optimization of Trading Strategies” de janeiro/2008. Pra quem entende de aprendizado de máquina, é bastante claro que se trata de uma técnica baseada em validações cruzadas (como um k-fold).

A técnica WFO consiste em utilizar os dados históricos e simular como se a estratégia estivesse fazendo trading real. Ou seja, os dados históricos são fatiados em períodos de duração fixa, onde uma parte será utilizada para otimização (dados in sample) e outra parte para realização de backtesting (dados out of sample).

Iniciando pelos dados mais antigos, realizamos uma otimização simples (da maneira tradicional) e obtemos os parâmetros ótimos para avaliar o desempenho da estratégias nos dados out of sample do primeiro período.

Daí simulamos que o tempo passou e obtemos mais dados históricos. Isso equivale a arrastar a janela de dados pela mesma duração do backtesting em direção aos dados mais recentes. Esta nova configuração de dados da janela deslizante será o Período 2, o qual terá uma interseção dos dados in sample do período 1. No entanto, não terá interseção entre os dados de backtesting dos períodos 1 e 2.

A duração (fixa) dos dados de backtesting de cada período e a duração total dos dados históricos irão permitir calcular quantas janelas distintas de otimização poderão ser executadas nos dados históricos. A figura abaixo ilustra o conceito das janelas deslizantes.

Observe que, ao invés de procedermos uma única otimização nos dados históricos disponíveis, a técnica WFO visa realizar múltiplas otimizações para que seja possível realizar uma análise do desempenho da estratégia otimizada de maneira geral levando em consideração o desempenho em cada janela de backtesting. A esse processo de análise se dá o nome de Walk Forward Analysis (WFA).

Walk Forward Analysis (WFA)

Espero que tenha ficado claro na seção anterior que a estratégia é reotimizada para cada período de dados. A análise, portanto, consiste em comparar o desempenho da estratégia reotimizada no dados de backtesting do período atual, com o desempenho nesses mesmos dados utilizando a estratégia otimizada no período anterior, e portanto, não reotimizada para o período atual de dados.

A pergunta a ser respondida pela WFA é: vale a pena reotimizar a estratégia periodicamente? Em outras palavras, é possível um resultado final melhor do que não reotimizar a estratégia?

Intuitivamente, ao reotimizarmos uma estratégia utilizando uma janela deslizante estamos focando a otimização apenas nos dados mais recentes, que podem representar recortes distintos da dinâmica de negociação do ativo. Pode ser que um período seja marcado por uma tendência de alta, enquanto o próximo período terá um comportamento de retração (correção de preço), seguido pelo próximo período de consolidação…e assim por diante.

Perceba que a ideia de utilizar janelas deslizantes é permitir a obtenção de parâmetros ótimos mais adequados a situação recente dando possibilidade a estratégia de se ajustar as diferentes dinâmicas. Diferentemente de uma otimização simples sobre todos os dados históricos que buscaria uma configuração média que seria ótima globalmente, mas que não poderia ser ótima para diferentes subconjuntos desses dados históricos.

O que nos permitirá comparar o desempenho de duas configurações diferentes da estratégias em dados de backtesting (reotimizada e não reotimizada) é a Eficiência da estratégia, que definiremos a seguir.

Cálculo de Eficiência

A Eficiência consiste na razão entre o desempenho da estratégia nos dados out of sample (backtesting) e o desempenho nos dados in sample. O desempenho deve ser medido, preferencialmente, utilizando a mesma métrica utilizada como função objetivo da otimização, a fim de manter a consistência do processo.

Vale ressaltar que a janela de dados de backtesting é bem menor (geralmente) que a janela de dados in sample, e por isso, para tecer uma comparação de desempenho justa, torna-se necessário normalizar a medida de desempenho.

A normalização sempre será necessária quando os valores possíveis para a métrica de desempenho puderem ter limites mínimos e máximos diferentes dependendo do tamanho da janela de dados (ex: lucro líquido). A normalização não é necessária, por exemplo, se a métrica for taxa de acerto, pois o seu valor estará sempre entre 0 e 100%, independentemente do tamanho da janela de dados.

Veja na figura abaixo, um exemplo de cálculo de normalização de lucro líquido e eficiência em diferentes períodos de otimização de uma estratégia.

Estas perguntas nos levam a próxima técnica conhecida como Walk Forward Matix (WFM).

Observa-se que no Período 2 e 3, a estratégia reotimizada apresentou melhor eficiência do que a estratégia não reotimizada. Ao passo que no Período 4, a estratégia não reotimizada é que apresentou melhor eficiência.

A técnica de WFA consiste exatamente em verificar se há predominância de melhor eficiência nas estratégias reotimizadas para concluir se vale a pena reotimizar períodicamente a estratégia.

Caso identifique-se que não é interessante reotimizar a estratégia periodicamente, esse achado não é conclusivo. Pois poderíamos realizar a seguinte pergunta: será que se utilizassemos uma janela de otimização diferente com uma janela de backtesting menor poderíamos obter um resultado melhor em relação à reotimização de estratégias? Ou mesmo se concluíssemos que para o tamanho da janela atual é interessante reotimizar periodicamente, será que esta periodicidade é a periodicidade ótima?

Walk Forward Matrix (WFM)

A técnica WFM nada mais é do que rodar o processo de WFA para diferentes possibilidades de tamanho da janela de dados e percentual de dados out of sample desta janela, utilizando o algoritmo de já vimos de grid search.

Em outras palavras, consiste em realizar a otimização da técnica WFA. É importante ressaltar que a execução de WFM é bastante cara computacionalmente e, portanto, recomenda-se não gerar muitas possibilidades no processo. Além disso, a automatização do processo de WFM é praticamente um pré-requisito, são tantos dados que precisam ser armazenados para se realizar a adequada análise dos resultados, que torna-se fundamental ter um fluxo automatizado para execução do WFM.

Ao final das contas, queremos verificar se a estratégia é robusta a diferentes janelas de otimização e backtesting, bem como identificar o tamanho ótimo da janela de dados de otimização e periodicidade de reotimização.

Conclusão

Neste documento exploramos os conceitos e ideias por trás das técnicas de otimização robusta: WFA e WFM, a qual estão cobertas pelo conceito de Walk Forward Optimization.

Como sugestão, recomenda-se sempre iniciar de maneira simples e complicar a medida que for necessário. Assim, não é recomendável já iniciarmos a otimização de uma estratégia com WFM, pois seria como dar um tiro de canhão em uma mosca.

Comece realizando um otimização simples e verificando se a estratégia é lucrativa em backtesting. Em seguida, pode-se verificar pela aplicação da técnica WFA se há benefício em reotimizar a estratégia períodicamente em uma janela que o trader julgar pertinente. Caso seja observado um potencial de melhoria na otimização da janela de dados e de backtesting, aí sim, deve-se proceder com a técnica WFM.

Espero que este conteúdo tenha sido esclarecedor para o leitor e tenha contribuído para ampliar o conhecimento a respeito do tema otimização de estratégias.

Acompanhe a publicação de vídeos no Canal do Youtube da Comunidade, pois nos próximos conteúdos nós iremos aplicar passo a passo cada técnica apresentada na prática e otimizar estratégias utilizando diferentes plataformas e soluções.

2 Comments

  • Aldair Torres

    Janeiro 5, 2023

    Isto é uma homenagem aos seus esforços
    Em python para vc. checar sua veracidade.

    def WFM(data, model, param_grid):
    # dividir os dados em conjunto de treinamento e teste
    X_train, X_test, y_train, y_test = train_test_split(data[[‘feature1’, ‘feature2’, …]], data[‘target’], test_size=0.2)
    # criar o objeto de validação cruzada com 5 folds
    cv = KFold(n_splits=5)
    # criar o objeto de grid search
    grid_search = GridSearchCV(model, param_grid, cv=cv, scoring=’roc_auc’)
    # treinar o modelo utilizando o grid search
    grid_search.fit(X_train, y_train)
    # mostrar os melhores parâmetros encontrados pelo grid search
    print(grid_search.best_params_)
    # fazer previsões no conjunto de teste
    y_pred = grid_search.predict(X_test)
    # calcular a acurácia das previsões
    accuracy = accuracy_score(y_test, y_pred)
    # retornar a acurácia das previsões
    return accuracy

    Reply
    • Johnathas

      Janeiro 9, 2023

      Oi Aldair! O código tem a mesma ideia de segregação de conjunto de dados para otimização e outro para validação (in sample e out of sample). No entanto, para realizar a otimização de estratégias automatizadas vamos precisar rodar um simulador em python ao invés de utilizar a função de fit da biblioteca sklearn. Em breve, vamos abordar essa programação. Abs!

      Reply

Leave a Comment

CONTENTS