Desenvolvendo um algoritmo auto-adaptável (Parte I): encontrando um padrão básico

17 março 2021, 13:02
Maxim Romanov
0
670

Introdução

Qualquer algoritmo de negociação é, antes de tudo, uma ferramenta que, nas mãos de um trader experiente, pode ajudar a lucrar com sucesso, e nas mãos de um trader inexperiente, pode levar instantaneamente à perda do depósito. O problema de criar um algoritmo lucrativo e tão estável quanto possível é que não podemos entender o que precisa ser feito para lucrar e quais métodos são usados por "traders bem-sucedidos". E se tudo está claro a nível de algoritmos HFT (high frequency trading), arbitragem, estratégias de opções e sistemas que tiram proveito do spread do calendário, existe uma base teórica completa que diz o que precisa ser feito para ganhar dinheiro. Mas com algoritmos baseados na análise de preços e dados fundamentais, nem tudo é tão simples. Nesta área, não existe uma base teórica completa que descreva os processos que ocorrem durante a precificação e, portanto, é extremamente difícil criar um algoritmo de negociação estável. Aqui, o trading se transforma numa arte, enquanto a ciência ajuda a sistematizar tudo.

Mas será que podemos criar um algoritmo de negociação totalmente automático baseado apenas na análise das variações de preço, com base em qualquer instrumento de negociação sem otimização de parâmetros, mesmo sem a necessidade de ajustar manualmente os parâmetros para cada instrumento de negociação individualmente? Você arranca o instrumento de negociação necessário no gráfico e ele mesmo determina os parâmetros que trarão lucro. 

Será que pode existir um algoritmo que simplesmente seja incapaz de perder dinheiro, independentemente das mudanças que ocorrem no mercado? Eu acredito que é possível fazer isso, mas não é algo tão fácil de realizar. Existem duas maneiras de resolver este problema:

  1. Usar redes neurais com aprendizado de máquina e obter uma "caixa fechada" na saída, que, de acordo com alguns de seus critérios, analisa o mercado e lucra. Apesar da aparente obviedade e atrativo dessa abordagem, ela tem suas próprias dificuldades. Se fosse tão fácil de fazer, então empresas como GOOGLE e Yandex, com sua vasta experiência no uso de aprendizado de máquina e grandes orçamentos, teriam resolvido esse problema há muito tempo, ou pelo menos estariam entre os líderes na análise de dados de mercado e a qualidade das previsões. Tenho certeza de que é possível criar esse algoritmo. Ele deverá ser constantemente refinado à medida que a tecnologia se desenvolve para se manter competitivo. Porém, também terá que competir com os gigantes da tecnologia.
  2. Estudar os padrões de precificação, desenvolver um modelo teórico de precificação e criar um algoritmo que leve em consideração o máximo de fatores que afetam a precificação. Na minha opinião, esse enfoque é ainda mais complicado que o aprendizado de máquina, mas, como no caso anterior, acho que é real. Tal algoritmo será desenvolvido à medida que a base teórica e o conhecimento do desenvolvedor melhorem. Ele também exigirá uma modernização constante.

Decidi seguir pelo segundo caminho, isto é: criar uma teoria completa e desenvolver um algoritmo baseado nela. Numa série de artigos, desenvolverei esse algoritmo e você verá como o processo progride de um padrão pequeno para um projeto enorme. Paralelamente, irei considerar como encontrar padrões, estudá-los e melhorar a eficiência do trabalho.

O primeiro algoritmo será feito apenas para o mercado FOREX e para o terminal MetaTrader 4, no processo, ele evoluirá para um algoritmo universal que poderá funcionar tanto no mercado FOREX quanto nos mercados de moedas, e será escrito para MetaTrader 5.

Padrão básico

Você precisa começar procurando um padrão básico que será a base do algoritmo. Esse padrão deve ser fundamental e inerente à maioria dos mercados para, assim, ser facilmente escalonado para qualquer mercado no futuro. É a escalabilidade para qualquer mercado que sugere que o algoritmo é verdadeiramente auto-adaptável.

Para começar, vamos partir do oposto: por que é difícil ganhar consistentemente no mercado? É tudo uma questão de competição direta. A tarefa de alguns traders é celebrar um bom acordo com outros operadores, mas o problema é que cada uma das partes quer ter uma transação rentável e, porém, alguém definitivamente deverá ter prejuízo. Por isso, o mercado não deve ter padrões estáveis e simples que todos possam notar.

Em meu primeiro artigo Discretização da série de preços, componente aleatória e "ruído", eu escrevi sobre uma componente aleatória no mercado e que a distribuição de incrementos para uma série de preços é muito semelhante à distribuição de incrementos para um passeio aleatório. Ou seja, à primeira vista na série de preços, parece que não há padrões, que tudo é acidental e que é impossível ganhar dinheiro de forma consistente.

