English
preview
Метаразметка классических стратегий (Часть 1): Фильтрация сделок по RSI и определение размера позиций

Метаразметка классических стратегий (Часть 1): Фильтрация сделок по RSI и определение размера позиций

MetaTrader 5 — Примеры |
48 0
Patrick Murimi Njoroge
Patrick Murimi Njoroge

Содержание

  1. Введение
  2. Почему индикатор RSI не работает на рынке с выраженным трендом
  3. Концепция метаразметки
  4. Конструирование признаков на сигнальном баре
  5. Схема валидации с продвижением вперед по времени
  6. Результаты: три варианта стратегии
  7. Вывод о просадке
  8. Заключение:
  9. Прикрепленные файлы


Введение

Индикатор RSI генерирует сигнал каждый раз, когда его значение пересекает пороговое значение. При этом он не учитывает, благоприятствуют ли текущие рыночные условия сделке в расчете на возврат к среднему. На боковом рынке этот вопрос менее важен, поскольку данная предпосылка в целом выполняется на протяжении всего периода. На трендовом рынке, где каждый новый экстремум обусловлен структурными факторами, а не временными колебаниями, генерация сигналов при каждом пересечении порога приводит к систематическим, нарастающим убыткам независимо от того, насколько хорошо настроены параметры индикатора.

Эту проблему напрямую решает подход метаразметки, описанный в главе 3 книги Маркоса Лопеса де Прадо «Advances in Financial Machine Learning». Первичная модель (в данном случае — стратегия RSI) продолжает генерировать сигналы о направлении сделки точно так же, как и раньше. Вторичный классификатор получает каждый сигнал вместе с двадцатью семью значениями контекстных признаков, зафиксированными на сигнальном баре. Он выдает вероятность того, что сделка по этому сигналу окажется успешной. Сигналы, для которых уверенность классификатора ниже порога, пропускаются; размер позиции по одобренным сигналам масштабируется в зависимости от уверенности классификатора. Первичная модель отвечает за прогноз направления позиции. Вторичная модель отвечает за определение целесообразности сделки и какого размера должна быть позиция.

В этой статье описана реализация конвейера обработки на данных EURUSD H1 из MetaTrader 5 за семь лет. В разделе 2 количественно оценивается проблема неэффективности RSI; в разделах 3–5 описываются методология, признаки и валидация; в разделах 6–7 приводятся результаты. В сопутствующей статье этой серии, посвященной MQL5, реализована архитектура исполнения сделок с двумя советниками, которая позволяет использовать эти результаты Python в системе реальной торговли.

Эта статья — первая часть серии «Метаразметка классических стратегий». Конвейер основан на методах, разработанных в сериях «Схема машинного обучения для MetaTrader 5» и «Конструирование признаков для машинного обучения»: разметка методом тройного барьера рассматривается в части 2 серии «Схема машинного обучения для MetaTrader 5»; определение размера позиции — в части 10 той же серии; а используемое здесь кодирование временных признаков — в части 3 серии «Конструирование признаков для машинного обучения».


RSI — это инструмент возврата к среднему, основанный на предположении, что за ценовыми движениями следуют корректирующие движения. Когда это предположение выполняется — на боковом рынке, где цена после достижения экстремумов действительно возвращается к среднему, — индикатор работает так, как задумано. Когда это предположение не выполняется — в условиях тренда, где каждый новый экстремум обусловлен структурными факторами, — индикатор механически выдает сигналы в ситуациях, к которым его базовая предпосылка неприменима.

Наиболее наглядную иллюстрацию в наборе данных представляет 2022 календарный год. Агрессивный цикл повышения ставок Федеральной резервной системы привел к снижению курса EURUSD примерно с 1.13 в январе 2022 года до минимума около 0.96 к сентябрю — направленному движению на 1 700 пипсов за девять месяцев. RSI неоднократно пересекал порог перепроданности во время откатов в рамках этого снижения, формируя сигналы на покупку на барах, после которых цена продолжала снижаться. Сигналы не были ошибочными с точки зрения среднесрочного направления. Они не сработали, потому что правило «перепроданность означает разворот» не действует в условиях структурного нисходящего тренда.

