English 中文 Español Deutsch 日本語 Português
preview
Возможности Мастера MQL5, которые вам нужно знать (Часть 43): Обучение с подкреплением с помощью SARSA

Возможности Мастера MQL5, которые вам нужно знать (Часть 43): Обучение с подкреплением с помощью SARSA

MetaTrader 5Торговые системы |
462 0
Stephen Njuki
Stephen Njuki

Введение

Обучение с подкреплением (reinforcement learning, RL) позволяет торговым системам обучаться на основе данных окружающей среды или рынка и, таким образом, со временем улучшать свои торговые возможности. RL позволяет адаптироваться к изменяющимся рыночным условиям, что делает его пригодным для определенных динамичных финансовых рынков и ценных бумаг. Финансовые рынки непредсказуемы, поскольку зачастую им свойственна высокая степень неопределенности. RL отлично справляется с принятием решений в условиях неопределенности, постоянно корректируя свои действия на основе получаемой обратной связи (вознаграждений), что очень полезно для трейдеров при работе в нестабильных рыночных условиях.

Такой подход можно сравнить с советником, который прикреплен к графику и также периодически самостоятельно оптимизируется на основе недавней истории цен для точной настройки своих параметров. RL стремится сделать примерно то же самое. В нашей серии статей мы рассматривали RL в строгом смысле определения как третий подход к машинному обучению (помимо обучения с учителем и без). Однако мы пока не рассматривали его как независимую модель, которую можно использовать в прогнозировании.

Именно это мы и сделаем в статье. Мы не просто вводим алгоритм RL SARSA, но стремимся реализовать его в другом пользовательском классе сигналов советников, собранных в Мастере, как независимую модель сигналов. При использовании в качестве модели сигнала RL автоматизирует процесс принятия решений, снижая необходимость постоянного вмешательства человека, что в свою очередь (по крайней мере, в теории) может обеспечить высокочастотную торговлю и реагирование на движения рынка в реальном времени. Кроме того, благодаря постоянной обратной связи от механизма вознаграждения, модели с подкреплением, как правило, учатся лучше управлять рисками. Это реализуется посредством наказания за высокорисковые действия низким вознаграждением, а чистый эффект от заключается в том, что RL минимизирует подверженность волатильным или убыточным сделкам.

RL также подразумевает баланс между исследованием и эксплуатацией, то есть баланс между опробованием новых стратегий и использованием уже прибыльных. Это стало возможным благодаря "эпсилон-жадному" (epsilon-greedy) подходу к обновлению Q-карты, представляющей собой матрицу действий в возможных состояниях среды, из которых агент может выбрать действие.

Есть еще несколько плюсов RL, которые могут показаться незначительными, но их все равно стоит упомянуть, учитывая растущую роль RL в ИИ.

Он может помочь оптимизировать исполнение сделок, узнавая наилучшие моменты и цены для покупки или продажи на основе исторических данных и обратной связи в реальном времени, тем самым повышая прибыльность. Этого можно достичь, если в качестве базовой модели сигнала, как в случае с этой статьей, использовать ее в паре с другим сигналом, так что ее роль сводится к определению того, как это происходит в ситуациях, когда используются отложенные ордера. Если Q-map содержит, скажем, 3 действия: лимитные ордера, стоп-ордера и рыночные ордера, то можно точно настроить точки входа в уже устоявшуюся и знакомую стратегию.

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


Введение в SARSA

Аббревиатура SARSA расшифровывается как State-Action-Reward-State-Action (состояние-действие-вознаграждение-состояние-действие). Название происходит от способа обновления значений Q-Map. Этот метод обновления Q-значений явно отличается от подхода Q-обучения, который мы рассматривали в предыдущей статье, тем, что он соответствует политике (on-policy), по сравнению с подходом вне политики (off-policy), который мы тогда рассматривали. Фактически, наша реализация SARSA для текущей статьи идентична той, которую мы использовали в той статье, когда представляли Q-обучение, за исключением способа обновления значений Q-Map.

