preview
Как реализовать R/S-анализ и индикатор Хёрста в MQL5

Как реализовать R/S-анализ и индикатор Хёрста в MQL5

MetaTrader 5Торговые системы |
41 0
Galym Yechshanov
Galym Yechshanov

Введение

Если вы хоть раз строили торговую систему на основе исторической волатильности — вы знаете это разочарование. Система прекрасно работает в тестере: Sharpe высокий, просадки минимальные, вы запускаете её в реальном времени — и через два-три месяца видите, как кривая equity начинает падать именно тогда, когда рынок резко взрывается. Классические модели волатильности не справились.

Проблема не в параметрах и не в переобучении, она глубже — в фундаментальном предположении, которое лежит в основе GARCH, Black-Scholes и большинства классических моделей: что волатильность меняется плавно и случайно, как обычное броуновское движение.

Реальный рынок так не ведёт себя.

В 2014 году Гатерал, Жэссон и Розенбаум опубликовали работу, которая перевернула представление о природе волатильности. Они обнаружили: волатильность финансовых рынков описывается дробным броуновским движением с показателем Хёрста H ≈ 0.10. Это число — ключевое, оно означает, что волатильность ведёт себя значительно грубее и непредсказуемее, чем считалось раньше. Её траектория нигде не дифференцируема. Именно поэтому любая модель, которая предполагает гладкость волатильности, — неизбежно даёт сбой.

Эта статья — про то, как перевести это математическое открытие в работающий индикатор MQL5. Не теоретический обзор, а конкретный инструмент: оценщик показателя Хёрста в скользящем окне, который в реальном времени определяет режим рынка и сигнализирует о смене его характера.

В статье последовательно рассматривается:

  • почему классические модели волатильности принципиально ошибаются;
  • теория дробного броуновского движения и показатель Хёрста;
  • метод нормированного размаха (R/S-анализ) — математика и реализация;
  • полный код индикатора RoughVolatility_H на MQL5;
  • интерпретация сигналов и торговые применения;
  • сравнение с классическими оценщиками волатильности;
  • практическая диагностика рыночного режима.


Почему классические модели волатильности принципиально ошибаются

Классическая модель Блэка-Шоулза предполагает, что цена актива следует геометрическому броуновскому движению с постоянной волатильностью. Это красиво математически, но катастрофически неверно эмпирически. Волатильность непостоянна — это знают все трейдеры. Поэтому появился GARCH.

GARCH и его вариации (EGARCH, GJR-GARCH, FIGARCH) позволяют волатильности меняться со временем. Но в них заложено другое ключевое предположение: волатильность — это процесс с целочисленной интеграцией, то есть либо стационарный (I(0)), либо нестационарный (I(1)). Оба класса соответствуют показателю Хёрста H = 0.5 или H = 1.0.

Gatheral, Jaisson и Rosenbaum (2014) провели эмпирический анализ данных реализованной волатильности на нескольких рынках: акции, индексы, товары, форекс. Они оценили показатель Хёрста для логарифма реализованной волатильности и получили H в диапазоне 0.05–0.20. Среднее значение — около 0.10. Это на порядок ниже, чем предполагают все классические модели.

Что значит H = 0.10 на практике. Движения волатильности быстро разворачиваются, пики волатильности острые и резкие — не гладкие, взрывы волатильности — не аномалии, а системное свойство. Модель, которая этого не учитывает, систематически занижает риск в спокойные периоды и переоценивает устойчивость в периоды потрясений.

Именно это объясняет классический сбой стратегий в периоды рыночных кризисов: GARCH-модель даёт условную волатильность, которая меняется слишком медленно, чтобы отреагировать на грубый скачок реальной волатильности.


Дробное броуновское движение и показатель Хёрста

Стандартное броуновское движение W(t) имеет независимые приращения: знание прошлого не даёт никакой информации о будущем. Дробное броуновское движение (fractional Brownian motion, fBm) — обобщение, введённое Колмогоровым и популяризованное Манделбротом и ван Нессом (1968), которое допускает долгосрочную память.

Дробное броуновское движение BH(t) параметризовано единственным числом H ∈ (0, 1) — показателем Хёрста:

  • H = 0.5 — стандартное броуновское движение, независимые приращения, нет памяти;
  • H > 0.5 — персистентный процесс: положительные приращения с большей вероятностью следуют за положительными (трендовый рынок);
  • H < 0.5 — антиперсистентный процесс: приращения отрицательно коррелированы на всех масштабах (mean-reverting рынок);
  • H ≈ 0.10 — Rough Volatility по Гатерал: сверхшероховатый процесс, близкий к нигде не дифференцируемому.