Por isso, como padrão básico, considerei que deve haver exatamente o mesmo número de candles ascendentes e descendentes para qualquer instrumento. Este é um padrão muito simples, e qualquer desvio desse padrão levará a rendimentos estáveis para todos que o notarem, e muitos notarão, porque é elementar. Mas, como sabemos, nem todos podem lucrar, portanto, não pode haver um desvio significativo do número de candles descendentes em relação ao número de candles ascendentes a longo prazo. Também decorre implicitamente do artigo mencionado acima. Teoricamente, pode haver desvios desta regra, por isso, não verifiquei todos os instrumentos, e no total há cerca de uma centena, mas nesta fase este fato não é tão importante. 

Por exemplo, vamos pegar 100 000 candles horários do GBPUSD para qualquer período e calcular quantos serão ascendentes e quantas descendentes. Para o período desde 27/10/2020 para o passado, peguei 100 000 candles e encontrei que 50007 são crescentes e 48633, decrescentes, sendo que o preço de abertura do resto é igual ao preço de fechamento. Como resultado, GBPUSD tem 50,7% de candles ascendentes e 49,3% de candles descendentes, o resto tem um preço Open = Close. Isso é aproximadamente equitativo, e se houver uma amostra maior, o resultado tenderá para 50%.

Para os fins deste artigo, não medirei todos os instrumentos. Fiz medições com base em centenas de instrumentos e os resultados foram os mesmos sempre. Mas, para sermos convincentes, vamos pegar um instrumento de um mercado completamente diferente, GAZP (Gazprom) para o período M15, e vamos medir o número de candles crescentes e decrescentes para 99914 candles. O resultado é 48237 crescentes e 48831 decrescentes, o resto é neutro. Como podemos ver, o número de candles ascendentes e descendentes é aproximadamente igual.

Esse padrão é bom não apenas porque está presente num grande número de instrumentos, mas também porque permanece em qualquer período gráfico. Para ter certeza disso, vamos analisar o GBPUSD no período M1 e pegar como exemplo a ação AAPL que cresce constantemente no período M15. Juntei todos os dados numa tabela.

Instrumento Timeframe Número total de cadles Porcentagem de candles crescentes Porcentagem de candles decrescentes
GBPUSD M1 100 000 50.25% 49.74%
GBPUSD H1 100 125 50.69% 49,30%
GAZP M15 99 914 49.69% 50.30%
 AAPL  M15  57 645 50.60% 49.40%

Como podemos ver na tabela, a proporção de candles ascendentes e descendentes tende a 50% nos instrumentos considerados e é verdade para todos os períodos considerados. Os dados para as medições e os resultados podem ser visualizados no arquivo anexo ao artigo em formato XLSX.

Os resultados apresentados na tabela apoiam a conclusão de que as características estatísticas das séries de preços para um grande número de amostras são muito semelhantes às características de um passeio aleatório. Além disso, se o número de amostras for pequeno, haverá desvios da distribuição de referência. O algoritmo será baseado na suposição de que a distribuição dos incrementos para a série de preços é apenas superficialmente semelhante à normal.

Se para um pequeno número de amostras a forma da distribuição diferir da de referência, com o aumento no número de amostras a forma tenderá para a de referência. O mais importante é que a velocidade com que a distribuição tende à de referência é individual para cada instrumento e é bastante estável. 

distribution

Fig. 1.

A Figura 1 mostra o que descrevi acima. Aqui, a distribuição de referência de incrementos é mostrada em vermelho, a distribuição de incrementos para uma série de preços com um grande número de amostras é mostrada em preto. As cores roxa, verde e azul mostram a distribuição dos incrementos das séries de preços num pequeno número de amostras.

Foi encontrado um padrão fundamental distintivo de um grande número de instrumentos de negociação e lançada uma suposição de onde virá o lucro. O número de candles decrescentes = o número de candles crescentes, e quando ocorre um desvio do equilíbrio, a velocidade de retorno ao equilíbrio para cada instrumento é individual, estável e flutua dentro de certos limites. É esse padrão que usarei para obter lucro.

Desenvolvendo o algoritmo de teste

Em seguida, precisamos não apenas desenvolver um algoritmo tão simples quanto possível que tire proveito desse padrão, mas também testá-lo para entender se vale a pena tecer mais a teoria. Para negociação, será usado o desvio local do número de candles decrescentes e crescentes em relação a 50%. Sabemos que, em média, há aproximadamente o mesmo número de candles descendentes e crescentes, mas localmente, a preponderância de um tipo de candle sobre outro pode ser muito diferente de 50%, depois, tenderá ao equilíbrio. O algoritmo funcionará da seguinte maneira:

Algoritmo geral de trabalho simplificado

  • é examinada uma janela de N candles; 
  • é verificado quais candles estão maiores, quais são decrescentes ou crescentes;
  • se a preponderância for maior que o limite, este será o sinal para o início de uma série de posições;
  • mais candes decrescentes = sinal Buy, mais candles crescentes = Sell;
  • é calculado o lote;
  • é aberta uma nova posição a cada próximo candle até que a condição para o fechamento da série seja acionada; 
  • é atendida a condição de fechamento da série;
  • são fechadas todas as posições;
  • busca de um novo sinal.

O algoritmo funcionará com ordens de mercado para simplificar. O algoritmo funciona apenas com base em preços de fechamento, e todas as ações são realizadas após a formação de um novo candle. Não precisamos analisar nada dentro do candle, só devemos controlar o lucro e os fundos atuais. Não faz sentido sobrecarregar com cálculos desnecessários.

Sinal para abrir uma posição

  1. Janela para análise - definimos o número de candles (janela de análise) para o qual necessitamos verificar a porcentagem atual de candles decrescentes e crescentes. Analisar um número fixo de candles não é uma boa ideia, porque pode haver seções mais longas ou mais curtas com desvios de 50% ou mais. É necessário definir a janela de análise com uma faixa, desde o número mínimo de candles até o máximo, com a precedência de um número maior de candles, porque, embora uma pequena área pode fazer parte de uma grande, precisamos capturar toda a faixa. A janela de análise será definida pelos parâmetros "MinBars" e "MaxBars". O algoritmo busca a preponderância de candles decrescentes ou crescentes dentro da faixa de "MinBars" a "MaxBars" e, assim que a encontra, seleciona para operação o número máximo de candles para o qual há uma preponderância de candles decrescentes ou crescentes acima do limite.
  2. Porcentagem mínima a nível de preponderância para abertura de posição - é necessário determinar qual porcentagem a nível de preponderância das posições descendentes ou ascendentes é considerada um limite para geração de sinal. Este parâmetro pode ser selecionado por otimização. O parâmetro "OpenPerc" foi criado nas configurações. Este parâmetro é fornecido como uma porcentagem e é a porcentagem para abertura. Se a porcentagem de candles decrescente na amostra for maior ou igual à porcentagem de abertura, precisaremos abrir posições Buy. Se a porcentagem de candles crescentes na amostra for maior ou igual à porcentagem de abertura, precisaremos abrir uma posição Sell. 
  3. Enumeração de faixa - é necessário analisar os candles do intervalo usando alguma etapa. Uma etapa ímpar não será apropriada, porque com um número ímpar de candles, aparece automaticamente um desvio de 50%, o que pode dar sinais falsos à entrada, logo, a etapa para verificar a faixa é exibida nas configurações - parâmetro Step. A enumeração da faixa irá do menor ao maior.

Número máximo de posições numa série

Durante a negociação, uma posição é preenchida com uma série de ordens, portanto, precisamos limitar o número máximo de posições. Para fazer isso, precisamos calcular o número de candles com que uma preponderância de até 50% pode ser nivelada. É tomada a amostra que serviu de sinal no início da série (consistindo em "N" candles), é considerado o número de candles predominantes, dele é subtraído o número de candles restante e adicionado ao número de candles na amostra original, depois é multiplicado pelo coeficiente de correção "K". O coeficiente “K” está indiretamente ligado às características estatísticas do instrumento.

Assim foi obtido o número esperado de candles, em que o desvio de 50% deve desaparecer.

R=(N+NB-NM)*K
N - number of candles in the sample featuring an excess above the threshold
NB - number of dominant candles
NM - number of remaining candles
K - adjusting factor defined in the settings

Em seguida, precisamos calcular o número máximo de posições que o robô abrirá. Para fazer isso, do número total de candles "R", precisamos subtrair o número de candles na amostra inicial "N". O resultado é o número máximo de posições “E”, para que o robô saiba quando não deve abrir na série.

E=R-N
Е - maximum number of positions in the series
R - total number of candles, at which the return to 50% is planned

Este algoritmo ainda não se adapta a si próprio, mas os primeiros passos já foram dados e o número de posições está sendo ajustado a partir do número de candles na amostra inicial.

Seleção de lote