На рисунке 1, в части (c), это следствие представлено наглядно. Простая стратегия на основе RSI дала результат −625 пипсов по итогам 576 сделок за трехлетний период тестирования с января 2022 года по декабрь 2024 года; максимальная просадка составила 1 392 пипса и была достигнута в конце 2022 года. Частичное восстановление в 2023–2024 годах, заметное на кривой капитала, отражает возвращение рынка к более выраженному боковому режиму — однако к тому моменту убытки за трендовый период уже накопились.

Сигналы RSI и их подмножество, одобренное моделью машинного обучения, — EURUSD H1

Рисунок 1. Иллюстрация из трех панелей, демонстрирующая поведение сигналов RSI на данных EURUSD H1 (MT5, январь 2018 г. — декабрь 2024 г.)

  • Панель (a): цена EURUSD на H1 со всеми сигналами пересечения порога RSI (полые маркеры) и подмножеством сигналов, одобренных моделью машинного обучения (закрашенные маркеры). Пунктирная вертикальная линия обозначает границу между обучающей и тестовой выборками в январе 2022 года. Резкое снижение в 2022 году характеризует рыночный режим, который приводит к наихудшим результатам стратегии возврата к среднему.
  • Панель (b): индикатор RSI(14) с заштрихованными зонами перекупленности и перепроданности за период тестирования. На протяжении 2022 года индикатор часто подает сигналы; одна лишь плотность сигналов не позволяет отличить прибыльные сигналы от убыточных, обусловленных рыночным режимом.
  • Панель (c): накопленная прибыль/убыток простой стратегии на основе RSI за период тестирования. Кривая капитала достигает своего минимума в конце 2022 года, после чего частично восстанавливается по мере завершения трендового режима.


Концепция метаразметки

Метаразметка, описанная в главе 3 книги AFML, разделяет два решения, которые стандартные стратегии объединяют в одно. Первичная модель отвечает на вопрос: в каком направлении следует открыть позицию? Вторичная модель отвечает на другой вопрос: следует ли вообще открывать эту позицию, и если да, то какого размера? Разделение этих решений позволяет для каждого использовать наиболее подходящий инструмент.

Правило пересечения порога RSI служит первичной моделью. Задаваемое им направление позиции — длинная позиция при пересечении RSI порога перепроданности снизу вверх и короткая при пересечении порога перекупленности сверху вниз — принимается как данность. Вторичная модель — классификатор на основе случайного леса — получает данные о каждом событии пересечения порога вместе с двадцатью семью показателями рыночного контекста, рассчитанными на сигнальном баре. Целевая переменная при обучении — двоичная метка, полученная с помощью разметки методом тройного барьера: +1, если в результате сделки первым был достигнут барьер фиксации прибыли, и -1, если первым был достигнут барьер ограничения убытка либо сделка завершилась по истечении предельного времени удержания с отрицательной доходностью.

На этапе вывода вторичная модель выдает оценку вероятности p того, что сделка относится к положительному классу. Из этого единственного числа вытекают три решения:

  1. Фильтрация. Если p < 0.55, сигнал пропускается. Порог 0.55 допускает сигналы с номинальным положительным преимуществом по оценке модели, не требуя при этом высокой уверенности в прогнозах.
  2. Направление. Наследуется от первичной модели RSI. Вторичный классификатор не меняет направление позиции; он лишь определяет, совершать ли сделку и каким должен быть размер позиции.
  3. Размер позиции. Размер позиции линейно увеличивается от нуля при p = 0.5 до полного размера при p = 1.0. На практике оценки вероятности, выдаваемые моделью в тестовый период, сосредоточены в диапазоне от 0.55 до 0.70, что дает умеренные, но систематические различия в размерах позиций по одобренным сделкам.

