Обсуждение статьи "Использование алгоритма машинного обучения PatchTST для прогноза ценовых движений на следующие 24 часа" - страница 2

 
Я часто обнаруживаю, что предсказанные результаты этой модели не вполне соответствуют реальной ситуации. Я не вносил никаких изменений в код этой модели. Не могли бы вы дать мне какие-нибудь рекомендации? Спасибо.
 
Thomas Sawyer #:
Я часто обнаруживаю, что предсказанные результаты этой модели не вполне соответствуют реальной ситуации. Я не вносил никаких изменений в код этой модели. Не могли бы вы дать мне какие-нибудь рекомендации? Спасибо.

Спасибо, что поделились своим опытом работы с моделью. Вы подняли важный вопрос о согласованности прогнозов. Модель PatchTST лучше всего работает, когда она интегрирована в комплексный торговый подход, учитывающий множество рыночных факторов. Вот как я рекомендую использовать прогнозы модели более эффективно:

  1. Оптимизация временного окна:
  • Сосредоточьтесь на торговле в часы пик (с 6:00 утра до 10:00 утра по центральному времени США).
  • Используйте прогнозы модели преимущественно в эти часы, когда движения рынка более предсказуемы.
  • Обращайте особое внимание на отклонения вокруг предыдущих дневных и недельных максимумов/минимумов. Это ваши основные зоны спроса и предложения.
  1. Стратегия интеграции модели:
  • Используйте прогнозы как часть более широкого анализа, а не как самостоятельные сигналы
  • Ищите разрывы справедливой стоимости (FVG) в прогнозируемых ценовых диапазонах. Ниже я привел код индикатора, который я использую для поиска FVG в MQL5.
  • Сочетайте прогнозы с техническими паттернами, такими как флаги, клинья и горизонтальные консолидации.
  • Рассматривайте прогнозы в контексте дневного, недельного и месячного расположения цен.
  1. Управление рисками:
  • Используйте более широкие стопы (например, 10-пунктовый или 100-пунктовый стоп-лосс для золота, 50 пунктов для EURUSD, 65 пунктов для USDJPY, 60 пунктов для GBPUSD, 30 пунктов для AUDUSD/NZDUSD, 40 пунктов для USDCAD, 0,80 пункта для нефти, 25 пунктов для US500, 75 пунктов для NQ, 200 пунктов для US30).
  • Используйте скромные тейк-профиты для частичных (т.е. 1:1 вознаграждение за риск для первой части (70% от начальной позиции), оставьте бегунок (30% от начальной позиции))
  • Масштабируйте позиции в зависимости от рыночных условий - хорошие сделки с большим количеством слияний, 2 - 3x базовый размер позиции.
  • Избегайте торговли во время высокозначимых новостных событий.
  1. Построение контекста:
  • Анализируйте структуру рынка на нескольких таймфреймах: используйте 5 минут и 15 минут - вероятно, в течение 1 часа существует оптимальная свеча/бар/цена закрытия для входа в рынок, где модель предсказывает вход в вашем направлении торговли.
  • Учитывайте текущее состояние рынка (тренд/ранжирование/консолидация/колебания/разворот) - используйте эту информацию, чтобы заранее спланировать оптимальный торговый час. Если то, что вы ожидаете, не сбывается, ищите следующую доступную возможность, которую дает вам модель.
  • Ищите подтверждения моделей в прогнозируемых ценовых диапазонах.
  • Ориентируйтесь на направленность и основные уровни поддержки/сопротивления.
  1. Уточнение входа:
  • Дождитесь подтверждения структур, прежде чем входить в сделку. Структуры, которые лучше всего знать: двойные вершины/низы, клинья, бычьи/медвежьи флаги, вершины/низы MTR, кульминационные точки, особенно вблизи ключевых областей поддержки и сопротивления/FVG.
  • Не входите в рынок, если вы предвидите трендовый канал. Трендовые каналы - ваши злейшие враги. Даже если вы обнаружили трендовый канал на более высоком таймфрейме, например на 4 часах или одном дне, НЕ ВХОДИТЕ!
  • Ищите модели консолидации в пределах прогнозируемых диапазонов - играйте на каждом развороте. Эта модель действительно сияет на разворотах.
  • Рассмотрите возможность масштабирования позиций вместо полноразмерных входов. Начальный размер 25% - масштабирование по мере того, как цена идет в вашу пользу, вплоть до полного размера позиции. Не масштабируйте против своей позиции, т. е. если позиция идет против вас.