Ключевое математическое свойство — закон масштабирования дисперсии приращений fBm:

//+------------------------------------------------------------------+
//| RoughHurst.mq5 — Rough Volatility Hurst Exponent Indicator       |
//| R/S-анализ + OLS-регрессия в log-log пространстве.               |
//| Оценка H в скользящем окне и классификация режима рынка.         |
//| Цветовая индикация: Rough, Neutral, Trending.                    |
//| Copyright 2026, Galym Echanov                                    |
//+------------------------------------------------------------------+
#property copyright   "Galym Echanov, www.mql5.com"
#property link        "https://www.mql5.com/ru/users/gala_aka_47"
#property version     "1.00"
#property description "Rough Volatility — показатель Хёрста (R/S-анализ)"
#property description "H < 0.5 → антиперсистентный (mean-reverting) режим"
#property description "H = 0.5 → случайное блуждание"
#property description "H > 0.5 → персистентный (трендовый) режим"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   3

//--- Plot 0: Hurst Exponent — цветная линия
#property indicator_label1  "Hurst (H)"
#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrOrangeRed, clrDodgerBlue, clrMediumSeaGreen
#property indicator_width1  2

//--- Plot 1: Уровень H = 0.5 (Random Walk)
#property indicator_label2  "H=0.5 (Random Walk)"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrSilver
#property indicator_style2  STYLE_DOT
#property indicator_width2  1

//--- Plot 2: Уровень H = 0.3 (порог Rough-зоны)
#property indicator_label3  "H=0.3 (Rough Threshold)"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrOrangeRed
#property indicator_style3  STYLE_DASH
#property indicator_width3  1

//+------------------------------------------------------------------+
//| Входные параметры                                                |
//+------------------------------------------------------------------+

Именно этот закон масштабирования лежит в основе R/S-анализа: наблюдается, как масштабируется нормированный размах временного ряда при увеличении длины подвыборки, и оценивается показатель масштабирования.


Метод нормированного размаха — R/S-анализ

Метод R/S-анализа (Rescaled Range Analysis) предложен Херстом в 1951 году при изучении разливов Нила и формализован Манделбротом и Валлисом (1969). Это наиболее робастный непараметрический оценщик показателя Хёрста.

Пусть дан временной ряд лог-доходностей r 1 , r 2 , ..., r n . Для подвыборки длины τ алгоритм состоит из четырёх шагов. Вычислить среднее μ = (1/τ) Σ r i . Построить профиль отклонений Y k = Σ (r i − μ). Диапазон: R(τ) = max(Y) − min(Y). Стандартное отклонение: S(τ) = std(r i ). Нормированный размах: R/S(τ) = R(τ) / S(τ).

По закону масштабирования fBm: E[R/S(τ)] ~ c · τH. В логарифмическом пространстве: log(R/S) ~ H · log(τ) + const. Показатель Хёрста — это наклон прямой в log-log координатах, который оценивается методом наименьших квадратов (OLS) по нескольким масштабам τ.

В реализации используются логарифмически распределённые масштабы — от минимального (InpMinScale) до половины окна (InpWindow/2). Это обеспечивает равномерное покрытие масштабного диапазона без избыточного веса малых или больших масштабов.


Параметры и буферы индикатора

//+------------------------------------------------------------------+
//| RoughHurst.mq5 — Rough Volatility Hurst Exponent Indicator       |
//| R/S-анализ + OLS-регрессия в log-log пространстве.               |
//| Оценка H в скользящем окне и классификация режима рынка.         |
//| Цветовая индикация: Rough, Neutral, Trending.                    |
//| Copyright 2026, Galym Echanov                                    |
//+------------------------------------------------------------------+
#property copyright   "Galym Echanov, www.mql5.com"
#property link        "https://www.mql5.com/ru/users/gala_aka_47"
#property version     "1.00"
#property description "Rough Volatility — показатель Хёрста (R/S-анализ)"
#property description "H < 0.5 → антиперсистентный (mean-reverting) режим"
#property description "H = 0.5 → случайное блуждание"
#property description "H > 0.5 → персистентный (трендовый) режим"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   3