Определение размера позиции следует подходу на основе вероятностей из части 10 «Blueprint», где функция определения размера позиции выводится из формулы размера позиции при лимитной цене, приведенной в главе 10 AFML:

bet_size = clip((p - 0.5) / 0.5, 0, 1)

Эта функция линейно отображает p ∈ [0.5; 1.0] на интервал [0; 1] и заменяет все отрицательные значения нулем, так что при вероятности ниже точки безразличия 0.5 размер позиции равен нулю.


Конструирование признаков на сигнальном баре

Метаклассификатор, который просто запоминает, какие из прошлых сигналов RSI оказались успешными, не является полезной вторичной моделью. Он должен выявлять устойчивые закономерности связи рыночных условий с качеством сигналов RSI, которые можно обобщить на новые данные. Используемые здесь двадцать семь признаков делятся на две группы: одиннадцать признаков цены и волатильности, рассчитываемых по данным OHLCV, и шестнадцать временных признаков, формируемых функцией get_time_features из части 3 «Конструирование признаков». Каждый признак рассчитывается на всей истории баров, а его значение извлекается в момент появления каждого сигнала.

Признаки цены и волатильности


Признак Расчет Значение для качества сигналов RSI
rsi_depth Уровень RSI на сигнальном баре Пересечение порога при RSI 21 указывает на более глубокое отклонение в рамках гипотезы возврата к среднему, чем при RSI 29; этот уровень отражает, насколько экстремальным было значение индикатора до пересечения порога.
rsi_mom Разность значений RSI с интервалом в 3 бара Быстрый скачок с 22 до 34 принципиально отличается от медленного подъема с 29 до 31. Скорость пересечения порога отражает импульс на момент входа, который нельзя определить только по уровню RSI.
adx ADX(14) Сигналы RSI на возврат к среднему чаще всего не срабатывают при высоких значениях ADX. Показание индикатора, указывающее на сильный тренд, — наиболее явный контекстный аргумент против попытки торговать разворот.
atr ATR(14) Задает масштаб волатильности. Используется для нормализации признаков, характеризующих ценовые расстояния, чтобы они оставались сопоставимыми при разных рыночных режимах.
vol_ratio ATR(14) / среднее значение ATR за 50 баров Сигналы, возникающие во время всплесков волатильности, как правило, обусловлены шумом. Значение отношения выше 1.5 указывает на условия повышенной волатильности, в которых предпосылки возврата к среднему менее надежны.
mom5 Доходность за 5 баров по ценам закрытия Краткосрочный ценовой импульс, подтверждающий направление сигнала RSI или противоречащий ему.
trend_vel Разность значений EMA(50) с интервалом в 5 баров Скорость и направление основного тренда показывают модели, насколько сильному структурному противодействию подвергается сигнал разворота.
trend_stretch (цена закрытия - EMA50) / ATR Если цена значительно отклонилась от своего среднего за 50 баров, измеренного в единицах ATR, она действительно может рассматриваться как кандидат на возврат к среднему; если же цена близка к среднему, оснований для этого нет.
dist_high (максимум за 20 баров - цена закрытия) / ATR Если сигнал возникает вблизи недавнего структурного максимума, потенциал движения цены вверх для длинной позиции ограничен.
dist_low (цена закрытия - минимум за 20 баров) / ATR Аналогичный показатель для короткой позиции: близость к недавнему минимуму сужает ожидаемое распределение доходности.
above_ema50 1, если цена закрытия &gt; EMA50, иначе 0 Двоичное кодирование направления тренда. Включено в диагностических целях; см. обсуждение ниже.

Временные признаки


Один столбец с целым числом, обозначающим час, который обычно присутствует в стандартных наборах признаков, здесь заменен шестнадцатью признаками, полученными с помощью функции get_time_features(df, timeframe="H1"). Функция применяет частотный фильтр H1: для каждой циклической переменной используется только одна пара sin/cos, а столбцы календарных эффектов исключаются при внутридневном временном разрешении.