Алгоритм SARSA, основанный на политике, означает, что он изучает Q-значения на основе уже предпринятых им действий, следуя своей текущей политике, а не действиям, которые он собирается предпринять на основе текущего состояния среды. Он обновляет Q-значения, используя действие, которое было выбрано следуемой им политикой. С другой стороны, Q-обучение — это алгоритм, не зависящий от политики, то есть он обновляет Q-значения, используя наилучшее возможное действие из следующего состояния среды, независимо от действия, предпринятого текущей политикой. н изучает оптимальную политику независимо от текущих действий агента. Мы реализуем это обновление Q-значений для SARSA в рамках политики следующим образом:

//+------------------------------------------------------------------+
// Update Q-value using On-policy
//+------------------------------------------------------------------+
void Cql::SetOnPolicy(double Reward, vector &E)
{  Action(E);
//where 'act' index 1 represents the current Q-action from Q-Map
   double _action = Q[act[1]][e_row[0]][e_col[0]];
   if(THIS.use_markov)
   {  int _old_index = GetMarkov(e_row[1], e_col[1]);
      int _new_index = GetMarkov(e_row[0], e_col[0]);
      _action *= markov[_old_index][_new_index];
   }
   for (int i = 0; i < THIS.actions; i++)
   {  if(i == act[0])
      {  continue;
      }
      Q[i][e_row[1]][e_col[1]] += THIS.alpha * (Reward + (THIS.gamma * _action) - Q[act[0]][e_row[1]][e_col[1]]);
   }
}

Правило обновления SARSA использует фактическое действие, предпринятое в следующем состоянии (Состояние → Действие → Вознаграждение → Состояние → Действие). Процесс следует политике эпсилон-жадности в отношении исследования и обучения. Это очень похоже на то, что рассматривалось в Q-обучении, однако то, что тогда было неясно, а сейчас вынесено на первый план, — это то, как эпсилон-жадный выбор может привести к весьма непоследовательным результатам, поскольку процесс обновления Q-Map рандомизирован. Как правило, чем меньше значение эпсилон, тем меньше случайные эффекты.

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

Таким образом, SARSA лучше подходит для сценариев, где критически важно поддерживать баланс между исследованием и эксплуатацией, а окружающая среда рискованна или нестационарна, и лучшим сценарием, который приходит на ум в этом случае, будет торговля любой из пар JPY, например. И наоборот, Q-обучение лучше подходит, когда окружающая среда относительно стабильна, а поиск оптимальной стратегии важнее, чем управление постоянными рисками. Вероятно, лучшим примером здесь может служить пара EURCHF.

Мы также рассмотрели другой алгоритм RL, глубокие Q-сети (Deep-Q-Networks) в этой статье, и он также отличается от SARSA во многих отношениях. На первый взгляд, основное отличие заключается в том, что SARSA, как и Q-обучение, использует Q-таблицу для хранения значений состояния и действия. Это ограничивает SARSA средами с небольшими пространствами состояний, поскольку в более крупных средах поддержка Q-таблицы становится непрактичной. Однако DQN, как мы видели в этой статье, используют нейронные сети для аппроксимации Q-значений для каждой пары состояние-действие, что делает их более масштабируемыми и эффективными в средах с большими или непрерывными пространствами состояний.

Что касается воспроизведения опыта, SARSA его не использует, поскольку алгоритм обучается на каждом опыте последовательно. Это может привести к неэффективному обучению, поскольку агент учится только на самом последнем опыте. В свою очередь, DQN может реализовать воспроизведение опыта, при котором прошлые события буферизуются и выбираются случайным образом во время обучения. Это может значительно снизить корреляцию между последовательными событиями, что, в свою очередь, может привести к более стабильному обучению.

Еще одно различие между SARSA и DQN вытекает из использования целевых сетей. В SARSA такой концепции нет, поскольку он обновляет Q-значения непосредственно на каждом этапе на основе текущей политики. С другой стороны, как мы увидели в статье DQN, использование целевой сети наряду с основной Q-сетью для стабилизации обучения является обязательным. При использовании DQN целевая сеть периодически обновляется, что обеспечивает стабильные обновления Q-значений, предотвращая большие колебания в процессе обучения.

Масштабируемость и сложность — еще одно сложное различие между DQN и SARSA, поскольку SARSA лучше всего подходит для решения небольших и простых задач из-за ограничений размера Q-таблицы и обучения в рамках политики. В то время как DQN предназначен для более сложных, многомерных задач, таких как те, которые встречаются в задачах, связанных с изображениями, или в средах с большим количеством состояний. В этой статье о SARSA, как и в статье о Q-обучении, мы для краткости ограничиваем количество состояний среды девятью.