//--- Plot 0: Hurst Exponent — цветная линия
#property indicator_label1  "Hurst (H)"
#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrOrangeRed, clrDodgerBlue, clrMediumSeaGreen
#property indicator_width1  2

//--- Plot 1: Уровень H = 0.5 (Random Walk)
#property indicator_label2  "H=0.5 (Random Walk)"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrSilver
#property indicator_style2  STYLE_DOT
#property indicator_width2  1

//--- Plot 2: Уровень H = 0.3 (порог Rough-зоны)
#property indicator_label3  "H=0.3 (Rough Threshold)"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrOrangeRed
#property indicator_style3  STYLE_DASH
#property indicator_width3  1

//+------------------------------------------------------------------+
//| Входные параметры                                                |
//+------------------------------------------------------------------+

Входные параметры разбиты на три логические группы. Параметры оценки Хёрста управляют точностью и быстродействием. Уровни режимов задают пороги интерпретации. Алерты — опциональный инструмент для оперативного мониторинга.

input group "=== Оценка Хёрста ==="
input int    InpWindow    = 128; // Окно расчёта (баров)
input int    InpMinScale  = 8;   // Минимальный масштаб R/S (баров)
input int    InpNumScales = 6;   // Количество логарифмических масштабов

input group "=== Уровни режимов ==="
input double InpLevelRW    = 0.5; // Уровень случайного блуждания
input double InpLevelRough = 0.3; // Порог Rough-волатильности

input group "=== Алерты ==="
input bool   InpAlerts     = false; // Алерт при смене режима

Четыре буфера: значения Хёрста, цветовые индексы (DRAW_COLOR_LINE требует отдельного буфера для цвета), горизонтальный уровень H=0.5 и горизонтальный уровень H=0.3. Массив лог-доходностей g_Returns переиспользуется между вызовами OnCalculate, что устраняет лишние аллокации памяти на каждом тике.

//--- буферы индикатора
double H_Buffer[];  // значения показателя Хёрста
double C_Buffer[];  // цветовые индексы для H_Buffer
double RW_Buffer[]; // горизонтальный уровень H = 0.5
double Rg_Buffer[]; // горизонтальный уровень H = 0.3

//--- глобальный массив лог-доходностей (переиспользуется между вызовами)
double g_Returns[];

//--- предыдущий режим рынка для алертов
int g_PrevRegime = -1;


Инициализация индикатора

//+------------------------------------------------------------------+
//| Инициализация индикатора                                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Привязка буферов
   SetIndexBuffer(0, H_Buffer,  INDICATOR_DATA);
   SetIndexBuffer(1, C_Buffer,  INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2, RW_Buffer, INDICATOR_DATA);
   SetIndexBuffer(3, Rg_Buffer, INDICATOR_DATA);

//--- Рисование начинается только после первого полного окна
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, InpWindow);
   PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, InpWindow);
   PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, InpWindow);

//--- Цветовая схема для DRAW_COLOR_LINE (индекс → цвет):
//--- 0 → Rough/антиперсистентный  → OrangeRed
//--- 1 → Нейтральный              → DodgerBlue
//--- 2 → Трендовый/персистентный  → MediumSeaGreen
   PlotIndexSetInteger(0, PLOT_COLOR_INDEXES, 3);

//--- Короткое имя индикатора в окне
   IndicatorSetString(INDICATOR_SHORTNAME,
      StringFormat("RoughVol(H)[W=%d, S=%d]", InpWindow, InpNumScales));
   IndicatorSetInteger(INDICATOR_DIGITS, 4);

//--- Предупреждение при некорректных параметрах
   if(InpWindow < InpMinScale * 4)
      Print("RoughVol WARNING: Окно мало. Рекомендуется InpWindow >= InpMinScale * 4. "
            "Точность оценки Хёрста снижена.");

   return(INIT_SUCCEEDED);
  }


Ядро алгоритма — функция CalcHurst

Это центральная функция индикатора. Она реализует полный R/S-анализ с OLS-регрессией в log-log пространстве. Логика разбита на три этапа: цикл по масштабам, накопление R/S на каждом масштабе, итоговая регрессия.