Группа Столбцы Что они кодируют
Фурье — час hour_sin, hour_cos Час суток, отображенный на единичной окружности (T = 24). Часы 23 и 0 геометрически соседствуют — представление часа обычным целым числом разрушает эту топологию.
Фурье — день недели dayofweek_sin, dayofweek_cos Цикл дней недели (T = 7). Граница между открытием и закрытием торговой недели отображена правильно.
Фурье — номер дня в году dayofyear_sin, dayofyear_cos Годовой сезонный цикл (T = 366). Учитывает общие сезонные закономерности, такие как летние периоды низкой волатильности и потоки капитала институциональных инвесторов в конце года.
Флаги торговых сессий sydney_session, tokyo_session, london_session, ny_session, session_overlap Бинарные индикаторы для каждой из четырёх основных сессий на рынке Форекс и периодов их перекрытия. Фиксированные временные границы по UTC: Сидней 21:00–06:00, Токио 00:00–09:00, Лондон 07:00–16:00, Нью-Йорк 13:00–22:00.
Волатильность сессии sydney_session_vol, tokyo_session_vol, london_session_vol, ny_session_vol, session_overlap_vol Скользящее стандартное отклонение логарифмической доходности за 20 баров с маскированием по каждой сессии, с заполнением пропусков последним известным значением и сдвигом на один бар. Отражает степень активности каждой сессии в последнее время, а не просто то, идёт ли она в данный момент.

Бинарный флаг положения цены относительно трендовой средней (above_ema50) получил важность 0.1 % — самую низкую среди всех признаков в наборе. Та же информация о направлении, выраженная наклоном как непрерывной величиной (trend_vel), получила важность 4.6 %. Та же закономерность наблюдается и во временном измерении: на пять бинарных флагов торговых сессий в совокупности приходится 2.5 % общей важности, а на пять столбцов волатильности сессий — 25.6 %. Признаки, отражающие величину, неизменно превосходят по важности бинарные флаги наличия.

Важность признаков — метамодель на основе случайного леса (MDI, 27 признаков)

Рисунок 2. Ранжирование признаков по важности в метамодели на основе случайного леса (MDI) с цветовой кодировкой по группам признаков

  • Синие столбцы: признаки цены и волатильности. Расстояние до максимума за 20 баров (6.9 %) занимает первое место в общем рейтинге, опережая импульс RSI (6.1 %); удалённость цены от недавнего структурного экстремума имеет такое же значение, как и скорость пересечения порога RSI.
  • Фиолетовые столбцы: циклические признаки Фурье. Косинус дня года занимает третье место в общем рейтинге с важностью 6.1 %; годовая сезонность несёт больше информации в расчёте на один признак, чем любой отдельный флаг внутридневной торговой сессии.
  • Бирюзовые столбцы: признаки волатильности сессий. Четыре из пяти входят в первую десятку; в совокупности на них приходится 25.6 % общей важности признаков — в десять раз больше, чем на флаги торговых сессий.
  • Коричневые столбцы: бинарные флаги торговых сессий. Все пять занимают места в последней шестерке.
  • Красный столбец: бинарный флаг положения цены относительно трендовой средней (above_ema50) — важность 0.1 %, последнее место в наборе.

Реализация

def compute_features(df: pd.DataFrame) -> pd.DataFrame:
    rsi   = _compute_rsi(df["close"])
    atr   = _compute_atr(df["high"], df["low"], df["close"])
    ema50 = df["close"].ewm(span=50, min_periods=50).mean()

    price = pd.DataFrame(index=df.index)
    price["rsi_depth"]     = rsi
    price["rsi_mom"]       = rsi.diff(3)
    price["adx"]           = _compute_adx(df["high"], df["low"], df["close"])
    price["atr"]           = atr
    price["vol_ratio"]     = atr / atr.rolling(50).mean()
    price["mom5"]          = df["close"].pct_change(5)
    price["trend_vel"]     = ema50.diff(5)
    price["trend_stretch"] = (df["close"] - ema50) / atr
    price["dist_high"]     = (df["high"].rolling(20).max() - df["close"]) / atr
    price["dist_low"]      = (df["close"] - df["low"].rolling(20).min()) / atr
    price["above_ema50"]   = (df["close"] > ema50).astype(int)

    time = get_time_features(df, timeframe="H1")  # 16 cols: Fourier + sessions + vols
    return pd.concat([price, time], axis=1, join="inner")