Они основаны на трех упрощенных состояниях рынка: бычьем, медвежьем и пилообразном. Каждое из этих состояний затем применяется к короткому и длинному таймфрейму для создания матрицы 3 x 3, которая подразумевает 9 возможных состояний. В случаях, когда необходимо учитывать дополнительные параметры, такие как данные экономических новостей или связанное с ними движение цен на ценные бумаги, континуум значений, которые могут принимать эти данные, ограничивает применимость SARSA.

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


Настройка среды MQL5 для SARSA

Чтобы реализовать наш пользовательский класс сигналов, использующий в качестве базовой модели RL, а не MLP или другой алгоритм машинного обучения, нам, по сути, нужно упростить класс сигналов, который мы видели во вводной статье, до RL, ориентированного на Q-обучение. В этой статье для прогнозирования использовался MLP, а RL ограничивался обработкой функции потерь во время обучения. Тогда, как и сейчас, RL с SARSA использовали эпсилон-жадный подход, который определяет, когда следует случайным образом выбирать наилучшее действие для агента.

Когда мы просто использовали RL для управления процессом обучения MLP, эти часто случайные выборы были "приемлемыми", поскольку полученное значение потерь в результате обучения не было столь чувствительным к общей производительности MLP. Однако теперь, когда моделью является RL, а не очередной MLP, выбор случайных действий оказывает непропорционально большое влияние на общую производительность.

Часто в машинном обучении имеется обучающая выборка и тестовая выборка. Обычно набор данных для обучения будет немного больше набора данных для тестирования, и если следовать этому протоколу разделения обучения и тестирования, то использование эпсилон может быть конструктивным для модели в целом. Q-Map, представляющий собой просто матричный массив, не экспортируется ни одной функцией в прилагаемом коде. Любой, кто заинтересован в дальнейшем использовании этого метода для независимого обучения и тестирования, должен будет экспортировать этот матричный массив в виде bin-файла или CSV-файла в свою систему после обучения, прежде чем считывать его при тестировании.


Реализация пользовательского класса сигнала

Как упоминалось выше, наш пользовательский класс сигнала является упрощением того, что говорилось в статье об алгоритме Q-обучения, и одним из основных изменений является функция получения выходных данных, которую мы пересмотрели следующим образом:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CSignalSARSA::GetOutput(int &Output, Cql *QL)
{  vector _in, _in_row, _in_row_old, _in_col, _in_col_old;
   if
   (
      _in_row.Init(m_scale) &&
      _in_row.CopyRates(m_symbol.Name(), m_period, 8, 0, m_scale) &&
      _in_row.Size() == m_scale
      &&
      _in_row_old.Init(m_scale) &&
      _in_row_old.CopyRates(m_symbol.Name(), m_period, 8, 1, m_scale) &&
      _in_row_old.Size() == m_scale
      &&
      _in_col.Init(m_scale) &&
      _in_col.CopyRates(m_symbol.Name(), m_period, 8, 0, m_scale) &&
      _in_col.Size() == m_scale
      &&
      _in_col_old.Init(m_scale) &&
      _in_col_old.CopyRates(m_symbol.Name(), m_period, 8, m_scale, m_scale) &&
      _in_col_old.Size() == m_scale
   )
   {  _in_row -= _in_row_old;
      _in_col -= _in_col_old;
      vector _in_e;
      _in_e.Init(m_scale);
      QL.Environment(_in_row, _in_col, _in_e);
      int _row = 0, _col = 0;
      QL.SetMarkov(int(_in_e[m_scale - 1]), _row, _col);
      double _reward_float = _in_row[m_scale - 1];
      double _reward_max = _in_row.Max();
      double _reward_min = _in_row.Min();
      double _reward = QL.GetReward(_reward_max, _reward_min, _reward_float);
      QL.SetOnPolicy(_reward, _in_e);
      Output = QL.transition_act;
   }
}

Для новичков сборка кода в советник описана здесь и здесь. Собранный советник будет протестирован с оптимизированным значением эпсилон исключительно для демонстрации удобства использования советника. На практике это значение в идеале должно определяться собственным знанием относительной важности и значимости различных состояний окружающей среды и соответствующих им действий.