Некоторые дополнительные личные наблюдения:

  • При работе с этой моделью нужно быть внимательным и предугадывать определенные вещи: Развороты вокруг ключевых областей являются наиболее прибыльными.
    • Скажем, модель предсказывает изменение цвета для определенного бара или таймфрейма. Это время, чтобы начать обращать внимание. Ищите еще 1 дополнительное слияние перед входом. Если вы не получаете это стечение, подождите, пока не получите его, даже если цвет сменился, сделка все равно может сработать. Я хочу сказать, что это хорошая "временная" модель с точки зрения того, "когда" вам нужно начать проявлять заботу и внимание.
  • Эта модель дает много ложных срабатываний, но несколько крупных выигрышей сводят на нет все убытки.
  • Начните с 1 пары и добавляйте еще одну пару каждую неделю. Масштабируйте свои модели до 10 пар.
  • Каждую неделю вы будете получать 2 - 3 крупные сделки.
  • Ожидайте еженедельную прибыль в размере 0,5 - 1,5 %. Вы рискуете примерно 1,0 - 2,5 % каждую неделю по всем парам. Другими словами, вы торгуете небольшими суммами, сохраняете диверсификацию по нескольким некоррелированным инструментам и фокусируетесь на определенных временных диапазонах. Вы будете постоянно правильно торговать примерно 3-6 инструментами, и это принесет вам большую часть денег. Поэтому не зацикливайтесь на одной сделке и не анализируйте одну точку данных.
  • Если прогнозируемое изменение связано с новостным событием, пропустите его и сосредоточьтесь на другой паре или дождитесь следующего сигнала о смене цвета.
  • Трендовые каналы - ваш злейший враг: если вы даже подозреваете о них - забудьте об этой паре на этот день. Как вариант, делайте противоположное тому, что говорит вам модель, потому что иначе вы попадете в контртренд и проиграете.
  • Торговля по этой модели "неудобна" - вы действительно никогда не доверяете ей, и вам постоянно кажется, что "эта сделка никогда не сработает, она настолько контринтуитивна", но в этом и заключается ее прелесть. Она заставляет вас делать то, что вы не хотите делать, но это правильное действие (то, что вы не хотите делать, но должны сделать, потому что это правильное действие в данной ситуации).
  • Концепция инверсий встречается ~20-30 % времени: это когда модель дает вам один цвет (красный или зеленый), но рынок, кажется, всегда делает противоположное. Это сценарий инверсии - в модели нет ничего плохого, и в вашей торговле тоже нет ничего плохого. Вы просто должны осознать, что произошла инверсия, и начать действовать в противоположном направлении или вообще пропустить пару, пока ожидания не выровняются. Обычно для исправления инверсии требуется 6 - 10 сессий (около 2 - 4 дней). Самый простой способ выявить инверсию с помощью этой модели - использовать скрипт python, который я дал вам для прогнозов модели, - последовательно взять данные за последние 6 сессий (поэтому не берите самые последние данные - сделайте обратный просмотр). Посмотрите, совпадают ли прогнозы с фактическими данными. Если нет - произошла инверсия.

Прогнозы модели должны использоваться как один из компонентов вашего анализа, а не как единственное средство принятия решений. Приняв во внимание эти элементы, вы сможете потенциально улучшить согласованность результатов торговли при использовании модели PatchTST.

Надеюсь, это поможет.

Скрипт гэпа справедливой стоимости (FVG), о котором я упоминал (по моему опыту, эти гэпы работают очень похоже на зоны спроса и предложения):

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