Схема валидации с продвижением вперед по времени

Протокол валидации намеренно сделан строгим. Информация из тестового периода не использовалась ни на одном этапе построения модели: ни для отбора признаков, ни для настройки порогов, ни для выбора периода RSI, равного 14 (согласно исходной спецификации Уайлдера).

Набор данных выгружен из MetaTrader 5 и содержит 43 103 часовых бара EURUSD (H1) за период с января 2018 года по декабрь 2024 года без артефактов в виде баров с нулевым диапазоном. Для расчета издержек по каждой сделке используются значения из столбца спреда в выгрузке MT5, а не фиксированное допущение; медианный спред по всему набору данных составляет 0.90 пипса. Дата разделения — 1 января 2022 года:

  • Период обучения: январь 2018 г. – декабрь 2021 г. (4 года). 790 размеченных сигналов после удаления строк со значениями признаков NaN на границе периода прогрева.
  • Тестовый период: январь 2022 г. – декабрь 2024 г. (3 года). 576 размеченных сигналов, все — вне обучающей выборки. Этот период включает цикл ужесточения денежно-кредитной политики ФРС в 2022 году, стабилизацию в 2023 году и консолидацию в 2024 году — три различных рыночных режима в рамках одного тестового окна.

Доля верных классификаций на отложенной тестовой выборке составляет 48 %, что ниже уровня случайного угадывания. Это важно, поскольку основной тезис статьи заключается не в том, что метаклассификатор способен надежно выявлять прибыльные сигналы RSI, а в том, что даже слабый классификатор в сочетании с определением размера позиции пропорционально уверенности классификатора может существенно сократить убытки от систематически убыточного первичного сигнала. Вывод о просадке, приведенный в разделе 7, остается в силе независимо от доли верных классификаций, поскольку механизм носит структурный, а не прогнозный характер.

Для разметки методом тройного барьера используются симметричные уровни фиксации прибыли и ограничения убытка на расстоянии 1.5 × ATR(14) от цены входа при максимальном периоде удержания позиции 24 бара. Из прибыли/убытка по каждой сделке вычитается фактический спред на соответствующем сигнальном баре.

# Walk-forward split — tz-naive index from MT5 export
SPLIT_DATE   = pd.Timestamp("2022-01-01")
train_labels = labels[labels.index <  SPLIT_DATE]
test_labels  = labels[labels.index >= SPLIT_DATE]

feat_clean = feat[FEATURE_COLS].dropna()
X_train = feat_clean.loc[train_labels.index.intersection(feat_clean.index)]
y_train = train_labels.loc[X_train.index, "label"]
X_test  = feat_clean.loc[test_labels.index.intersection(feat_clean.index)]
y_test  = test_labels.loc[X_test.index,  "label"]


Результаты: три варианта стратегии

Тестирование на исторических данных проводится на 576 сигналах тестового периода с параллельным учетом результатов трех вариантов стратегии. Величина спреда на каждом сигнальном баре берется из столбца spread в файле экспорта MT5.

Вариант стратегии Сделки Процент выигрышных сделок Средняя прибыль Средний убыток Коэффициент прибыльности Суммарная прибыль/убыток Максимальная просадка
Стандартный RSI 576 49.3 % +29.8 пипса -31.1 пипса 0.93 -625 пипсов -1 392 пипса
С метаразметкой 121 43.0 % +28.7 пипса -30.0 пипса 0.72 -577 пипсов -593 пипса
Метаразметка + адаптивный размер позиции 121 43.0 % +4.3 пипса -4.5 пипса 0.72 -86 пипсов -96 пипсов