Тестирование и отладка сигнала на основе SARSA

Чтобы лучше протестировать и использовать пользовательский сигнал SARSA, необходимо внести некоторые изменения в класс сигнала, и, возможно, наиболее важным из них является добавление функции для экспорта массива матриц Q-Map. Это позволит проводить независимое тестирование и обучение в традиционном смысле. Однако эти возможности перекрестной проверки встроены в тестер стратегий, поскольку доступно форвардное тестирование.

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

Функция вознаграждения также должна точно отражать результаты торговли. В этой статье наш код использует благоприятное отклонение как процент от ценового диапазона для каждого нового бара. Это потому, что мы одновременно обучаем Q-Map и размещаем торговые решения на основе ее весовых коэффициентов Q-значения в соответствующее время. Подход, конечно, не идеален, так как есть необходимость искать надлежащие независимые наборы данных для тестирования и обучения. Однако показатели вознаграждения могут быть более долгосрочными, чем те, которые мы используем здесь, если, например, они учитывают прибыльность и производительность советника за более длительные периоды времени.

Чтобы не гнаться слепо за прибыльностью советника, было бы неплохо протестировать отдельные пары "состояние-действие" и убедиться, что советник правильно реагирует на рыночные условия, как и ожидалось. Например, проверка весовых коэффициентов Q-значения в Q-Map в нашей упрощенной версии для этой статьи в первой координате сетки 0 и 0, которая отмечает медвежьи краткосрочные и долгосрочные условия, должна иметь наибольший вес для действия 0, которое представляет продажу, а не "значение, соответствующее кривой", противоречащее тому, что следует делать на медвежьих рынках.

Проверка надлежащего баланса исследования и эксплуатации, реализуемого с помощью политики "эпсилон-жадности", также имеет важное значение, однако этого можно добиться путем оптимизации идеального значения эпсилон. Однако эту оптимизацию необходимо будет выполнять на отдельном наборе обучающих данных, где Q-Maps будут резервироваться на проходах с более высокой производительностью. После обучения на отдельном наборе данных форвардное тестирование может подтвердить или опровергнуть используемое значение эпсилон.

Обратное обучение должно проводиться на наборах данных приемлемого качества. Отчеты тестера стратегий отражают качество использованных данных после тестового прохода, поэтому они всегда являются хорошим показателем надежности обучения. Однако это обучение будет включать экспорт Q-карт (Q-Maps) в конце каждого прохода, если результаты теста окажутся лучше предыдущих контрольных показателей, а экспортированные Q-карты затем будут повторно использоваться в последующих раундах обратного обучения, так что эти дополнительные проходы обучения будут действовать как эпохи при обучении нейронных сетей.

В конце обучения окончательная Q-карта, обеспечивающая наиболее удовлетворительную производительность советника, будет использована в одном форвардном тестовом проходе, чтобы проверить, можно ли воспроизвести прошлые результаты обучения с этой конкретной Q-картой на пока еще "невидимом" тестовом наборе данных. Форвард-тесты являются неотъемлемой частью тестера стратегий. И эта статья может служить руководством для новичков.

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


Отчеты тестера стратегий

Тестовые прогоны на дневном таймфрейме для EURJPY за 2022 год, которые призваны лишь продемонстрировать удобство использования советника, дают нам следующие результаты:

r1

c1


Практическое применение SARSA в реальной торговле

Поскольку SARSA является алгоритмом, основанным на политике, он напрямую учитывает действия политики в процессе обучения, что делает его более адаптируемым к зашумленным данным. Метод значений Q-Map, который мы используем, обновляет все Q-значения на карте пропорционально их отставанию от текущего действия, как показано в коде политики выше. Это обновление следует за эпсилон-жадным обновлением, выполненным в функции Action, чтобы сбалансировать исследование (открытие новых стратегий) и эксплуатацию (использование известных стратегий), чтобы помочь модели избежать переобучения краткосрочному шуму в рыночных данных. Выбор следующего действия, которое будет использовано агентом, происходит посредством марковского процесса принятия решений, независимо от того, будет ли применяться весовой коэффициент Маркова к процессу обновления Q-значения, как мы делали ранее в статье о Q-обучении. Обработка осуществляется в функции Action, как показано ниже:

//+------------------------------------------------------------------+
// Choose an action using epsilon-greedy approach
//+------------------------------------------------------------------+
void Cql::Action(vector &E)
{  int _best_act = 0;
   if (double((rand() % SHORT_MAX) / SHORT_MAX) < THIS.epsilon)
   {  // Explore: Choose random action
      _best_act = (rand() % THIS.actions);
   }
   else
   {  // Exploit: Choose best action
      double _best_value = Q[0][e_row[0]][e_col[0]];
      for (int i = 1; i < THIS.actions; i++)
      {  if (Q[i][e_row[0]][e_col[0]] > _best_value)
         {  _best_value = Q[i][e_row[0]][e_col[0]];
            _best_act = i;
         }
      }
   }
//update last action
   act[1] = act[0];
   act[0] = _best_act;
//
   int _e_row_new = 0, _e_col_new = 0;
   SetMarkov(int(E[E.Size() - 1]), _e_row_new, _e_col_new);
   e_row[1] = e_row[0];
   e_col[1] = e_col[0];
   e_row[0] = _e_row_new;
   e_col[0] = _e_col_new;
   LetMarkov(e_row[1], e_col[1], E);
   int _next_state = 0;
   for (int i = 0; i < int(markov.Cols()); i++)
   {  if(markov[int(E[0])][i] > markov[int(E[0])][_next_state])
      {  _next_state = i;
      }
   }
   int _next_row = 0, _next_col = 0;
   SetMarkov(_next_state, _next_row, _next_col);
   transition_act = 0;
   for (int i = 0; i < THIS.actions; i++)
   {  if(Q[i][_next_row][_next_col] > Q[transition_act][_next_row][_next_col])
      {  transition_act = i;
      }
   }
}

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

SARSA достаточно надежен в работе с нестабильными рынками, учитывая ее внутреннюю структуру выбора действия перехода, как указано в функции Action, код которой приведен выше. Учитывая пару координат для текущего состояния среды, эти два значения необходимо преобразовать в один индекс, распознаваемый матрицей Маркова класса QL. Сделаем это с помощью функции Get Markov, код которой приведен ниже:

//+------------------------------------------------------------------+
// Getting markov index from environment row & col
//+------------------------------------------------------------------+
int Cql::GetMarkov(int Row, int Col)
{  return(Row + (THIS.environments * Col));
}

Вооружившись этим индексом, мы можем приступить к чтению строки нашей матрицы Маркова (представленной этим индексом), для которой столбец имеет наивысшее значение вероятности. Матрица Маркова особенно подходит для этого, поскольку она не буферизуется и не хранится каким-либо образом, как большинство распространенных индикаторов. Она не имеет памяти, что делает ее легко адаптируемой к неопределенным условиям, например, к ситуациям высокой волатильности. Таким образом, из строки матрицы Маркова для текущего состояния среды мы считываем столбец с наибольшей вероятностью, а его индекс даст нам целое число для следующего состояния среды. Это целое число снова необходимо будет разложить на два значения, аналогичные тем, с которых мы начали - индекс строки и индекс столбца.

Получив значения строк и столбцов, представляющие координаты следующего состояния, мы можем приступить к считыванию действия с наивысшим значением Q из нашей Q-карты. Индекс этого действия будет представлять то, что мы назвали "переходом" (transition action). Мы сталкиваемся с тремя возможными действиями, а именно: 0 — продать, 1 — ничего не делать и 2 — купить. Кроме того, окружающая среда ограничена тремя состояниями в трех "таймфреймах", которые рассматривает Q-Map.

Фактически мы используем только один таймфрейм. Читатель, конечно, может модифицировать код и вносить соответствующие изменения. Входной параметр m_scale определяет, насколько отслеживаются более крупные изменения "таймфрейма" при получении этих двухуровневых изменений, которые мы используем при отображении и определении состояний среды.

SARSA учитывает как действия, так и вознаграждения в рамках текущей политики, помогая стабилизировать процесс обучения в периоды высокой волатильности рынка. Это предотвращает резкие колебания в принятии решений, которые могут возникнуть из-за внезапных изменений на рынке, что делает его более подходящим для нестабильных рынков по сравнению с алгоритмами, не подчиняющимися политике, такими как Q-обучение. Как видно из нашего кода функции политики, представленного выше, мы обновляем значения для действия с индексом 1, а не с индексом 0, как это было в случае с алгоритмом Q-обучения.

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

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