O algoritmo é projetado para verificar um padrão, por isso, precisamos adicionar algumas configurações para determinar o lote. Vamos supor que o tamanho do lote dependa do número esperado de posições na série. Quanto mais posições na série, menor será o lote. Para fazer isso, devemos adicionar 2 configurações: "Depo" e "RiskPerc". Para simplificar, vamos supor que $ 1000 = lote ($ 500 = 0,5 lotes). O valor da configuração "Depo" é obtido e multiplicado por"RiskPerc", o valor resultante é dividido pelo número máximo de posições "E", arredondado para o valor correto mais próximo. É assim que o tamanho do lote de uma posição é obtido.

É necessário adicionar a função de aumento automático do lote caso o depósito cresça. Em seguida, é criada a condição de que se a configuração "Depo" = 0, será tomado o valor atual do depósito, multiplicado por"RiskPerc", e a partir do valor recebido encontra-se o lote para abertura de posições.

Fechamento de posições

O fechamento ocorrerá quando:

1) O lucro total das posições abertas atinge o valor definido na configuração "CloseProfit". Como o número de posições abertas pelo robô não é constante e o tamanho do lote pode mudar, não será correto definir um valor de lucro fixo em dólares. É necessário que o lucro em dólares dependa do número atual de posições abertas e do lote total. Para fazer isso, é necessário introduzir o conceito de "lucro por lote".

Na configuração "CloseProfit" é indicado o valor do lucro para a posição total de 1 lote e o robô recalcula o valor do lucro para o número de lotes que abriu. Se 10 posições forem abertas para 0,01 lotes, o lote total será 0,1. Então, para obter o valor do lucro para fechar uma posição, precisamos Profit = "CloseProfit" * 0.1. Precisamos ajustar o lucro para fechar posições sempre que o número de posições muda. Como resultado, quando o lucro total se torna maior ou igual ao valor Profit calculado, o robô fecha as posições.

2) Quando a porcentagem de preponderância atual se torna menor ou igual ao valor "ClosePerc". Na configuração "ClosePerc", é definida a porcentagem de preponderância dos candles predominantes a fim de gerar um sinal para fechar uma série de posições. Anteriormente, quando a primeira posição era aberta, a preponderância foi encontrada no número de candles N. Agora, com o aparecimento de cada novo candle, o número de candles aumenta e se torna N+1; N+2; N+3, etc... Com o aparecimento de cada novo candle, precisamos verificar a porcentagem atual de preponderância dos blocos predominantes na amostra com o número de candles que aumentam em 1. Terminar a seqüência após a condição ser atendida.

3) Ao atingir o valor "MinEquity". Se os fundos atuais caíram abaixo do valor definido, precisamos completar as séries abertas e não abrir novas até que os fundos aumentem. Esta é uma função Stop Loss que protege o depósito de perdas.

Teste

Este algoritmo é primitivo, não sabe como se adaptar às condições do mercado mutáveis e é necessário para testar a viabilidade uma ideia, portanto, irei selecionar as configurações usando a otimização. A otimização será feita com busca exaustiva de todas as variantes, sem algoritmo genético. O robô foi desenvolvido em 2014 e feito para MetaTrader 4. Primeiro, vou testar com base no período H1 para GBPUSD. Vou definir um spread superestimado de 40, para que a otimização ocorra em condições não ideais, e no futuro haja uma certa margem de estabilidade. Um spread maior é necessário porque o robô controla o lucro atual das posições abertas e é afetado pelo spread.

Vou otimizar apenas 3 condições: o número mínimo de candles "MinBars", o percentual de abertura de posições "OpenPerc" e o lucro por lote "CloseProfit". Presumivelmente, quanto maior o número mínimo de candles para análise e quanto maior a porcentagem de abertura, mais confiáveis, porém, os sinais serão menos frequentes. "CloseProfit" depende indiretamente da volatilidade, portanto, antes da otimização, é necessário observar a volatilidade do instrumento e definir uma faixa adequada. A otimização será realizada para o ano de 25/11/2019 a 25/11/2020 no período gráfico H1.

optimization GBPUSD

Fig. 2. Resultados da otimização

A otimização com busca exaustiva é necessária para ver como os parâmetros afetam o resultado e como os resultados convergem com as suposições sobre como o algoritmo deveria funcionar na teoria. A Figura 2 mostra alguns dos resultados. Precisamos habilitar a classificação com base no lucro máximo e selecionar as configurações que têm os indicadores de rebaixamento e lucratividade mais adequados. As configurações destacadas parecem adequadas.