Три наблюдения стоит сформулировать точно.

Во-первых, доля прибыльных сделок при использовании метаразметки (43.0 %) ниже, чем у исходной стратегии RSI (49.3 %). На тестовой выборке фильтр не смог отобрать более качественное подмножество сделок. Доля верных классификаций модели на тестовой выборке составляет 48 % (ниже уровня случайного угадывания), а фактическая доля прибыльных сделок среди одобренных оказалась ниже, чем для полного набора сигналов. Это указано прямо, поскольку аргументация статьи не зависит от того, насколько точно работает классификатор.

Во-вторых, общая прибыль/убыток улучшилась лишь незначительно при переходе от исходной стратегии RSI к варианту с метаразметкой (с -625 до -577 пипсов), несмотря на исключение 455 из 576 сделок. Вклад фильтра в прибыль/убыток минимален. Его вклад в снижение просадки существенен: максимальная просадка сократилась с 1 392 до 593 пипсов, то есть на 57 %, исключительно за счет уменьшения рыночной экспозиции.

В-третьих, последующее определение размера позиции сократило убыток с -577 до -86 пипсов — на 85 % по сравнению с базовым вариантом с метаразметкой — и уменьшило максимальную просадку с 593 до 96 пипсов. Оба сокращения носят структурный характер. Это достигается за счет масштабирования размера позиций с помощью коэффициента из интервала [0, 1], что позволяет уменьшить глубину просадки даже в том случае, если стратегия остается убыточной.

Кривые капитала трех вариантов стратегии — исходная RSI, RSI с метаразметкой и RSI с метаразметкой и адаптивным размером позиции

Рисунок 3. Накопленная прибыль/убыток по трем вариантам стратегии — тестовый период EURUSD H1 (январь 2022 г. — декабрь 2024 г.)

  • Оранжевый: исходная стратегия RSI — все 576 сигналов с полным размером позиции. Итоговый результат — -625 пипсов; максимальная просадка — -1 392 пипса в трендовый период 2022 года.
  • Синий: RSI с метаразметкой — одобрен 121 из 576 сигналов с полным размером позиции. Итоговый результат — -577 пипсов; максимальная просадка сократилась до -593 пипсов.
  • Зелёный: стратегия с метаразметкой и адаптивным размером позиции — тот же 121 сигнал, размер позиции масштабируется по формуле clip((p - 0.5) / 0.5, 0, 1). Итоговый результат — -86 пипсов; максимальная просадка — -96 пипсов.


Вывод о просадке

Наиболее значимый для практической торговли результат — суммарное снижение просадки на 93 % и неравномерный вклад двух этапов в это снижение.

Переход от исходной стратегии RSI (576 сделок) к стратегии с метаразметкой (121 сделка) снизил максимальную просадку с 1 392 до 593 пипсов — на 57 %. Это снижение пропорционально сокращению рыночной экспозиции: меньшее число совершаемых сделок ограничивает глубину просадки в любой отдельной серии убыточных сделок. Эта зависимость носит механический характер и сохраняется независимо от доли верных классификаций.

Добавление определения размера позиции снизило максимальную просадку с 593 до 96 пипсов — ещё на 84 % относительно базового варианта с фильтрацией и в общей сложности на 93 % относительно исходной стратегии RSI. Итоговая прибыль/убыток варианта с адаптивным размером позиции составляет -86 пипсов, что означает сокращение убытка на 86 % по сравнению с -625 пипсами у исходной стратегии RSI.

Снижение просадки в трёх вариантах стратегии

Рисунок 4. Иллюстрация из двух панелей, показывающая снижение просадки в трёх вариантах стратегии (тестовый период)

  • Панель (a): временной ряд просадки. Зелёная линия (метаразметка + адаптивный размер позиции) остаётся в узком диапазоне на протяжении всего трёхлетнего тестового периода, включая трендовый рыночный режим 2022 года, при котором просадка исходной стратегии RSI достигла максимума в -1 392 пипса.
  • Панель (b): максимальная просадка по вариантам стратегии. Суммарное снижение на 93 % обусловлено двумя независимыми механизмами: сокращением числа сделок (фильтрация) и уменьшением размера позиций (определение размера позиции).

