Discussão do artigo "Reimaginando Estratégias Clássicas (Parte XI): Cruzamento de Médias Móveis (II)"

 

Novo artigo Reimaginando Estratégias Clássicas (Parte XI): Cruzamento de Médias Móveis (II) foi publicado:

As médias móveis e o oscilador estocástico podem ser usados para gerar sinais de negociação de tendência. No entanto, esses sinais só serão observados após a ação do preço ter ocorrido. Podemos superar efetivamente essa defasagem inerente dos indicadores técnicos usando IA. Este artigo ensinará como criar um Expert Advisor totalmente autônomo com IA, de forma a melhorar qualquer uma de suas estratégias de negociação existentes. Até mesmo a estratégia de negociação mais antiga possível pode ser aprimorada.

Já abordamos anteriormente a ideia de prever cruzamentos de médias móveis, o artigo está vinculadoaqui. Observamos que os cruzamentos de médias móveis são mais fáceis de prever do que as mudanças de preço diretamente. Hoje revisitaremos este problema familiar, mas com uma abordagem totalmente diferente.
 
Agora queremos investigar minuciosamente quão grande é a diferença que isso faz para nossas aplicações de trading e como esse fato pode melhorar suas estratégias de trading. Os cruzamentos de médias móveis estão entre as estratégias de negociação mais antigas existentes. É desafiador construir uma estratégia lucrativa usando uma técnica tão amplamente conhecida. No entanto, espero mostrar a você neste artigo que cães velhos podem de fato aprender truques novos.

Para sermos empíricos em nossas comparações, primeiro construiremos uma estratégia de trading em MQL5 para o par EURGBP usando apenas os seguintes indicadores:

  1. 2 Médias Móveis Exponenciais aplicadas ao Preço de Fechamento. Uma com período de 20 e a outra definida como 60.
  2. O oscilador Estocástico com as configurações padrão de 5,3,3 aplicado, definido para o Modo de Média Móvel Exponencial e configurado para fazer seus cálculos no modo CLOSE_CLOSE.
  3. O indicador Average True Range com período de 14 para definir nossos níveis de take-profit e stop-loss.

Nossa estratégia será destinada a operar no Time Frame Diário. Faremos o back-test desta estratégia desde o primeiro de janeiro de 2022 até o início de junho de 2024. Nossa estratégia inicialmente usará regras clássicas de trading. Assim, sinais de compra serão gerados sempre que a média móvel rápida cruzar acima da média móvel lenta e a leitura do estocástico estiver acima de 80. E o inverso é verdadeiro para nossos sinais de venda. Registraremos um sinal de venda quando a média móvel rápida estiver abaixo da lenta e o oscilador estocástico estiver abaixo de 20.


Autor: Gamuchirai Zororo Ndawana

 

Obrigado, Gamu. Gosto de suas publicações e tento aprender reproduzindo suas etapas.

Estou tendo alguns problemas, espero que isso possa ajudar outras pessoas.

1) Meus testes com o EURGBP_Stochastic diário usando o script fornecido produziram apenas 2 ordens e, posteriormente, uma taxa de Sharpe de 0,02. Acredito que tenho as mesmas configurações que você, mas em duas corretoras ele produz apenas duas ordens.

2) como alerta para outros, talvez seja necessário modificar as configurações do símbolo para corresponder à sua corretora (por exemplo, EURGBP para EURGBP.i), se necessário

3) em seguida, quando tento exportar os dados, obtenho uma matriz fora do intervalo para o ATR. Acredito que isso ocorra porque não obtenho 100.000 registros na minha matriz (se eu alterá-la para 677), posso, portanto, obter um arquivo com 677 linhas. Para mim, o padrão para o número máximo de barras em um gráfico é 50.000. Se eu alterar isso para 100.000, o tamanho da minha matriz será de apenas 677, mas é possível que eu tenha uma configuração incorreta. Talvez você também possa incluir o script de extração de dados em seu download.

4) Copiei o código do seu artigo para tentar no Python e recebi um erro look_ahead not defined ----> 3 data.loc[data["Close"].shift(-look_ahead) > data["Close"], "Binary Target"] = 1

4 data = data.iloc[:-look_ahead,:]


NameError: o nome 'look_ahead' não está definido

5) Quando carreguei o notebook do Juypiter, descobri que ele precisava ter o look ahead definido #Let us forecast 20 steps into the future

look_ahead = 20 , Depois disso, usei apenas o arquivo incluído, mas estou com o seguinte erro, possivelmente relacionado ao fato de ter apenas 677 linhas.

Executei o #Scale os dados antes de começar a visualizá-los

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

o que me dá um erro que não sei como resolver