Após uma análise mais aprofundada dos resultados da otimização, pode-se verificar que com um aumento no valor de "MinBars" e "OpenPercent", a lucratividade cai, mas, junto com ela, o valor do rebaixamento cai. Em seguida, peguei os parâmetros destacados, testei com base no ano, peguei os resultados e avaliei que muda se aumentar/diminuir os valores "MinBars" e "OpenPercent". Cheguei à conclusão de que à medida que aumenta "MinBars" e "OpenPercent" o número de trades diminui, a confiabilidade do sinal aumenta. Isso significa que precisamos encontrar um equilíbrio entre lucratividade e rebaixamento.

Para negociação, tomei parâmetros mais conservadores, de modo que houvesse uma margem de segurança para a mudança da situação do mercado. Abaixo na Figura 3 é mostrado como o robô abre posições.

trade

Figura 3. Exemplo de abertura de posições

A Figura 3 mostra que a posição é adquirida conforme necessário com vários trades. O sinal de entrada é obtido alongado ao longo do tempo. Na primeira versão do algoritmo, foi obtido um sinal grosso, às vezes fortemente alongado no tempo. Não vou dizer que esta é uma média clássica, parece mais uma entrada vaga. Podemos dizer que se formou uma área com limites difusos, na qual a probabilidade de aparecimento de candles decrescentes é maior do que a probabilidade de surgirem crescentes, e devemos lucrar com essa probabilidade.

O algoritmo pode funcionar de forma estável com o valor "MinBars" = 70, mas pego 80 para que haja uma margem para flutuações nas características do instrumento de negociação. A lógica é semelhante ao escolher o parâmetro "CloseProfit ". No exemplo, é igual a 150, com qualquer valor menor, o algoritmo fica mais estável, mas a lucratividade diminui. Quando aumenta para 168, a estabilidade desaparece, por isso, vou deixá-lo em 150. Como resultado, para o ano, obteve-se um gráfico de lucratividade, conforme Figura 4. O valor "CloseProfit " nada mais é do que a volatilidade média convertida em dólares.

GBPUSD 2019 Chart

GBPUSD 2019 report

Fig. 4. GBPUSD H1, 2019.11.25 - 2020.11.25

O tamanho do depósito para otimização foi definido em $ 10.000. Além disso, quando for realizada uma pesquisa, a quantidade poderá ser otimizada. O teste e a otimização foram realizados no modo de pontos de controlo, pois o algoritmo trabalha com base nos preços de fechamento e sem importar o que aconteça dentro do candle. Mas a Figura 5 mostrará o teste para o mesmo período no modo "cada tick".

GBPUSD tick 2019 Chart

GBPUSD tick 2019 report

Fig. 5. GBPUSD H1, 25/11/2019 - 25/11/202020 modo "todos os ticks"

A Figura 5 mostra que no modo "cada tick", o lucro até aumentou ligeiramente, porque o teste se tornou mais preciso. A forma do gráfico de lucratividade permaneceu praticamente inalterada. Em ambos os testes, foi obtido um excelente fator de lucro de pouco mais de 5.

Seria errado tirar conclusões sobre a estabilidade do padrão com base em testes de um ano otimizado, por isso, vamos ver quantos anos aguentará o algoritmo com esses parâmetros no passado. A Figura 6 mostra o resultado do teste fora do período otimizado.

GBPUSD 2001 Chart

GBPUSD report 2001

Fig. 6. GBPUSD H1, 2001.01.01 - 2020.11.25

A Figura 6 mostra um backtest de 2001 com os mesmos parâmetros que foram obtidos durante a otimização para o ano de 25/11/2019 a 25/11/2020. O teste mostra que nesse intervalo tão grande, o rebaixamento aumentou apenas alguns dólares, o lucro subiu significativamente e o fator de lucro ascendeu para 7,5. O teste foi realizado já para um depósito de $ 3 000 e sem refinanciamento, a fim de entender como o padrão se comporta em longos períodos de tempo. 

O fato de a otimização haver sido realizada durante um ano e o algoritmo apresentar um resultado estável por 20 anos sugere que o padrão é bastante estável, sendo que os parâmetros não foram ajustados ao histórico. Pelo menos por alguma razão, o par GBPUSD não se desvia muito de suas características estatísticas inerentes. 

Seria errado tirar conclusões com base no teste de só um par de moedas e só um período gráfico. Por esse motivo, consideraremos testes para outro par de moedas EURUSD. Como no caso anterior, a otimização foi realizada durante um ano, de 25/11/2019 a 25/11/2020, no timeframe H1. Abordei a escolha dos parâmetros da mesma forma que no caso anterior. A Figura 7 mostra os resultados.

EURUSD 2019 Chart

EURUSD 2019 report

Fig. 7. EURUSD H1, 2019.11.25 - 2020.11.25

