Discussão do artigo "Usando o Algoritmo de Aprendizado de Máquina PatchTST para Prever a Ação do Preço nas Próximas 24 Horas" - página 2

 
Muitas vezes, percebo que os resultados previstos desse modelo não são muito consistentes com a situação real. Não fiz nenhuma alteração no código desse modelo. Você poderia me dar alguma orientação? Obrigado.
 
Thomas Sawyer #:
Muitas vezes, percebo que os resultados previstos desse modelo não são muito consistentes com a situação real. Não fiz nenhuma alteração no código desse modelo. Você poderia me dar alguma orientação? Muito obrigado.

Obrigado por compartilhar sua experiência com o modelo. Você levantou uma questão válida sobre a consistência da previsão. O modelo PatchTST funciona melhor quando integrado a uma abordagem de negociação abrangente que considera vários fatores de mercado. Veja como eu recomendo usar as previsões do modelo de forma mais eficaz:

  1. Otimização da janela de tempo:
  • Concentre-se na negociação durante os horários de pico (das 6h às 10h, horário central dos EUA).
  • Use as previsões do modelo principalmente durante essas horas, quando os movimentos do mercado são mais previsíveis
  • Preste atenção especial aos desvios em torno das máximas/mínimas diárias e semanais anteriores. Essas são suas principais zonas de oferta e demanda.
  1. Estratégia de integração do modelo:
  • Use as previsões como parte de uma análise mais ampla, não como sinais autônomos
  • Procure por Fair Value Gaps (FVGs) nas faixas de preço previstas. Forneci abaixo o código de um indicador que uso para FVGs em MQL5.
  • Combine as previsões com padrões técnicos como bandeiras, cunhas e consolidações horizontais.
  • Considere as previsões no contexto das localizações de preços diárias, semanais e mensais
  1. Gerenciamento de riscos:
  • Implemente stops mais amplos (por exemplo, stop-loss de 10 pontos ou 100 pips para ouro, 50 pips para EURUSD, 65 pips para USDJPY, 60 pips para GBPUSD, 30 pips para AUDUSD/NZDUSD, 40 pips para USDCAD, 0,80 pontos para petróleo, 25 pontos para US500, 75 pontos para NQ, 200 pontos para US30)
  • Use take-profits modestos para parciais (ou seja, recompensa de risco de 1:1 para a primeira parcial (70% da posição inicial), deixe um runner (30% da posição inicial)
  • Dimensione as posições com base nas condições do mercado - boas negociações com muita confluência, 2 a 3x o tamanho da posição básica.
  • Evite negociar durante eventos de notícias de alto impacto
  1. Construção de contexto:
  • Analise a estrutura do mercado em vários períodos de tempo: utilize 5 minutos e 15 minutos - é provável que haja um candle/barra/preço de fechamento ideal para entrar dentro de 1 hora, onde o modelo prevê a entrada em sua direção de negociação.
  • Considere o estado atual do mercado (tendência/alinhamento/consolidação/choppy/reversão) - utilize essas informações para pré-planejar sua hora ideal de negociação. Se o que você previu não estiver acontecendo, procure a próxima oportunidade disponível que o modelo está lhe oferecendo.
  • Procure por confirmações de padrões nas faixas de preço previstas
  • Concentre-se na tendência direcional e nos principais níveis de suporte/resistência
  1. Refinamento da entrada:
  • Aguarde as confirmações estruturais antes de entrar nas negociações. Estruturas que você conhece melhor: topos/fundos duplos, cunhas, bandeiras de touro/urso, topos/fundos MTR, clímaxes, especialmente em torno das principais áreas de suporte e resistência/FVGs.
  • Não entre se você estiver prevendo um canal de tendência. Os canais de tendência são seus piores inimigos. Mesmo que encontre um canal de tendência em um período de tempo mais alto, como 4 horas ou um dia, NÃO CONTRATRE!
  • Procure padrões de consolidação dentro dos intervalos previstos - jogue todas as reversões. Esse modelo realmente se destaca com reversões.
  • Considere a possibilidade de escalonar as posições em vez de fazer entradas de tamanho normal. 25% do tamanho inicial - aumente a escala à medida que o preço for a seu favor até o tamanho total da posição. Não faça scale-in contra sua posição, ou seja, se a posição for contra você.

Algumas observações pessoais adicionais:

  • É preciso estar atento e antecipar certas coisas com esse modelo: As reversões em torno de áreas-chave são as mais lucrativas.
    • Portanto, digamos que o modelo preveja uma mudança de cor em uma determinada barra ou período de tempo. Esse é o momento de começar a prestar atenção. Procure uma confluência extra antes da entrada. Se você não obtiver essa confluência, espere até obtê-la. Mesmo que a cor tenha mudado, a operação ainda pode funcionar. O que quero dizer é que esse é um bom modelo de "timing" do ponto de vista de "quando" você precisa começar a se preocupar e prestar atenção.
  • Esse modelo dá muitos falsos positivos, mas algumas grandes vitórias eliminam todas as perdas ruins.
  • Comece com um par e adicione outro par toda semana. Amplie seus modelos para um total de 10 pares.
  • Você obterá de 2 a 3 grandes negociações toda semana.
  • Preveja um ganho semanal de cerca de 0,5% a 1,5%. Você está arriscando cerca de 1,0% a 2,5% toda semana em todos os pares diferentes. Em outras palavras, você negocia pouco, permanece diversificado em vários instrumentos não correlacionados e se concentra em intervalos de tempo específicos. Você acertará cerca de 3 a 6 instrumentos de forma consistente e isso fará com que você ganhe a maior parte do seu dinheiro. Portanto, não se prenda a uma única operação nem analise excessivamente um único ponto de dados.
  • Se a mudança prevista estiver relacionada a um evento noticioso, ignore-a e concentre-se em outro par ou aguarde a próxima mudança de sinal de cor.
  • Os canais de tendência são seu pior inimigo - se você sequer suspeitar deles, esqueça o par naquele dia. Como alternativa, faça o oposto do que o modelo está lhe dizendo, pois, caso contrário, você será pego pela tendência contrária e perderá.
  • Negociar com esse modelo é "desconfortável" - você realmente nunca confia nele e sempre tem a sensação de que "essa operação nunca funcionará, é tão contraintuitiva", mas aí está a beleza. Isso faz com que você faça o que não quer fazer, que é a coisa certa a fazer (a coisa que você não quer fazer, mas deve fazer porque é a coisa certa a fazer naquela situação).
  • Conceito de inversões Ocorre em cerca de 20 a 30% das vezes: é quando o modelo está lhe dando uma cor (vermelho ou verde), mas o mercado parece estar sempre fazendo o oposto. Esse é um cenário de inversão - não há nada de errado com o modelo e também não há nada de errado com sua negociação. Você só precisa perceber que ocorreu uma inversão e começar a fazer o oposto ou ignorar o par até que as expectativas se realinhem. Isso geralmente leva de 6 a 10 sessões (cerca de 2 a 4 dias) para que uma inversão se conserte. A maneira mais fácil de identificar uma inversão com esse modelo é usar o script python que eu lhe dei para as previsões do modelo - extraia os dados sequencialmente das últimas 6 sessões (portanto, não extraia os dados mais recentes - faça um lookback). Veja se as previsões estão correspondendo ao real. Se não estiverem, ocorreu uma inversão.

As previsões do modelo devem ser usadas como um componente de sua análise, e não como o único responsável pela tomada de decisões. Ao incorporar esses elementos, você pode potencialmente melhorar a consistência dos resultados de suas negociações ao usar o modelo PatchTST.

Espero que isso ajude.

Fair Value Gap (FVG) Script que mencionei (esses gaps funcionam de forma muito semelhante às zonas de oferta e demanda, em minha experiência):

#property copyright "© ShashankRai1"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

input bool ShowMidpoint = false; // Mostrar linha de ponto médio
input color UpFVGColor = clrGreen;  // Up FVG Color
input color DownFVGColor = clrRed;  // Down FVG Color

int OnInit()
{
    IndicatorSetString(INDICATOR_SHORTNAME, "Show FVG");
    return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
    ObjectsDeleteAll(0, "FVG_");
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    int start;
    if(prev_calculated == 0)
    {
        start = rates_total - 1;  // Processar todos os dados disponíveis
    }
    else
    {
        start = prev_calculated - 1;  // Processar somente novas barras
    }

    for (int i = start; i >= 2; i--)  // Certifique-se de que temos pelo menos 3 barras
    {
        drawFVG(i, rates_total, time, open, high, low, close);
    }

    return(rates_total);
}

void drawFVG(int index, int total, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[])
{
    if (index < 2 || index >= total) return; // Garantir que tenhamos barras suficientes

    if (close[index - 1] > open[index - 1] && high[index - 2] < low[index])
    {
        // Condição de fechamento da vela e existência de lacuna
        string boxName = StringFormat("FVG_Box_Up_%d", index);
        if(ObjectCreate(0, boxName, OBJ_RECTANGLE, 0, time[index - 2], high[index - 2], time[index], low[index]))
        {
            ObjectSetInteger(0, boxName, OBJPROP_COLOR, UpFVGColor);
            ObjectSetInteger(0, boxName, OBJPROP_BGCOLOR, UpFVGColor);
            ObjectSetInteger(0, boxName, OBJPROP_BACK, true);
            ObjectSetInteger(0, boxName, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, boxName, OBJPROP_FILL, true);
            Print("Created Up FVG box at index ", index);
        }
        else
        {
            Print("Failed to create Up FVG box at index ", index, ". Error: ", GetLastError());
        }

        if (ShowMidpoint)
        {
            string lineName = StringFormat("FVG_Line_Up_%d", index);
            double midpoint = (high[index - 2] + low[index]) / 2;
            if(ObjectCreate(0, lineName, OBJ_TREND, 0, time[index - 2], midpoint, time[index], midpoint))
            {
                ObjectSetInteger(0, lineName, OBJPROP_COLOR, UpFVGColor);
                ObjectSetInteger(0, lineName, OBJPROP_STYLE, STYLE_DASH);
                ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 1);
                Print("Created Up FVG midline at index ", index);
            }
            else
            {
                Print("Failed to create Up FVG midline at index ", index, ". Error: ", GetLastError());
            }
        }
    }
    else if (close[index - 1] < open[index - 1] && low[index - 2] > high[index])
    {
        // Condição de vela de fechamento para baixo e existe um gap
        string boxName = StringFormat("FVG_Box_Down_%d", index);
        if(ObjectCreate(0, boxName, OBJ_RECTANGLE, 0, time[index - 2], low[index - 2], time[index], high[index]))
        {
            ObjectSetInteger(0, boxName, OBJPROP_COLOR, DownFVGColor);
            ObjectSetInteger(0, boxName, OBJPROP_BGCOLOR, DownFVGColor);
            ObjectSetInteger(0, boxName, OBJPROP_BACK, true);
            ObjectSetInteger(0, boxName, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, boxName, OBJPROP_FILL, true);
            Print("Created Down FVG box at index ", index);
        }
        else
        {
            Print("Failed to create Down FVG box at index ", index, ". Error: ", GetLastError());
        }

        if (ShowMidpoint)
        {
            string lineName = StringFormat("FVG_Line_Down_%d", index);
            double midpoint = (high[index] + low[index - 2]) / 2;
            if(ObjectCreate(0, lineName, OBJ_TREND, 0, time[index - 2], midpoint, time[index], midpoint))
            {
                ObjectSetInteger(0, lineName, OBJPROP_COLOR, DownFVGColor);
                ObjectSetInteger(0, lineName, OBJPROP_STYLE, STYLE_DASH);
                ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 1);
                Print("Created Down FVG midline at index ", index);
            }
            else
            {
                Print("Failed to create Down FVG midline at index ", index, ". Error: ", GetLastError());
            }
        }
    }
}
 