Настройка SARSA для более сложных стратегий

Агрегация пространства состояний (State-Space Aggregation) в SARSA может быть способом разбиения сложных пространств состояний, особенно на финансовых рынках, где пространство состояний (динамика цен, индикаторы, рыночные условия, новости экономического календаря) может быть очень большим и непрерывным. Агрегация пространства состояний уменьшит эту сложность путем группировки схожих состояний в "агрегированные" или "абстрактные" состояния. Самым грубым примером этого могут служить наши состояния среды для этой статьи, которые представляют собой просто 3 немедленных изменения и более длительные изменения. Однако более изобретательное использование этого метода можно было бы осуществить при рассмотрении более многогранной среды, например, Q-карты, на каждой оси которой указаны данные о доходности 10-летних облигаций, базовые процентные ставки, индекс цен производителей (PPI), индекс потребительских цен (CPI) и уровень безработицы.

Учитывая природу Q-карт, эта информация будет применима к каждой валюте в торгуемой валютной паре. Таким образом, вместо того, чтобы разбираться с отдельными значениями для каждого из этих показателей, можно было бы объединить их так же, как мы это сделали для этой статьи, просто посчитав, увеличился ли каждый из этих показателей, остался ли он неизменным или уменьшился. Затем эти результаты будут использоваться для определения того, какой индекс необходимо назначить в каждой точке матрицы Q-Map, таким же образом, как мы назначили значения индекса в Q-Map для этой статьи.


Заключение

В этой статье мы рассмотрели еще один алгоритм обучения с подкреплением, SARSA. Стоит упомянуть, что реализация, которую мы использовали для первого алгоритма RL, учитывающего Q-обучение, а также для последующего алгоритма, который рассматривал глубокие Q-сети, не применяла должным образом марковский процесс принятия решений при выборе следующего действия. Вместо этого цепи Маркова были просто предоставлены как механизм взвешивания процесса обновления. Такое поведение было исправлено в текущей статье. Полный исходный код прилагается.

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

Прикрепленные файлы |
Cql.mqh (10.46 KB)
SignalWZ_43.mqh (7.47 KB)
wz_43.mq5 (6.6 KB)
Детерминированный осциллирующий поиск — Deterministic Oscillatory Search (DOS) Детерминированный осциллирующий поиск — Deterministic Oscillatory Search (DOS)
Алгоритм Deterministic Oscillatory Search (DOS) — инновационный метод глобальной оптимизации, сочетающий преимущества градиентных и роевых алгоритмов без использования случайных чисел. Механизм осцилляций и наклонов фитнеса позволяет DOS исследовать сложные пространства поиска детерминированным методом.
Ординальное кодирование номинальных переменных Ординальное кодирование номинальных переменных
В настоящей статье мы обсудим и продемонстрируем, как преобразовать номинальные предикторы в числовые форматы, подходящие для алгоритмов машинного обучения, используя как Python, так и MQL5.
Создаем интерактивную MQL5-панель с использованием класса Controls (Часть 2): Добавление отзывчивости кнопок Создаем интерактивную MQL5-панель с использованием класса Controls (Часть 2): Добавление отзывчивости кнопок
В этой статье мы преобразуем нашу статическую панель мониторинга MQL5 в интерактивный инструмент, добавив отзывчивость кнопок. Мы рассмотрим, как автоматизировать функционал компонентов графического интерфейса, гарантируя, что они будут правильно реагировать на нажатия пользователя. К концу статьи мы создадим динамический интерфейс, который повышает вовлеченность пользователей и удобство торговли.
Упрощаем торговлю на новостях (Часть 4): Повышаем производительность Упрощаем торговлю на новостях (Часть 4): Повышаем производительность
В этой статье будут рассмотрены методы улучшения работы советника в тестере стратегий, будет написан код для разделения времени новостных событий на почасовые категории. Доступ к этим новостным событиям будет осуществляться в течение указанного для них часа. Это гарантирует, что советник может эффективно управлять сделками на основе событий как в условиях высокой, так и низкой волатильности.