//+------------------------------------------------------------------+
//| R/S-анализ — оценка показателя Хёрста                            |
//|                                                                  |
//| Параметры:                                                       |
//|   ret[]  — массив лог-доходностей                                |
//|   start  — стартовый индекс в ret[]                              |
//|   length — длина анализируемого окна                             |
//|                                                                  |
//| Возвращает: H ∈ [0.01, 0.99] или EMPTY_VALUE при ошибке          |
//|                                                                  |
//| Алгоритм:                                                        |
//|   1. Для каждого масштаба n (log-равномерно от MinScale до N/2): |
//|      a. Разбить окно на непересекающиеся подвыборки длины n      |
//|      b. Для каждой: вычислить R (диапазон) и S (ст. откл.)       |
//|      c. Накопить среднее log(R/S) при данном n                   |
//|   2. OLS-регрессия log(R/S) ~ H * log(n) → H = наклон прямой    |
//+------------------------------------------------------------------+
double CalcHurst(const double &ret[], int start, int length)
  {
//--- Граничная проверка
   if(length < InpMinScale * 2)
      return(EMPTY_VALUE);

   double logN_min = MathLog((double)InpMinScale);
   double logN_max = MathLog((double)(length >> 1)); // log(length / 2)

   if(logN_max <= logN_min + 1e-10)
      return(EMPTY_VALUE);

//--- Накопители для линейной регрессии в log-log пространстве
   double sumX  = 0.0, sumY  = 0.0;
   double sumXY = 0.0, sumX2 = 0.0;
   int    nPts  = 0;

//--- Цикл по логарифмически распределённым масштабам
   for(int s = 0; s < InpNumScales; s++)
     {
      //--- Масштаб n: от InpMinScale до length/2 (лог-равномерно)
      double alpha = (InpNumScales > 1) ? (double)s / (InpNumScales - 1) : 0.0;
      int    n     = (int)MathRound(MathExp(logN_min + (logN_max - logN_min) * alpha));
      n = MathMax(InpMinScale, MathMin(length >> 1, n));

      //--- Количество непересекающихся подвыборок длины n
      int numSubs = length / n;
      if(numSubs < 1)
         continue;

      double logRS_acc = 0.0;
      int    logRS_cnt = 0;

      //--- Цикл по подвыборкам
      for(int sub = 0; sub < numSubs; sub++)
        {
         int i0 = start + sub * n;

         //--- Среднее значение доходностей в подвыборке
         double mu = 0.0;
         for(int i = 0; i < n; i++)
            mu += ret[i0 + i];
         mu /= n;

         //--- Кумулятивные отклонения, диапазон R и дисперсия
         double cumDev = 0.0;
         double R_max  = -1e30;
         double R_min  =  1e30;
         double var    =  0.0;

         for(int i = 0; i < n; i++)
           {
            double d  = ret[i0 + i] - mu;
            cumDev   += d;
            var      += d * d;
            if(cumDev > R_max)
               R_max = cumDev;
            if(cumDev < R_min)
               R_min = cumDev;
           }

         double R = R_max - R_min;         // размах кумулятивных отклонений
         double S = MathSqrt(var / n);     // стандартное отклонение

         //--- Накопить log(R/S), если оба значения значимы
         if(S > 1e-12 && R > 1e-12)
           {
            logRS_acc += MathLog(R / S);
            logRS_cnt++;
           }
        }

      if(logRS_cnt < 1)
         continue;

      //--- Среднее log(R/S) для масштаба n → точка регрессии
      double logRS = logRS_acc / logRS_cnt;
      double logN  = MathLog((double)n);

      sumX  += logN;
      sumY  += logRS;
      sumXY += logN * logRS;
      sumX2 += logN * logN;
      nPts++;
     }

//--- OLS: наклон в log-log пространстве = показатель Хёрста
   if(nPts < 2)
      return(EMPTY_VALUE);

   double det = (double)nPts * sumX2 - sumX * sumX;
   if(MathAbs(det) < 1e-14)
      return(EMPTY_VALUE);

   double H = ((double)nPts * sumXY - sumX * sumY) / det;

//--- Ограничение в физически допустимом диапазоне
   return(MathMax(0.01, MathMin(0.99, H)));
  }

Логарифмически равномерные масштабы. Вместо равномерного шага (8, 16, 24, ...) используется экспоненциальный шаг (8, 13, 22, 36, ...). Это обеспечивает равномерное покрытие в log-пространстве и предотвращает избыточный вес малых масштабов, которые дают больше точек наблюдений, но меньше независимой информации.