Shashank Rai #:

Obrigado por seu interesse! Sim, essas alterações nos parâmetros funcionariam em princípio, mas há algumas considerações importantes ao mudar para os dados M1:

1. Volume de dados: Treinar com 10080 minutos (1 semana) de dados M1 significa lidar com um número significativamente maior de pontos de dados do que com H1. Isso irá:

  • Aumentará substancialmente o tempo de treinamento
  • Exigirá mais memória
  • Necessita potencialmente de aceleração de GPU para um treinamento eficiente

2. Ajustes na arquitetura do modelo: Na Etapa 8 do treinamento do modelo e na Etapa 4 do código de previsão, talvez você queira ajustar outros parâmetros para acomodar a sequência de entrada maior:

3. Qualidade da previsão: Embora você obtenha previsões mais granulares, esteja ciente de que os dados M1 normalmente contêm mais ruído. Talvez você queira fazer experiências com diferentes comprimentos de sequência e janelas de previsão para encontrar o equilíbrio ideal.

Obrigado pela informação. Meu computador é razoavelmente capaz, com 256 GB e 64 núcleos físicos. No entanto, ele poderia ter uma GPU melhor.

Depois de atualizar a GPU, tentarei as definições de configuração atualizadas.

 
Shashank Rai #:

Obrigado por compartilhar sua experiência com o modelo. Você levantou uma questão válida sobre a consistência das previsões. O modelo PatchTST funciona melhor quando integrado a uma abordagem de negociação abrangente que considera vários fatores de mercado. Veja como eu recomendo usar as previsões do modelo de forma mais eficaz:

  1. Otimização da janela de tempo:
  • Concentre-se na negociação durante os horários de pico (das 6h às 10h, horário central dos EUA).
  • Use as previsões do modelo principalmente durante essas horas, quando os movimentos do mercado são mais previsíveis
  • Preste atenção especial aos desvios em torno das máximas/mínimas diárias e semanais anteriores. Essas são suas principais zonas de oferta e demanda.
  1. Estratégia de integração do modelo:
  • Use as previsões como parte de uma análise mais ampla, não como sinais autônomos
  • Procure por Fair Value Gaps (FVGs) nas faixas de preço previstas. Forneci abaixo o código de um indicador que uso para FVGs em MQL5.
  • Combine as previsões com padrões técnicos como bandeiras, cunhas e consolidações horizontais.
  • Considere as previsões no contexto das localizações de preços diárias, semanais e mensais
  1. Gerenciamento de risco:
  • Implemente stops mais amplos (por exemplo, stop-loss de 10 pontos ou 100 pips para ouro, 50 pips para EURUSD, 65 pips para USDJPY, 60 pips para GBPUSD, 30 pips para AUDUSD/NZDUSD, 40 pips para USDCAD, 0,80 pontos para petróleo, 25 pontos para US500, 75 pontos para NQ, 200 pontos para US30)
  • Use take-profits modestos para parciais (ou seja, recompensa de risco de 1:1 para a primeira parcial (70% da posição inicial), deixe um runner (30% da posição inicial)
  • Dimensione as posições com base nas condições do mercado - boas negociações com muita confluência, 2 a 3x o tamanho da posição básica.
  • Evite negociar durante eventos de notícias de alto impacto
  1. Construção de contexto:
  • Analise a estrutura do mercado em vários períodos de tempo: utilize 5 minutos e 15 minutos - é provável que haja um candle/barra/preço de fechamento ideal para entrar dentro de 1 hora, onde o modelo prevê a entrada em sua direção de negociação.
  • Considere o estado atual do mercado (tendência/alinhamento/consolidação/choppy/reversão) - utilize essas informações para pré-planejar sua hora ideal de negociação. Se o que você previu não estiver acontecendo, procure a próxima oportunidade disponível que o modelo está lhe oferecendo.
  • Procure por confirmações de padrões nas faixas de preço previstas
  • Concentre-se na tendência direcional e nos principais níveis de suporte/resistência
  1. Refinamento de entrada:
  • Aguarde as confirmações estruturais antes de entrar nas negociações. Estruturas que você conhece melhor: topos/fundos duplos, cunhas, bandeiras de touro/urso, topos/fundos MTR, clímaxes, especialmente em torno das principais áreas de suporte e resistência/FVGs.
  • Não entre se você estiver prevendo um canal de tendência. Os canais de tendência são seus piores inimigos. Mesmo que encontre um canal de tendência em um período de tempo mais alto, como 4 horas ou um dia, NÃO CONTRATRE!
  • Procure padrões de consolidação dentro dos intervalos previstos - jogue todas as reversões. Esse modelo realmente se destaca com reversões.
  • Considere a possibilidade de escalonar as posições em vez de fazer entradas de tamanho normal. 25% do tamanho inicial - aumente a escala à medida que o preço for a seu favor até o tamanho total da posição. Não faça scale-in contra sua posição, ou seja, se a posição for contra você.

Algumas observações pessoais adicionais:

  • É preciso estar atento e antecipar certas coisas com esse modelo: As reversões em torno de áreas-chave são as mais lucrativas.
    • Portanto, digamos que o modelo preveja uma mudança de cor em uma determinada barra ou período de tempo. Esse é o momento de começar a prestar atenção. Procure uma confluência extra antes da entrada. Se você não obtiver essa confluência, espere até obtê-la. Mesmo que a cor tenha mudado, a operação ainda pode funcionar. O que quero dizer é que esse é um bom modelo de "timing" do ponto de vista de "quando" você precisa começar a se preocupar e prestar atenção.
  • Esse modelo dá muitos falsos positivos, mas algumas grandes vitórias eliminam todas as perdas ruins.
  • Comece com um par e adicione outro par toda semana. Amplie seus modelos para um total de 10 pares.
  • Você obterá de 2 a 3 grandes negociações toda semana.
  • Preveja um ganho semanal de cerca de 0,5% a 1,5%. Você está arriscando cerca de 1,0% a 2,5% toda semana em todos os pares diferentes. Em outras palavras, você negocia pouco, permanece diversificado em vários instrumentos não correlacionados e se concentra em intervalos de tempo específicos. Você acertará cerca de 3 a 6 instrumentos de forma consistente e isso fará com que você ganhe a maior parte do seu dinheiro. Portanto, não se prenda a uma única negociação nem analise excessivamente um único ponto de dados.
  • Se a mudança prevista estiver relacionada a um evento noticioso, ignore-a e concentre-se em outro par ou aguarde a próxima mudança de sinal de cor.
  • Os canais de tendência são seu pior inimigo - se você sequer suspeitar deles, esqueça o par naquele dia. Como alternativa, faça o oposto do que o modelo está lhe dizendo, pois, caso contrário, você será pego por uma perda de tendência contrária.
  • Negociar com esse modelo é "desconfortável" - você realmente nunca confia nele e sempre tem a sensação de que "essa operação nunca funcionará, é tão contraintuitiva", mas aí está a beleza. Ela faz com que você faça o que não quer fazer, que é a coisa certa a fazer (a coisa que você não quer fazer, mas deve fazer porque é a coisa certa a fazer naquela situação).
  • Conceito de inversões Ocorre em cerca de 20 a 30% das vezes: é quando o modelo está lhe dando uma cor (vermelho ou verde), mas o mercado parece estar sempre fazendo o oposto. Esse é um cenário de inversão - não há nada de errado com o modelo e também não há nada de errado com sua negociação. Você só precisa perceber que ocorreu uma inversão e começar a fazer o oposto ou ignorar o par até que as expectativas se realinhem. Isso geralmente leva de 6 a 10 sessões (cerca de 2 a 4 dias) para que uma inversão se conserte. A maneira mais fácil de identificar uma inversão com esse modelo é usar o script python que eu lhe dei para as previsões do modelo - extraia os dados sequencialmente das últimas 6 sessões (portanto, não extraia os dados mais recentes - faça um lookback). Veja se as previsões estão correspondendo ao real. Se não estiverem, ocorreu uma inversão.

As previsões do modelo devem ser usadas como um componente de sua análise, e não como o único responsável pela tomada de decisões. Ao incorporar esses elementos, você pode potencialmente melhorar a consistência dos resultados de suas negociações ao usar o modelo PatchTST.

Espero que isso ajude.

Fair Value Gap (FVG) Script que mencionei (esses gaps funcionam de forma muito semelhante às zonas de oferta e demanda, em minha experiência):

Muito obrigado por sua resposta paciente e pelo compartilhamento altruísta. Nunca vi respostas tão detalhadas e profissionais antes. Lerei seu artigo várias vezes. Esses conhecimentos são particularmente valiosos para mim. Meus melhores votos para você.
 
Thomas Sawyer #:
Muito obrigado por sua resposta paciente e por seu compartilhamento altruísta. Nunca vi respostas tão detalhadas e profissionais antes. Lerei seu artigo várias vezes. Esses conhecimentos são particularmente valiosos para mim. Meus melhores votos para você.

Muito obrigado. Suas palavras gentis significam muito! Entre em contato se precisar de mais ajuda!