Como podemos ver na Figura 7, o rendimento do EURUSD é menor do que o do GBPUSD, e o rebaixamento é um pouco maior. O gráfico de lucratividade mostra que houve uma parcela onde foram abertas muitas posições. Após de apertar um pouco os parâmetros "MinBars" e "OpenPercent", podemos reduzir o número de posições e, logo, o rebaixamento. Vamos passar para o teste durante um longo período. A Figura 8 mostra o teste do EURUSD de 01/01/2007 a 25/11/2020.

EURUSD 2007 chart

EURUSD 2007 report

Fig. 8. EURUSD H1, 2007.01.01 - 2020.11.25

Trabalhar com o par EURUSD não é tão estável quanto com o GBPUSD, e o período estável no passado acabou sendo 6 anos menor. O resultado ainda é bom. A otimização dos parâmetros foi realizada durante um ano, e o trabalho estável se manteve quase durante 14 anos. Este fato sugere novamente que os parâmetros não foram apenas ajustados ao histórico, e que há um padrão bastante estável para o instrumento de negociação.

Em seguida, precisamos verificar como o algoritmo se comporta em outros períodos gráficos. Teoricamente, com uma diminuição no período gráfico, a estabilidade deve diminuir, porque o tamanho dos candles num timeframe menor em relação ao spread diminui significativamente. Portanto, haverá menos lucro e mais custos de negociação. Além disso, em timeframes pequenos, o ponto de entrada pode se tornar ainda mais esticado no tempo, causando a abertura de um número maior de posições e, consequentemente, grandes rebaixamentos.

Vou testar com base no período M15, GBPUSD. Vou realizar a otimização, como no caso anterior, para o ano de 25/11/2019 a 25/11/2020. Mas, em vez de exibir o gráfico de otimização de um ano, logo mostrarei o maior intervalo possível que o algoritmo pode passar sem problemas.

GBPUSD m15 chart

Fig. 9. GBPUSD m15 2000.01.01-2020.11.25

A Figura 9 mostra o teste do par GBPUSD para o timeframe M15, o teste foi feito desde 2000, mas o número de sinais de entrada e, consequentemente, o número de posições são pequenos. Como escrevi acima, em timeframes pequenos, a estabilidade é menor e as configurações são muito conservadoras. O sinal de entrada é raramente gerado, a rentabilidade não é alta, mas o rebaixamento é apropriado.

Em seguida, testarei no período gráfico superior, H4, para o par GBPUSD. Já existem algumas candles para otimização no período H4, por isso, farei a otimização com base na parcela de 2 anos, de 25/11/2018 a 25/11/2018. Vou mostrar o resultado imediatamente no intervalo máximo.

GBPUSD H4

GBPUSD H4 Report

Figura 10. GBPUSD H4 2000.01.01-2020.11.25

No período de H4, um resultado estável foi mostrado ao longo de um intervalo de quase 20 anos, de 01/01/2000 a 2020.11.25. Como nos casos anteriores, toda a otimização consistia em encontrar um equilíbrio entre lucro e estabilidade. As configurações conservadoras do período gráfico M15 funcionam de forma muito estável em nos períodos H1 e H4, mas não fazem sentido até porque há sinais muito raros e um pequeno número de trades.

Também podemos testar quaisquer outros instrumentos de negociação. O desempenho do algoritmo pode variar para cada um deles. Mas a tendência se mantém - a otimização de um ano permite trabalhar de forma estável durante vários anos. A seguir, mostrarei os resultados para o período H1 do par GBPJPY. A otimização foi realizada ao longo de um ano, o resultado é mostrado na Figura 11.

GBPJPY chart

GBPGPY report

Fig. 11. GBPJPY 2009.01.01 - 2020.11.25

Para GBPJPY, conseguimos realizar um backtest estável desde 2009. O resultado não é tão bonito quanto o do GBPUSD, mas o principal é que funciona. 

Eu adicionei ao robô a capacidade de reinvestir o dinheiro ganho, e precisamos usar isso. Antes, mostrei testes com configurações conservadoras, mas e se fizermos configurações muito agressivas e permitir um aumento no lote? Não sou fã de riscos elevados, mas vamos ver do que o algoritmo é capaz. Vou testar usando GBPUSD de 2006.01.01 a 2020.11.25 no modo "cada tick". Podíamos ter configurado outra ferramenta. Reduzo o spread para um valor de = 20, que está um pouco acima da média. A Figura 12 mostra o resultado do backtest de quase 15 anos.


GBPUSD max risk

Fig. 12. GBPUSD, de 2006.01.01 a 2020.11.25, configurações agressivas