ipython-input-6-b2a044d397d0>:4: SettingWithCopyWarning: Um valor está tentando ser definido em uma cópia de uma fatia de um DataFrame. Em vez disso, tente usar .loc[row_indexer,col_indexer] = value Veja as advertências na documentação: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy data[[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

 
linfo2 #:

Obrigado, Gamu. Gosto de suas publicações e tento aprender reproduzindo suas etapas.

Estou tendo alguns problemas, espero que isso possa ajudar outras pessoas.

1) Meus testes com o EURGBP_Stochastic diário usando o script fornecido produziram apenas 2 ordens e, posteriormente, uma taxa de Sharpe de 0,02. Acredito que tenho as mesmas configurações que você, mas em duas corretoras ele produz apenas duas ordens.

2) como alerta para outros, talvez seja necessário modificar as configurações do símbolo para que correspondam à sua corretora (por exemplo, EURGBP para EURGBP.i), se necessário

3) em seguida, quando tento exportar os dados, obtenho uma matriz fora do intervalo para o ATR. Acredito que isso ocorra porque não obtenho 100.000 registros na minha matriz (se eu alterá-la para 677), posso, portanto, obter um arquivo com 677 linhas. Para mim, o padrão para o número máximo de barras em um gráfico é 50.000. Se eu alterar isso para 100.000, o tamanho da minha matriz será de apenas 677, mas é possível que eu tenha uma configuração incorreta. Talvez você também possa incluir o script de extração de dados em seu download.

4) Copiei o código do seu artigo para tentar no Python e recebi um erro look_ahead not defined ----> 3 data.loc[data["Close"].shift(-look_ahead) > data["Close"], "Binary Target"] = 1

4 data = data.iloc[:-look_ahead,:]


NameError: o nome 'look_ahead' não está definido

5) Quando carreguei seu notebook Juypiter, descobri que ele precisava ter o look ahead definido #Let us forecast 20 steps into the future

look_ahead = 20 , Depois disso, usei apenas o arquivo incluído, mas estou com o seguinte erro, possivelmente relacionado ao fato de ter apenas 677 linhas.

Executei o #Scale os dados antes de começar a visualizá-los

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

o que me dá um erro que não sei como resolver

ipython-input-6-b2a044d397d0>:4: SettingWithCopyWarning: Um valor está tentando ser definido em uma cópia de uma fatia de um DataFrame. Em vez disso, tente usar .loc[row_indexer,col_indexer] = value Veja as advertências na documentação: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy data[[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

E aí, Neil, acredito que você esteja bem.

Deixe-me ver como posso ajudar:

1) Esse erro é bastante estranho, veja como eu o abordaria:

Nosso sistema só abre negociações se os dois modelos de IA apresentarem a mesma previsão. Treine os modelos e avalie seus coeficientes, isso lhe dirá quando cada um deles gerará um sinal e qual será o sinal. Em seguida, monitore cuidadosamente o back test para ver se as condições sob as quais o modelo está, explicam o número de negociações.

2) Esse é um problema constante e é difícil de controlar porque cada corretora tem sua própria convenção de nomes, mas a solução que você forneceu é válida.

3) Isso pode indicar que sua corretora só tem 677 barras de dados diários que podem ser usados, excluindo os cálculos de período. Isso é normal, eu também tenho essa experiência. Às vezes, tento buscar apenas um ano de dados diários, mas só obtenho 200 e poucas barras.

4) Tente definir o look ahead logo acima da declaração que está causando problemas e, se necessário, atualize-o em todo o código.

5) Isso pode ser um problema de estarmos usando versões diferentes da biblioteca, versões do Python etc. Acho que o ajuste precisa ser feito antes da atribuição. Portanto, a linha:

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] =

Pode precisar ser ajustada para:

data.loc[:,['Open','High',...,'Stoch Main']] =
 
Gamuchirai Zororo Ndawana #:
E aí, Neil, acredito que você esteja bem.

Deixe-me ver como posso ajudar:

1) Esse erro é bastante estranho, veja como eu o abordaria:

Nosso sistema só abre negociações se os dois modelos de IA apresentarem a mesma previsão. Treine os modelos e avalie seus coeficientes, isso lhe dirá quando cada um deles gerará um sinal e qual será o sinal. Em seguida, monitore cuidadosamente o back test para ver se as condições sob as quais o modelo está, explicam o número de negociações.

2) Esse é um problema constante e é difícil de controlar porque cada corretora tem sua própria convenção de nomes, mas a solução que você forneceu é válida.

3) Isso pode indicar que sua corretora tem apenas 677 barras de dados diários que podem ser usados, excluindo os cálculos de período. Isso é normal, eu também tenho essa experiência. Às vezes, tento obter apenas um ano de dados diários, mas só obtenho 200 e poucas barras.

4) Tente definir o look ahead logo acima da declaração que está causando problemas e, se necessário, atualize-o em todo o código.

5) Isso pode ser um problema de estarmos usando versões diferentes da biblioteca, versões do Python etc. Acho que o ajuste precisa ser feito antes da atribuição. Portanto, a linha:

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] =

Pode precisar ser ajustado para:

data.loc[:,['Open','High',...,'Stoch Main']] =

Sim, sei que há muitas partes móveis. Verei se isso resolverá meus problemas.

 
linfo2 #:

Sim, eu sei que há muitas partes móveis, vou ver se isso resolverá meus problemas.

Não é mesmo? São tantos, e essa é apenas uma implementação simples