Механизм каждого этапа отличается в одном важном аспекте. Фильтр сокращает количество открываемых позиций, но каждая одобренная сделка по-прежнему открывается в полном объеме. Серия из четырёх подряд убыточных сделок, одобренных фильтром и открытых в полном объёме, всё равно приводит к просадке, соразмерной четырём убыткам при полном размере позиции. Определение размера позиции меняет ситуацию: при средней уверенности классификатора 60 % каждая сделка открывается в объёме 20 % от полного размера позиции, поэтому та же серия из четырёх подряд убыточных сделок приводит к просадке глубиной лишь 20 % от исходной. Эти два механизма действуют мультипликативно, а не аддитивно, поэтому совокупное снижение (93 %) превышает снижение за счёт каждого из них по отдельности.

Для счета, финансируемого проп-фирмой, это наиболее значимый с практической точки зрения вывод. Правила для счета, финансируемого проп-фирмой, учитывают глубину просадки, а не совокупную прибыль/убыток за многолетний период. Стратегия, завершившая период с убытком 86 пипсов и максимальной просадкой не более 96 пипсов, укладывается в правила счета, финансируемого проп-фирмой, тогда как исходную стратегию RSI по этим же правилам пришлось бы остановить уже во время первой затяжной серии убытков в 2022 году.


Заключение:

RSI — это генератор сигналов, а не полноценная торговая система. Он задаёт предпосылку для выбора направления сделки — возврат к среднему при экстремальных значениях индикатора, — но не показывает, оправдана ли эта предпосылка в рыночных условиях на момент каждого сигнала. Методология метаразметки из главы 3 книги AFML разделяет эти два решения: RSI определяет направление сделки, а вторичный классификатор — целесообразность её совершения.

На данных EURUSD H1 за трёхлетний период тестирования, включавший цикл ужесточения денежно-кредитной политики ФРС в 2022 году — самые неблагоприятные в этом наборе данных условия для стратегии возврата к среднему, — сравнение трёх вариантов стратегии дало следующие результаты: исходная стратегия RSI потеряла 625 пипсов за 576 сделок; стратегия RSI с метаразметкой потеряла 577 пипсов за 121 сделку; стратегия RSI с метаразметкой и адаптивным размером позиции потеряла 86 пипсов за ту же 121 сделку. Это не делает стратегию прибыльной. Доля верных классификаций метаклассификатора на тестовых данных составила 48 %, что ниже уровня случайного угадывания, а доля прибыльных сделок по одобренным сигналам не выросла, а снизилась. Это указано прямо, поскольку основной вывод не зависит от точности классификатора. Снижение просадки на 93 % достигается за счёт контроля рыночной экспозиции (меньшего числа сделок и меньших размеров позиций), а не благодаря способности прогнозировать.

Две закономерности, выявленные при анализе важности признаков, стоит учитывать в дальнейшей работе. Во-первых, признаки волатильности торговых сессий в совокупности обеспечивали 25.6 % суммарной важности признаков, а бинарные флаги торговых сессий — 2.5 %. Знание того, что сейчас активна сиднейская сессия, почти не имеет значения; знание того, насколько высокой была её волатильность в последнее время, даёт примерно в десять раз больше информации. Тот же контраст наблюдается и среди ценовых признаков: важность бинарного флага, показывающего положение цены относительно тренда, составляла 0.1 %, а непрерывного показателя наклона, характеризующего скорость тренда, — 4.6 %. Представление признаков не менее важно, чем их отбор. Во-вторых, два отдельных признака, занявших первые места в рейтинге, — расстояние до максимума за 20 баров и волатильность сиднейской сессии — не относятся к тем признакам, которые большинство практиков выбрали бы для построения фильтра RSI. ADX и глубина RSI, интуитивно кажущиеся критериями отсева, заняли восьмое и двенадцатое места соответственно. Данные противоречат априорным предположениям.