Deixe-me lembrá-lo de que o algoritmo funciona com os preços de fechamento, por isso, este resultado não é um "graal de teste"; além disso, é definido um spread adequado de 20. O resultado do trabalho na vida real, como regra, coincide com o resultado deste algoritmo no testador. Mas eu mesmo nunca usei com configurações tão agressivas, e como em MetaTrader 4 não podemos levar em consideração spreads reais, não vou afirmar que na vida real ele também teria passado por esse período com sucesso.

Análise dos resultados

O robô acabou sendo simples e muito fácil de otimizar. É importante que a otimização baseada num período curto e o uso de parâmetros não ótimos com antecedência permitam que ele permaneça estável por vários anos ou, às vezes, até dezenas de anos. Isso sugere que o padrão encontrado não é acidental e que, por algum motivo, está realmente presente no mercado. Mas o algoritmo de trabalho é bastante "inflexível", possui um mínimo de graus de liberdade e opera com parâmetros especificados de maneira fixa. Se uma série de preços vai além das capacidades do algoritmo, este perde imediatamente sua estabilidade. 

Algo importante é que ele pode ser usado em qualquer período, a partir do timeframe cujo tamanho de candle é muito maior do que o spread e as comissões do instrumento. Conforme o timeframe aumenta, a estabilidade cresce até o timeframe diário. Mas os requisitos para o depósito também aumentam, porque o tamanho dos candles se torna significativo, o que leva a rebaixamentos significativas nos fundos.

Podemos concluir que o pressuposto de que a série de preços é apenas superficialmente semelhante a um passeio aleatório (como descrevi no meu primeiro artigo "Discretização da série de preços, componente aleatória e "ruído"" acabou sendo correto e a série de preços contém pelo menos um padrão oculto.

Por outro lado, conheço e compreendo bem o padrão que permite fazer lucro, o que significa que é possível começar um trabalho sério de modernização.

Uso no trading

Uma grande desvantagem do algoritmo atual é sua baixa lucratividade em relação aos riscos. Precisamos ser honestos e entender que existem riscos (de qualquer maneira, como em outras situações). Mas enquanto as melhorias estão sendo desenvolvidas, você pode operar usando este robô. Para fazer isso, precisamos aumentar sua lucratividade e manter o nível de rebaixamento. É necessário usar a forma de operar do algoritmo. Raramente gera sinais para instrumentos de negociação e, como regra, eles são significativamente espaçados no tempo para diferentes instrumentos de negociação. Na maior parte do tempo, não há negociação para o instrumento, precisamos preencher esses "tempos de inatividade". 

Como regra, não há correlação estável de sinais para diferentes instrumentos. Esse recurso deve ser usado para aumentar os lucros e, ao mesmo tempo, manter o nível de rebaixamento.

Para aumentar a lucratividade, é necessário analisar vários instrumentos simultaneamente, e quando aparecer um sinal para um dos instrumentos, abrir posições com base nele. Se as posições estiverem abertas para um instrumento, os sinais no início de uma série vinda de outros instrumentos devem ser ignorados. Isso tornará possível usar o tempo da forma mais eficiente possível, aumentar o número de sinais e, consequentemente, aumentar o lucro proporcionalmente. O rebaixamento máximo permanecerá no nível de um instrumento.

Os sinais para o início de uma série são fracamente correlacionados não apenas entre instrumentos independentes, mas também entre diferentes timeframes do mesmo instrumento. Por esse motivo, ao usar 3 timeframes de um instrumento para operar, podemos usar o tempo de forma ainda mais eficiente e conseguir ver sempre posições abertas no mercado. O nível de rebaixamento permanecerá no mesmo nível, enquanto o lucro aumentará significativamente.

Várias modificações foram feitas para funcionar em contas reais:

1) Adicionados mais 9 instrumentos de negociação independentes, cada um com seus próprios parâmetros. Assim, ele poderá analisar e operar com 10 instrumentos de negociação de uma vez. Como é possível otimizar, em maior ou menor escala, os parâmetros de quase todos os instrumentos, essa decisão se tornou lógica.

2) Limitada a abertura simultânea de posições para vários instrumentos de negociação. Para isso, foi adicionado o parâmetro "MaxSeries". Se definirmos o valor como 1, a negociação continuará com base em apenas 1 instrumento, se definirmos como 2, as posições poderão ser abertas simultaneamente com base em dois instrumentos e assim por diante. Isso possibilitará ao robô gerar com mais frequência sinais para abrir posições, enquanto usa seu "tempo livre". O lucro aumenta proporcionalmente e a rebaixamento máxima permanecerá no nível de um instrumento.