Усреднение по подвыборкам. При масштабе n окно разбивается на несколько непересекающихся подвыборок, и R/S усредняется по ним. Это снижает дисперсию оценки. При малых n подвыборок много и оценка стабильна. При больших n подвыборок мало — отсюда важность параметра InpWindow: чем оно больше, тем надёжнее оценка на крупных масштабах.

Числовая стабильность. Условия S > 1e-12 и R > 1e-12 защищают от деления на нуль при вырожденных данных. Условие |det| > 1e-14 предотвращает нестабильность OLS при вырожденных матрицах.


Определение режима и основной цикл расчёта

//+------------------------------------------------------------------+
//| Определение торгового режима по H                                |
//+------------------------------------------------------------------+
int GetRegime(double H)
  {
   if(H < InpLevelRough)
      return(0);                 // Rough / Mean-reverting
   if(H <= InpLevelRW)
      return(1);                 // Нейтральный / Random Walk

   return(2);                    // Персистентный / Trending
  }

//+------------------------------------------------------------------+
//| Имя режима для алертов и логов                                   |
//+------------------------------------------------------------------+
string GetRegimeName(int regime)
  {
   switch(regime)
     {
      case 0:
         return("ROUGH (Mean-Reverting, H < " + DoubleToString(InpLevelRough, 2) + ")");
      case 1:
         return("NEUTRAL (Random Walk)");
      case 2:
         return("TRENDING (Persistent, H > " + DoubleToString(InpLevelRW, 2) + ")");
     }
   return("UNKNOWN");
  }