input bool ShowMidpoint = false; // Show Midpoint Line
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;  // Process all available data
    }
    else
    {
        start = prev_calculated - 1;  // Process only new bars
    }

    for (int i = start; i >= 2; i--)  // Ensure we have at least 3 bars
    {
        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; // Ensure we have enough bars

    if (close[index - 1] > open[index - 1] && high[index - 2] < low[index])
    {
        // Up close candle condition and gap exists
        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])
    {
        // Down close candle condition and gap exists
        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 #:

Спасибо за интерес! Да, эти изменения параметров в принципе будут работать, но есть несколько важных соображений при переходе на данные M1:

1. Объем данных: Обучение на данных M1 длительностью 10080 минут (1 неделя) означает обработку значительно большего количества точек данных, чем в случае с H1. Это приведет к:

  • Значительно увеличит время обучения
  • Потребуется больше памяти
  • Потенциально необходимо GPU-ускорение для эффективного обучения

2. Корректировка архитектуры модели: На шаге 8 обучения модели и шаге 4 кода предсказания, возможно, потребуется настроить другие параметры, чтобы учесть большую входную последовательность:

3. Качество предсказания: Хотя вы получите более детальные предсказания, имейте в виду, что данные M1 обычно содержат больше шума. Возможно, вам захочется поэкспериментировать с различными длинами последовательностей и окнами предсказаний, чтобы найти оптимальный баланс.

Спасибо за понимание. Мой компьютер достаточно мощный, с 256 ГБ и 64 физическими ядрами. Однако ему не помешал бы лучший GPU.

Как только я обновлю GPU, я попробую обновленные настройки конфигурации.

 
Shashank Rai #:

Спасибо, что поделились своим опытом работы с моделью. Вы подняли важный вопрос о согласованности прогнозов. Модель PatchTST лучше всего работает, когда она интегрирована в комплексный торговый подход, учитывающий множество рыночных факторов. Вот как я рекомендую использовать прогнозы модели более эффективно:

  1. Оптимизация временных окон:
  • Сосредоточьтесь на торговле в часы пик (с 6:00 до 10:00 по центральному времени США).
  • Используйте прогнозы модели преимущественно в эти часы, когда движения рынка более предсказуемы.
  • Обращайте особое внимание на отклонения вокруг предыдущих дневных и недельных максимумов/минимумов. Это ваши основные зоны спроса и предложения.
  1. Стратегия интеграции модели:
  • Используйте прогнозы как часть более широкого анализа, а не как самостоятельные сигналы.
  • Ищите разрывы справедливой стоимости (FVG) в прогнозируемых ценовых диапазонах. Ниже я привел код индикатора, который я использую для поиска FVG в MQL5.
  • Сочетайте прогнозы с техническими паттернами, такими как флаги, клинья и горизонтальные консолидации.
  • Рассматривайте прогнозы в контексте дневных, недельных и месячных ценовых диапазонов
  1. Управление рисками:
  • Используйте более широкие стопы (например, 10-пунктовый или 100-пунктовый стоп-лосс для золота, 50 пунктов для EURUSD, 65 пунктов для USDJPY, 60 пунктов для GBPUSD, 30 пунктов для AUDUSD/NZDUSD, 40 пунктов для USDCAD, 0,80 пункта для нефти, 25 пунктов для US500, 75 пунктов для NQ, 200 пунктов для US30).
  • Используйте скромные тейк-профиты для частичных (т.е. 1:1 вознаграждение за риск для первой части (70% от начальной позиции), оставьте бегунок (30% от начальной позиции))
  • Масштабируйте позиции в зависимости от рыночных условий - хорошие сделки с большим количеством слияний, 2 - 3x базовый размер позиции.
  • Избегайте торговли во время высокозначимых новостных событий
  1. Построение контекста:
  • Анализируйте структуру рынка на нескольких таймфреймах: используйте 5 минут и 15 минут - вероятно, в течение 1 часа существует оптимальная свеча/бар/цена закрытия для входа в рынок, где модель предсказывает вход в вашем направлении торговли.
  • Учитывайте текущее состояние рынка (тренд/развитие/консолидация/колебания/разворот) - используйте эту информацию, чтобы заранее спланировать оптимальный торговый час. Если то, что вы ожидаете, не сбывается, ищите следующую доступную возможность, которую дает вам модель.
  • Ищите подтверждения моделей в прогнозируемых ценовых диапазонах.
  • Ориентируйтесь на направленность и основные уровни поддержки/сопротивления
  1. Уточнение входа:
  • Дождитесь структурных подтверждений перед входом в сделку. Структуры, которые лучше всего знать: двойные вершины/низы, клинья, бычьи/медвежьи флаги, вершины/низы MTR, кульминационные точки, особенно вблизи ключевых областей поддержки и сопротивления/FVG.
  • Не входите в рынок, если вы предвидите трендовый канал. Трендовые каналы - ваши злейшие враги. Даже если вы обнаружили трендовый канал на более высоком таймфрейме, например на 4 часах или одном дне, НЕ ВХОДИТЕ!
  • Ищите модели консолидации в пределах прогнозируемых диапазонов - играйте на каждом развороте. Эта модель действительно сияет на разворотах.
  • Рассмотрите возможность масштабирования позиций вместо полноразмерных входов. Начальный размер 25% - масштабирование по мере того, как цена идет в вашу пользу, вплоть до полного размера позиции. Не масштабируйте против своей позиции, т. е. если позиция идет против вас.

Некоторые дополнительные личные наблюдения:

  • При работе с этой моделью нужно быть внимательным и предугадывать определенные вещи: Развороты вокруг ключевых областей являются наиболее прибыльными.
    • Скажем, модель предсказывает изменение цвета для определенного бара или таймфрейма. Это время, чтобы начать обращать внимание. Ищите еще 1 дополнительное слияние перед входом. Если вы не получаете это стечение, подождите, пока не получите его, даже если цвет сменился, сделка все равно может сработать. Я хочу сказать, что это хорошая "временная" модель с точки зрения того, "когда" вам нужно начать проявлять заботу и внимание.
  • Эта модель дает много ложных срабатываний, но несколько крупных выигрышей сводят на нет все убытки.
  • Начните с 1 пары и добавляйте еще одну пару каждую неделю. Масштабируйте свои модели до 10 пар.
  • Каждую неделю вы будете получать 2 - 3 крупные сделки.
  • Ожидайте еженедельную прибыль в размере 0,5 - 1,5 %. Вы рискуете примерно 1,0 - 2,5 % каждую неделю по всем парам. Другими словами, вы торгуете небольшими суммами, сохраняете диверсификацию по нескольким некоррелированным инструментам и фокусируетесь на определенных временных диапазонах. Вы будете постоянно правильно торговать примерно 3-6 инструментами, и это принесет вам большую часть денег. Поэтому не зацикливайтесь на одной сделке и не анализируйте одну точку данных.
  • Если прогнозируемое изменение связано с новостным событием, пропустите его и сосредоточьтесь на другой паре или дождитесь следующего сигнала о смене цвета.
  • Трендовые каналы - ваш злейший враг: если вы даже подозреваете о них - забудьте об этой паре на этот день. Как вариант, делайте противоположное тому, что говорит вам модель, потому что иначе вы попадете в контртренд и проиграете.
  • Торговля по этой модели "неудобна" - вы действительно никогда не доверяете ей, и вам постоянно кажется, что "эта сделка никогда не сработает, она настолько контринтуитивна", но в этом и заключается ее прелесть. Она заставляет вас делать то, что вы не хотите делать, но это правильное действие (то, что вы не хотите делать, но должны сделать, потому что это правильное действие в данной ситуации).
  • Концепция инверсий встречается ~20-30 % времени: это когда модель дает вам один цвет (красный или зеленый), но рынок, кажется, всегда делает противоположное. Это сценарий инверсии - в модели нет ничего плохого, и в вашей торговле тоже нет ничего плохого. Вы просто должны осознать, что произошла инверсия, и начать действовать в противоположном направлении или вообще пропустить пару, пока ожидания не выровняются. Обычно для исправления инверсии требуется 6 - 10 сессий (около 2 - 4 дней). Самый простой способ выявить инверсию с помощью этой модели - использовать скрипт python, который я дал вам для прогнозов модели, - последовательно взять данные за последние 6 сессий (поэтому не берите самые последние данные - сделайте обратный просмотр). Посмотрите, совпадают ли прогнозы с фактическими данными. Если нет - произошла инверсия.

Прогнозы модели должны использоваться как один из компонентов вашего анализа, а не как единственное средство принятия решений. Учет этих элементов позволит вам улучшить согласованность результатов торговли при использовании модели PatchTST.

Надеюсь, это поможет.

Скрипт гэпа справедливой стоимости (FVG), о котором я упоминал (по моему опыту, эти гэпы работают очень похоже на зоны спроса и предложения):

Большое спасибо за ваш терпеливый ответ и бескорыстное участие. Я никогда раньше не встречал таких подробных и профессиональных ответов. Я буду перечитывать вашу статью неоднократно. Эти знания особенно ценны для меня. С наилучшими пожеланиями.
 
Thomas Sawyer #:
Большое спасибо за ваш терпеливый ответ и бескорыстное участие. Я никогда раньше не встречала таких подробных и профессиональных ответов. Я буду перечитывать вашу статью неоднократно. Эти знания особенно ценны для меня. С наилучшими пожеланиями.

Спасибо. Ваши добрые слова очень много значат! Пожалуйста, обращайтесь, если вам понадобится дополнительная помощь!