O testador do MetaTrader 4 não sabe como realizar testes de multimoedas, mas se mais de um instrumento for negociado ao mesmo tempo, o rebaixamento provavelmente aumentará proporcionalmente à raiz quadrada do número de instrumentos negociados simultaneamente, desde que não haja correlação entre os sinais de diferentes instrumentos. Se esperarmos um rebaixamento de $ 1000, então, ao negociar três instrumentos simultaneamente, podemos esperar um aumento no rebaixamento para o nível de $ 1000*raiz(3) = $ 1732.

3) Limitado o número mínimo de fundos "MinEquity". Ao atingir esse valor, a negociação para, as posições são fechadas. Isso é necessário para planejar os riscos com antecedência e agir em conformidade.

4) O robô pode ser usado em vários timeframes ao mesmo tempo para aumentar a lucratividade. Os meus testes indicam que os sinais para abrir posições geralmente têm uma correlação entre diferentes timeframes, mas longe de ser de 100%.

Usei este robô para negociar simultaneamente com 25 pares de moedas, bem como os timeframes H1 e H4 através de configurações conservadoras, e consegui manter um rendimento de 10% ao mês. Em outra conta, com configurações um pouco mais agressivas, foi possível atingir um rendimento de 15% ao mês. Houve muitos trades.

Conclusões e futuro desenvolvimento

  • Encontramos um método de negociação fora do padrão, que não é óbvio à primeira vista;
  • O padrão básico escolhido acabou por ser universal e estar realmente presente em instrumentos de negociação certificados;
  • O padrão é simples e claro, necessitamos estudar os mecanismos por trás dele, desenvolver formas de melhorar a qualidade dos sinais;
  • O algoritmo está perfeitamente otimizado e permanece estável por muito tempo;
  • O ponto de entrada é fortemente alongado no tempo, precisamos aprimorar a localização do sinal para abrir posições;
  • Fatores não contemplados ao longo do tempo levam à perda de estabilidade do algoritmo;
  • É necessário continuar o desenvolvimento de um modelo teórico para reduzir o número de fatores não contemplados a cada nova versão e, como resultado, considerar todos os possíveis fatores que afetam esse padrão;
  • A próxima versão do algoritmo deve se tornar mais flexível e já deve começar a ajustar levemente seus parâmetros às mudanças do mercado.

No próximo artigo, contarei quais mecanismos foram desenvolvidos para melhorar sua estabilidade e como o tornei mais flexível.

Anexado ao artigo está o código do robô e seus termos de referência.

Autor da ideia e da especificação técnica, Maxim Romanov, o código foi escrito por Vyacheslav Ivanov.

Traduzido do russo pela MetaQuotes Software Corp.
Artigo original: https://www.mql5.com/ru/articles/8616

Arquivos anexados |
50p_V1.mq4 (100.93 KB)
Technical_task.zip (30.59 KB)
AAPL_GAZP_statistics.zip (12989.18 KB)
GBPUSD_statistics.zip (14471.42 KB)
Usando planilhas para construir estratégias de negociação Usando planilhas para construir estratégias de negociação
O artigo descreve os princípios básicos e abordagens que permitem analisar qualquer estratégia usando planilhas - Excel, Calc, Google. Os resultados também são comparados com os do testador do MetaTrader 5.
Gradient boosting no aprendizado de máquina transdutivo e ativo Gradient boosting no aprendizado de máquina transdutivo e ativo
Neste artigo, nós consideraremos os métodos de aprendizado de máquina ativo que se baseiam em dados reais e discutiremos seus prós e contras. Talvez você considere esses métodos úteis e os inclua em seu arsenal de modelos de aprendizado de máquina. A transdução foi introduzida por Vladimir Vapnik, que é o coinventor da Support-Vector Machine (SVM).
Redes Neurais de Maneira Fácil (Parte 9): Documentação do trabalho Redes Neurais de Maneira Fácil (Parte 9): Documentação do trabalho
Nós já percorremos um longo caminho e o código em nossa biblioteca está se tornando cada vez maior. Isso torna difícil controlar todas as conexões e dependências. Portanto, eu sugiro criar uma documentação para o código criado anteriormente e mantê-lo atualizado a cada nova etapa. A documentação devidamente preparada nos ajudará a ver a integridade do nosso trabalho.
Redes Neurais de Maneira Fácil (Parte 8): Mecanismos de Atenção Redes Neurais de Maneira Fácil (Parte 8): Mecanismos de Atenção
Nos artigos anteriores, nós já testamos várias opções para organizar as redes neurais. Nós também estudamos as redes convolucionais emprestadas dos algoritmos de processamento de imagem. Neste artigo, eu sugiro estudarmos os Mecanismos de Atenção, cujo surgimento deu impulso ao desenvolvimento dos modelos de linguagem.