В следующей статье из этой серии та же самая концепция применяется к индикатору ADX Уайлдера — индикатору, который срабатывает при зарождении тренда, а не при его исчерпании. Изменяются параметры прогнозирования, построение меток и набор признаков; архитектура конвейера остается неизменной.


Прикрепленные файлы


Файл Описание
1. rsi_meta_pipeline.py
Полный конвейер: загрузчик данных только в формате Parquet (схема MT5, индекс без информации о часовом поясе), генерация сигналов RSI, разметка методом тройного барьера, конструирование 27 признаков (11 ценовых признаков и признаков волатильности + 16 временных признаков с помощью get_time_features), обучение метамодели на основе случайного леса, тестирование на исторических данных трех вариантов стратегии с учетом затрат на спред для каждого бара и экспорт результатов.
2. EURUSD_H1_time_2018-01-01-2024-12-31.parq Файл данных Parquet с ценовыми барами EURUSD на часовом графике за период с 01.01.2018 по 31.12.2024.

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/22274

Прикрепленные файлы |
Files.zip (2121.42 KB)
Фундаментальные модели для торговли (Часть II): Декодирование, авторегрессия и точный KV-кэш Фундаментальные модели для торговли (Часть II): Декодирование, авторегрессия и точный KV-кэш
Мы завершаем нативную реализацию Kronos на MQL5: создаем декодировщик, этапы decode_s1 и decode_s2 предиктора с подводными камнями перекрестного внимания и авторегрессионный цикл, формирующий прогноз на несколько баров. Затем мы проводим профилирование и ускоряем реализацию примерно в 4,5 раза с помощью точного KV-кэша и предварительно транспонированных весов, сверяя результаты каждого этапа с результатами PyTorch.
Разработка индикатора снятия ликвидности  STF Liquidity Sweep на языке MQL5 Разработка индикатора снятия ликвидности STF Liquidity Sweep на языке MQL5
В статье представлен динамический индикатор для MetaTrader 5, который выявляет снятия ликвидности используя логику определения точек разворота, соотношение теней свечей и подтверждения от паттернов поглощения. Индикатор распознает теневые паттерны с одной и двумя свечами без фиксированного временного окна, обновляет уровни ликвидности со стороны покупателей и продавцов по мере изменения цены и аннулирует уже пробитые уровни для поддержания достоверной карты ликвидности.
Конструирование признаков для машинного обучения (Часть 7): Энтропийные признаки в Python Конструирование признаков для машинного обучения (Часть 7): Энтропийные признаки в Python
В статье представлены готовые к промышленной эксплуатации оцениватели энтропии (Шеннона, подстановочный, Лемпеля — Зива, Контоянниса), работающие с последовательностями, закодированными по тиковому правилу. В статье устранены три проблемы корректности и производительности исходного кода, результаты сверены с данными из главы, а возможности кодирования расширены за счёт квантильного и сигма-кодирования. Пользователи получают воспроизводимые результаты и заметно более высокую скорость вычислений при работе с большими наборами баров.
Кэширование метаданных символов и расписаний торговых сессий в MQL5: Устранение лишних вызовов SymbolInfo в мультисимвольных советниках Кэширование метаданных символов и расписаний торговых сессий в MQL5: Устранение лишних вызовов SymbolInfo в мультисимвольных советниках
В этой статье представлен CSymbolMetaCache — программный слой на MQL5, который при запуске советника заранее загружает спецификации контрактов и расписания торговых сессий отслеживаемых символов, а затем возвращает их значения через типизированные геттеры из кэша в памяти. В статье объясняется, какие свойства можно безопасно кэшировать, а какие являются динамическими, включая полудинамическую стоимость тика для кросс-валютных пар. Также реализуется функция IsMarketOpen(), которая определяет, открыта ли сессия, используя кэшированные данные. Тест производительности показывает, насколько сокращается задержка при работе с набором из двадцати символов.