//+------------------------------------------------------------------+
//| Основная функция расчёта                                         |
//+------------------------------------------------------------------+
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[])
  {
//--- Минимально необходимое количество баров
   if(rates_total < InpWindow + 2)
      return(0);

//--- Размер массива лог-доходностей = rates_total - 1
//--- g_Returns[i] = log(close[i+1] / close[i])
//--- Индекс 0 = старейший бар, rates_total-1 = текущий бар
   int retSize = rates_total - 1;
   if(ArrayResize(g_Returns, retSize) != retSize)
     {
      Print("RoughVol ERROR: не удалось выделить память для массива доходностей.");
      return(0);
     }

//--- Определяем стартовый бар пересчёта:
//--- При первом запуске пересчитываем всё с InpWindow
//--- При обновлении — только с последнего подтверждённого бара
   int startBar = (prev_calculated <= InpWindow + 1)
                  ? InpWindow
                  : prev_calculated - 1;

//--- Пересчёт лог-доходностей начиная с нужной позиции
//--- С небольшим запасом назад для надёжности
   int retFrom = (startBar > InpWindow) ? (startBar - InpWindow - 1) : 0;
   for(int i = retFrom; i < retSize; i++)
     {
      g_Returns[i] = (close[i] > 0.0 && close[i + 1] > 0.0)
                     ? MathLog(close[i + 1] / close[i])
                     : 0.0;
     }

//--- Основной цикл расчёта по барам
   for(int bar = startBar; bar < rates_total; bar++)
     {
      //--- Горизонтальные уровни
      RW_Buffer[bar] = InpLevelRW;
      Rg_Buffer[bar] = InpLevelRough;

      //--- Окно R/S-анализа: InpWindow лог-доходностей, оканчивающихся на баре bar
      //--- g_Returns[bar - InpWindow] .. g_Returns[bar - 1]
      int retStart = bar - InpWindow;

      if(retStart < 0 || retStart + InpWindow > retSize)
        {
         H_Buffer[bar] = EMPTY_VALUE;
         C_Buffer[bar] = 1;
         continue;
        }

      double H = CalcHurst(g_Returns, retStart, InpWindow);

      if(H == EMPTY_VALUE)
        {
         H_Buffer[bar] = EMPTY_VALUE;
         C_Buffer[bar] = 1;
         continue;
        }

      H_Buffer[bar] = H;

      //--- Режим рынка и цвет линии
      int regime   = GetRegime(H);
      C_Buffer[bar] = regime;

      //--- Алерт при смене режима (только на последнем баре)
      if(InpAlerts && bar == rates_total - 1 &&
         regime != g_PrevRegime && g_PrevRegime != -1)
        {
         string msg = StringFormat(
            "[RoughVol] %s %s | H=%.4f | Режим: %s",
            Symbol(), EnumToString(Period()), H, GetRegimeName(regime));
         Alert(msg);
         Print(msg);
        }

      //--- Сохраняем режим текущего бара для следующего тика
      if(bar == rates_total - 1)
         g_PrevRegime = regime;
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+


Интерпретация сигналов индикатора

Индикатор возвращает значение H в диапазоне [0.01, 0.99] и окрашивает линию в соответствии с рыночным режимом. Цвета имеют конкретный торговый смысл.

Диапазон H Цвет Режим Характеристика Торговая логика
H < 0.3 OrangeRed Rough / Mean-Reverting Сильная антиперсистентность, взрывная волатильность Контртрендовые стратегии, возврат к среднему, парный трейдинг
0.3 ≤ H ≤ 0.5 DodgerBlue Нейтральный / Random Walk Рынок без выраженной памяти Воздержаться от направленных позиций, снизить размер
H > 0.5 MediumSeaGreen Трендовый / Persistent Движения самоподкрепляются, трендовая персистентность Трендовые стратегии, моментум, следование тренду

Network Health индикатора проверяется через смотрение истории переходов между режимами. Переход из нейтральной (синей) зоны в Rough-зону (красную) — сигнал того, что волатильность начала вести себя взрывным образом: предстоящие движения будут резкими и с быстрым разворотом. Именно в таких условиях трендовые системы несут максимальные потери.

Также очень полезен переход в синюю зону - он часто совпадает с предшествующим разворотом тренда.


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


Выбор параметров

Параметры по умолчанию (Window=128, MinScale=8, NumScales=6) выбраны на основе оригинального исследования Gatheral et al. и обеспечивают хорошее соотношение между точностью оценки и вычислительной нагрузкой.

Параметр По умолчанию Рекомендованный диапазон Влияние на результат
InpWindow 128 64–256 Больше окно → стабильнее оценка, но медленнее реакция на смену режима
InpMinScale 8 4–16 Меньше → больше краткосрочных масштабов, чувствительнее к шуму
InpNumScales 6 4–10 Больше точек регрессии → точнее оценка H, но выше вычислительная нагрузка
InpLevelRough 0.3 0.25–0.40 Порог Rough-зоны: выше → более частые сигналы смены режима
InpLevelRW 0.5 0.45–0.55 Граница между нейтральным и трендовым режимами

При работе на скальпинговых таймфреймах (M1–M5) рекомендуется увеличить InpWindow до 256–512: краткосрочный шум сильно влияет на оценку Хёрста. На дневных барах (D1) можно уменьшить до 64 — там структура более чистая.


Сравнение с классическими оценщиками волатильности

Ключевое отличие RoughVolatility_H от ATR, Bollinger Bands и исторической волатильности — не в том, что он измеряет уровень волатильности, а в том, что он измеряет её структуру. Два рынка могут иметь одинаковый ATR, но принципиально разный характер движения.

Инструмент Что измеряет Что не видит Режим использования
ATR Уровень волатильности (размах баров) Структуру: трендовая или mean-reverting Размер позиции, SL/TP
Bollinger Bands Относительное положение цены в диапазоне Долгосрочную память временного ряда Пробой/возврат к полосе
Историческая волатильность Стандартное отклонение доходностей Показатель Хёрста, нет информации о режиме Сравнение с подразумеваемой волатильностью
GARCH Условную волатильность с кластеризацией H < 0.5; реагирует слишком медленно на взрывы Эконометрическое моделирование риска
RoughVolatility_H Показатель Хёрста — структуру и режим рынка Абсолютный уровень волатильности Выбор типа стратегии (тренд/контртренд)

Практическая комбинация: ATR определяет размер позиции и уровни SL/TP, RoughVolatility_H определяет тип стратегии. Когда H < 0.3 — используем стратегии возврата к среднему. Когда H > 0.5 — используем моментум. Когда рынок между 0.3 и 0.5 — снижаем размер позиции или воздерживаемся от входа.


Практическая диагностика рыночного режима

На практике индикатор ведёт себя следующим образом на различных рыночных условиях.

Спокойный рынок (низкий ATR, узкие Bollinger). Показатель Хёрста обычно находится в диапазоне 0.4–0.6, линия синяя. Рынок в нейтральном состоянии без выраженного режима. Рекомендуется осторожность при входе в позиции.

Период высокой волатильности (новостные события, кризисы). H быстро падает к 0.1–0.2, линия становится красной. Именно здесь проявляется грубость волатильности: всплески резкие, разворотные. Стратегии momentum здесь разрушаются; выигрывают контртрендовые подходы.

Устойчивый тренд (направленное движение нескольких недель). H поднимается выше 0.55–0.70, линия зелёная. Это редкое, но ценное состояние: трендовые системы дают лучшие результаты. Важно: зелёный режим часто предшествует резкому переходу в красный при развороте тренда.

Смена режима как торговый сигнал. Переход из синей в красную зону (алерт InpAlerts) часто происходит перед резким движением. Не направление, а сам факт смены режима — предупреждение о повышенном риске. Это сигнал к пересмотру открытых позиций и уменьшению плеча.

Памятка действий при ухудшении показателей:

  • H устойчиво ниже 0.3 более 50 баров: перейти на контртрендовые стратегии, сократить плечо;
  • H хаотично прыгает между зонами: увеличить InpWindow для стабилизации, снизить частоту входов;
  • H > 0.7 на нескольких таймфреймах одновременно: редкое состояние, трендовые системы дают максимальный результат, но риск разворота повышен.


Заключение: что получает трейдер

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

Три практических применения, доступных сразу после установки.

Первое — фильтр типа стратегии. Перед каждой сессией проверяем цвет линии. Красная зона — применяем контртрендовые инструменты (RSI-перекупленность, возврат к Боллинджеру). Зелёная зона — применяем трендовые инструменты (пробои уровней, моментум). Синяя зона — снижаем размер позиции вдвое или ждём чёткого сигнала.

Второе — управление риском. В красной зоне рынок особенно непредсказуем. Это количественная метрика риска режима: уменьшить плечо, сузить SL, снизить количество одновременно открытых позиций.

Третье — диагностика системы. Если трендовая система начинает давать убытки — первый вопрос: какое значение H? Если H < 0.3, это не означает, что стратегия сломалась. Это означает, что рынок сменил режим. Зная это, вы не переоптимизируете стратегию, а просто ждёте возврата в трендовый режим.

Индикатор требует достаточного количества баров (Window + несколько сотен для разогрева) для стабильной оценки. Краевые значения H < 0.05 или H > 0.95 чаще всего являются артефактом малого объёма данных, а не реальным сигналом.

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

Название файла Описание файла
RoughVolatility_H.mq5
Индикатор показателя Хёрста — R/S-анализ, три режима рынка, алерты при смене режима


Прикрепленные файлы |
Как построить 29-парный портфель с L1-фильтром и VaR-распределением лотов Как построить 29-парный портфель с L1-фильтром и VaR-распределением лотов
Разбирается практическое применение L1 Trend Filter для очистки шума и формирования структурных признаков, совместимых с live-торговлей. Показан полный цикл: H1-данные 29 инструментов из MetaTrader 5, каузальная фильтрация, CatBoost на горизонте трёх L1-баров, честный walk-forward и распределение лотов по VaR. Читатель получает воспроизводимый кодовый конвейер и методику портфельной оценки.
Создание торговой системы (Часть 4): Как случайные выходы из сделок влияют на ожидаемую доходность Создание торговой системы (Часть 4): Как случайные выходы из сделок влияют на ожидаемую доходность
Многие трейдеры сталкивались с подобной ситуацией. Они часто придерживаются своих критериев входа, но испытывают трудности с сопровождением сделок. Даже при корректных торговых сетапах эмоциональное принятие решений, например, панический выход до того, как сделки достигнут уровней тейк-профита или стоп-лосса, - может привести к снижению кривой эквити. Как трейдеры могут преодолеть эту проблему и улучшить свои результаты? В данной статье мы рассмотрим эти вопросы, исследуя случайные винрейты (доля прибыльных сделок) и демонстрируя с помощью моделирования по методу Монте-Карло, как трейдеры могут совершенствовать свои стратегии, фиксируя прибыль на разумных уровнях до достижения первоначальной цели.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Построение моделей волатильности в MQL5 (Часть II): Реализация моделей GJR-GARCH и TARCH Построение моделей волатильности в MQL5 (Часть II): Реализация моделей GJR-GARCH и TARCH
В статье реализуются GJR-GARCH и TARCH в библиотеке волатильности MQL5 и объясняется, почему учёт асимметрии даёт преимущества по сравнению со стандартными ARCH/GARCH. Рассматриваются формулировка моделей, параметризация и использование через производные классы и скрипты. Читатели получают примеры кода для калибровки и одношагового прогнозирования на реальных данных для управления рисками и диагностики моделей.