preview
Нейросети в трейдинге: Управление риском через распределение результатов (AC-SRM)

Нейросети в трейдинге: Управление риском через распределение результатов (AC-SRM)

MetaTrader 5Торговые системы |
34 0
Dmitriy Gizlyk
Dmitriy Gizlyk

Введение

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

Та же проблема возникает в обучении с подкреплением. В классическом Actor–Critic решение обычно строится вокруг ожидаемого вознаграждения. Критик оценивает последствия действия. Актер меняет политику так, чтобы увеличить эту оценку. Математическое ожидание удобно для оптимизации, но оно сворачивает распределение возможных результатов в одно число. Неблагоприятный хвост перестает быть виден как отдельная часть распределения.

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

Эту задачу рассматривают Mehrdad Moghimi и Hyejin Ku в работе "Risk-sensitive actor-critic with static spectral risk measures for online and offline reinforcement learning". Они предлагают фреймворк AC-SRM для прямой оптимизации статической спектральной меры риска. Спектральная мера работает с квантилями распределения возврата. Разные части распределения получают разный вес. Так политика учитывает не только среднее значение, но и структуру возможных исходов.

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

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


Алгоритм AC-SRM

Пусть Актер работает по политике π. На каждом шаге он получает вознаграждение rt.

Gπ = ∑t=0 γt rt.

В торговой задаче Gπ является накопленным результатом торговой стратегии. В момент открытия позиции нам неизвестно дальнейшее движение цены. Одно и то же состояние рынка может получить несколько продолжений. Действие связано не с одним будущим результатом, а с его распределением. Риск-нейтральная постановка использует математическое ожидание:

J(π) = E[Gπ].

Эта цель не различает форму распределения. Если частые убытки компенсируются редкими большими прибылями, среднее значение может выглядеть приемлемо. Но для управления капиталом этого недостаточно. AC-SRM вместо ожидания использует статическую Spectral Risk Measure:

J(π) = SRMφ(Gπ).

Пусть Z обозначает результат торговой операции. Квантильная функция FZ−1(u) показывает уровень результата для выбранной доли распределения. Например, при u = 0.1 мы смотрим на границу, ниже которой находится примерно 10% результатов. Спектральная мера объединяет такие уровни в одну оценку:

SRMφ(Z) = ∫01 FZ−1(u) φ(u) du.

Функция φ(u) задает профиль отношения к риску. В авторской постановке она неотрицательна, непрерывна слева и не возрастает. Ее интеграл в диапазоне [0,1] равен единице. Чем больше вес нижних квантилей, тем сильнее итоговая оценка реагирует на неблагоприятные исходы. К этому семейству относятся, в частности, CVaR и Mean-CVaR.

Форма спектра позволяет задавать разные профили риска. Для CVaR весь вес уровня α сосредоточен на нижней доле распределения: φα(u) = 1/α для u ≤ α и равен нулю выше этой границы. При α = 0.1 критерий фактически сосредоточен на худших 10% исходов. Для трейдера это уже не абстрактная формула, а явный акцент на зоне наиболее тяжелых потерь.

Mean-CVaR смешивает средний результат и CVaR. Параметр ω задает долю обычного математического ожидания. Оставшаяся часть веса относится к неблагоприятному хвосту. Авторы также рассматривают экспоненциальный, Dual Power, Wang и Proportional Hazard спектры. Они по-разному перераспределяют вес между квантилями.

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

Квантильная функция показывает диапазон возможных финансовых результатов. Спектр φ определяет, насколько важна каждая область этого диапазона. Один и тот же набор исходов можно оценивать по-разному при разных требованиях к риску.

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

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

Здесь проявляется главное несоответствие между статической мерой риска и обычным Actor–Critic. SRM оценивает полный возврат Gπ от начала до конца траектории. Actor–Critic обучается по отдельным переходам. Если просто подставлять локальную меру риска вместо Q-значения на каждом шаге, получится другая задача. Такая рекурсия уже не гарантирует оптимизацию исходной статической SRM.

Авторы AC-SRM решают проблему через supremum-представление спектральной меры. Для ограниченного спектра выполняется:

SRMφ(Z) = suph∈H { E[h(Z)] + ∫01 ĥ(φ(u)) du }.

Здесь H обозначает множество вогнутых функций, а — вогнутое сопряжение h. Формула выглядит абстрактно, но для дальнейшей логики нужен простой вывод. Статическую SRM можно представить через вспомогательную функцию h, которую подбирают по распределению возврата. После фиксации h политика снова оптимизируется средствами Actor–Critic. Супремум достигается функцией hφ,Z, зависящей от спектра риска и распределения Z.

Авторская работа даёт и явный вид функции, на которой достигается супремум:

hφ,Z(z) = ∫01 [FZ−1(α) + (z − FZ−1(α))/α] μ(dα).

Здесь μ является вероятностной мерой в диапазоне [0,1]. Она связана со спектром условием:

φ(u) = ∫u1 μ(dα)/α.

Отрицательная часть (x) означает min(x,0). Функция реагирует на переход результата ниже соответствующего квантиля. Эта конструкция позже приводит к кусочно-линейному приближению.

Для оптимальной h интегральный член с сопряжением обнуляется. Практический смысл этого результата важнее самой операции сопряжения: распределение возврата дает данные для обновления h. Отсюда появляется роль распределительного Критика во внешнем контуре.

Для фиксированной h авторы фреймворка вводят вспомогательную цель:

J(π,h) = E[h(Gπ)] + ∫01 ĥ(φ(u)) du.

Тогда исходная оптимизация принимает двухуровневый вид:

maxπ∈Π J(π) = maxh∈H ( maxπ∈Π J(π,h) ).

Получаем два связанных процесса. Внешний контур ищет функцию h для распределения возврата текущей политики. Внутренний контур оптимизирует политику при фиксированной h. Спектр φ при этом не меняется. Он по-прежнему задает выбранное отношение к риску.

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

Статическая SRM относится к возврату от начала траектории. На шаге t часть результата уже реализована. Одного текущего состояния рынка недостаточно, чтобы восстановить контекст полного возврата. Авторы решают эту проблему расширением пространства состояний:

t = (xt, st, ct).

Переменная st хранит накопленную дисконтированную награду, а ct содержит коэффициент дисконтирования к текущему моменту. В начале траектории используются значения s0 = 0,   c0 = 1. После очередного перехода они обновляются по формулам:

st+1 = st + ctrt,   ct+1 = γct.

Полный возврат разделяется на уже полученную и будущую части:

Gπ = s + cGπ(x̄,a).

В торговой интерпретации s отражает уже накопленный результат траектории. Величина Gπ(x̄,a) описывает будущее после текущего действия. Коэффициент c приводит будущую часть к общей точке отсчета. Благодаря этому одинаковое состояние рынка может получать разную риск-скорректированную оценку при разной истории накопленного результата.

Переменные s и c нужны также для приведения будущего возврата к той же точке отсчета, в которой задан полный результат стратегии. Пусть qα — квантиль полного возврата от начального состояния. На шаге t его нельзя напрямую сравнивать с Gπ(x̄,a): часть результата уже накоплена в s, а будущая часть входит в итог с коэффициентом c.

После преобразования глобальному уровню qα соответствует локальная граница (qαs)/c. С этой величиной можно сопоставлять будущий возврат Gπ(x̄,a). Если траектория уже накопила прибыль, до неблагоприятного глобального уровня остается больший запас. Если накоплен убыток, тот же уровень становится ближе. Риск-предпочтение не меняется, но его локальное выражение учитывает историю траектории.

Для торговли это естественная логика. Одинаковый сигнал рынка не всегда должен иметь одинаковую оценку. Решение после серии прибыльных переходов и решение после накопленной просадки находятся в разных точках полного распределения результата. Переменные s и c сохраняют эту разницу внутри марковского состояния.

Внутренний контур использует распределительный Критик. Он оценивает не одно ожидаемое значение, а распределение будущего возврата. Для фиксированной h риск-скорректированное значение действия определяется как:

Qhπ(x̄,a) = E[h(s + cGπ(x̄,a))] / c.

Деление на c компенсирует дисконтирование до текущего шага. Внутри h сначала восстанавливается полный возврат относительно начала траектории. Затем к нему применяется заданное риск-преобразование. В этом и состоит связь локального действия с общей статической целью.

Для стохастической политики значение состояния равно:

Vhπ(x̄) = Ea∼π(·|x̄)[Qhπ(x̄,a)].

Функция преимущества определяется привычно:

Ahπ(x̄,a) = Qhπ(x̄,a) − Vhπ(x̄).

После этого градиент политики сохраняет знакомую структуру Actor–Critic:

θJ(πθ,h) = E[∇θlog πθ(a|x̄) Ahπθ(x̄,a)] / (1 − γ).

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

Квантильное представление выполняет две роли. Во внутреннем контуре оно позволяет вычислять риск-скорректированное значение действия. Во внешнем контуре то же распределение из начального состояния используется для обновления h. Так распределительный Критик связывает оба контура фреймворка.

В своих экспериментах авторы AC-SRM используют квантильную регрессию с 50 квантилями. Функция h обновляется периодически по возврату начального состояния. Такая периодичность отделяет быстрые шаги обучения политики от более медленного внешнего обновления риска.

На их основе функция hφ,Z приближается кусочно-линейной функцией:

φ,Z(z) = Σi=1N wi[qi + (z − qi)/τ̂i],

где веса определяются выражением:

wi = τ̂i[φ(τi−1) − φ(τi)].

После такого приближения внешний контур становится вполне вычислимым. Отдельную нейронную сеть для функции риска обучать не нужно. Достаточно оценить квантили текущего распределения возврата и по закрытой формуле построить h.

Если z выше qi, отрицательная часть (zqi) равна нулю. Соответствующий компонент остается на уровне qi. Если z опускается ниже qi, компонент линейно реагирует на ухудшение результата. Веса wi определяются спектром φ. Одна функция объединяет фактическое распределение возврата и заданное отношение к риску.

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

Бесконечная на первый взгляд задача сводится к конечному набору qi и wi. Для реализации это принципиально. Вместо поиска функции риска во всем допустимом пространстве мы работаем с обычными массивами квантилей и весов.

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

Алгоритм 1 авторской работы собирает эти элементы в единый цикл. На итерации k берется текущее распределение Gπk. По нему строится новая функция hk+1:

hk+1 = h̃φ,Gπk.

Затем при фиксированной hk+1 выполняется внутренняя оптимизация:

πk+1 = arg maxπ J(π,hk+1).

После обновления политики распределительный оператор Беллмана формирует новое распределение возврата Gπk+1. Оно станет исходными данными следующей внешней итерации. Цикл замыкается: распределение возвратафункция рискаоптимизация политикиновое распределение возврата.

Во внешнем контуре используется распределение возврата начального состояния. Статическая цель J(π) определена для полного возврата всей траектории. Функция h должна согласовываться с распределением, которое политика формирует от начальной точки, а не с локальным распределением произвольного промежуточного состояния.

Если смотреть на цикл глазами трейдера, сначала обновляется представление о риске текущей стратегии, затем — торговая политика. После изменения политики меняется и распределение ее результатов. На следующем внешнем шаге функция h перестраивается уже под новое распределение. Так риск-профиль φ остается заданным, а его применение следует за фактической формой результатов стратегии.

Для трейдера риск здесь оценивается на уровне законченной торговой траектории. Промежуточные состояния нужны для обучения решений, но они остаются привязанными к общей точке отсчета через s и c. Локальная оценка действия сохраняет связь с финансовым результатом, для которого изначально задан спектр φ.

Локальные оценки нужны для градиента политики. Распределение начального возврата требуется для внешнего обновления функции h. Если смешать эти уровни, модель начнет оптимизировать не ту статическую меру риска, которая задана в постановке AC-SRM. На следующих этапах реализации мы сохраняем границы между внутренним и внешним контурами. Заодно это упростит проверку отдельных вычислительных блоков на реальных рыночных данных.

Функция h не меняется на каждом шаге обновления политики. Внутренний Actor–Critic некоторое время работает с фиксированной h. Лишь затем внешний контур снова обращается к распределению полного возврата. Это разделение не дает целевой функции уплывать вместе с каждым локальным обновлением.

Авторский алгоритм 2 уточняет онлайн-реализацию AC-SRM. Для борьбы с переоценкой используются два Критика. Целевая сеть стабилизирует расчет будущих значений, а политика обновляется реже, чем Критики. Эти приемы не меняют двухуровневую постановку. Они делают внутренний Actor–Critic устойчивее при работе с нейросетевой аппроксимацией.

Авторы AC-SRM также доказывают сходимость алгоритма для конечных пространств состояний и действий. При заданных в работе условиях внутренняя оптимизация сходится к оптимальной политике в рассматриваемом классе. Для полного двухуровневого процесса показано монотонное улучшение целевой функции и сходимость последовательности J(π).

Эти гарантии нужно читать в рамках условий авторских теорем. В нашей торговой модели состояние непрерывно, а рыночные данные не стационарны. Формальное доказательство нельзя автоматически переносить на такой эксперимент. Для нас этот результат прежде всего показывает, что двухуровневая схема AC-SRM математически согласована в исходной постановке.

Тот же математический каркас авторы расширяют на другие режимы обучения. OAC-SRM предназначен для офлайн-данных и добавляет ограничение политики. Для детерминированных политик предложены TD3-SRM и TD3BC-SRM. Во всех вариантах сохраняется основная идея: статическая SRM оптимизируется через распределение возврата и функцию h, а не через последовательное применение локальной меры риска.

После теоретического разбора становится понятна ближайшая инженерная задача. Нужен распределительный Критик, способный различать разные области возможного результата. Позже это представление свяжем с функцией h и двухуровневым циклом AC-SRM.

Авторская визуализация фреймворка AC-SRM


Реализация средствами MQL5

В предыдущих работах мы уже реализовали распределенное Q-обучение, квантильную регрессию и Fully Parameterized Quantile Function (FQF). На этой базе и сделаем первый практический шаг. Сегодня ограничимся OpenCL-кернелом FQF_DistributionTargetGradient. Его задача локальна: получить распределение и одно скалярное целевое значение, найти ближайшего представителя и сформировать градиенты его значения и вероятности.

Пусть распределение задано представителями zi и вероятностями pi. Для цели y вычисляется расстояние

di = |zi − y|.

После этого выбирается ближайший представитель

k = arg mini di.

Ненулевой градиент получает только выбранный элемент. Такой примитив не реализует AC-SRM целиком. Он решает одну проверяемую задачу. Это позволяет отдельно контролировать корректность распределительного представления до сборки более сложных объектов.

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

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

Операция хорошо ложится на GPU. Все представители одного распределения независимо сравниваются с общей целью. После этого остается найти минимальное расстояние. Представителей удобно разместить внутри одной рабочей группы OpenCL и выполнить поиск общей редукцией.

Кернел формирует два выхода. Буфер quantiles_gr содержит градиент положения представителя. Буфер probabilities_gr — градиент его вероятности. Для FQF это разные задачи: первое значение отвечает за положение элемента на оси результата, второе — за его массу в распределении.

__kernel void FQF_DistributionTargetGradient(__global float *quantiles,
                                             __global float *probabilities,
                                             __global float *quantiles_gr,
                                             __global float *probabilities_gr,
                                             const float target,
                                             const float probability_weight,
                                             const float value_weight)
  {
   const size_t i = get_local_id(0);
   const size_t total = get_local_size(0);
   const size_t v = get_global_id(1);
   const size_t total_v = get_global_size(1);
//---
   __local float Temp[LOCAL_ARRAY_SIZE];

Каждая рабочая группа обрабатывает одно распределение. Локальный индекс i выбирает его представителя. Переменная total содержит число представителей. Второе измерение NDRange задает номер обрабатываемого распределения. Для него используются индексы v и total_v.

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

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

Локальный массив Temp нужен для редукций внутри рабочей группы. Он позволяет всем потокам совместно найти лучший кандидат без переноса промежуточных данных на CPU.

//--- invalid target or quantile maps to MAX_VALUE and cannot win
//--- the nearest-representative reduction
   const int target_valid = !(isnan(target) || isinf(target));
   const float zi = quantiles[RCtoFlat(v,i,total_v,total,0)];
   const int z_valid = target_valid && !(isnan(zi) || isinf(zi));
   const float distance = (z_valid ? fabs(zi - target) : MAX_VALUE);
   const float min_distance = LocalMin(distance, 0, Temp);
   BarrierLoc;

Сначала проверяется корректность target. Значения NaN и бесконечность не должны участвовать в выборе. Затем каждый поток читает свой zi из массива quantiles. Метод RCtoFlat переводит двумерные индексы в адрес линейного GPU-буфера.

Для допустимого значения вычисляется |ziy|. Некорректный кандидат получает MAX_VALUE. Такой поток остается участником общей редукции, но не может выиграть поиск минимума. Метод LocalMin возвращает минимальное расстояние dmin.

Недопустимые числа обрабатываются без раннего выхода из кернела, что принципиально при локальных барьерах. Если часть потоков выйдет до синхронизации, рабочая группа может зависнуть или перейти в неопределенное состояние. Подмена расстояния на MAX_VALUE сохраняет одинаковый путь исполнения.

Проверка цели выполняется каждым потоком. Это небольшое дублирование вычислений. Зато оно не требует дополнительного обмена данными и оставляет код редукции простым. На GPU такая цена значительно ниже возможной сложности ветвления вокруг барьеров.

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

//--- among equally close representatives select the maximum centroid;
//--- this makes an ambiguous Critic correction act on the
//--- overestimated representative
   float centroid_candidate = MIN_VALUE;
   if(z_valid && distance == min_distance)
      centroid_candidate = zi;
   const float selected_centroid = LocalMax(centroid_candidate, 0, Temp);
   BarrierLoc;

Потоки с расстоянием dmin передают свои значения как кандидатов. Остальные используют MIN_VALUE. Метод LocalMax выбирает максимальный центроид среди равноудаленных представителей. Если цель находится ровно между двумя значениями, коррекция направляется на верхнего представителя. Так неоднозначный случай не зависит от порядка выполнения потоков.

Правило выбора верхнего представителя важно для воспроизводимости обучения. Без него одинаковое минимальное расстояние оставляло бы несколько допустимых получателей градиента. Конкретный результат мог зависеть от реализации редукции. Здесь порядок задан явно: минимальное расстояние, затем максимальный центроид.

Для Критика этот tie-break задает понятное направление коррекции. Если два представителя равноудалены от цели, выбирается переоцененный. Его значение затем сдвигается вниз к цели. В неоднозначном случае остается только один ненулевой путь градиента.

Теоретически совпасть могут не только расстояния. Несколько элементов способны содержать одинаковый центроид. Эту неоднозначность снимает еще один tie-break.

//--- if several representatives have exactly the same selected
//--- centroid, use the minimal index only as a deterministic tie-break
   float index_candidate = MAX_VALUE;
   if(z_valid && zi == selected_centroid)
      index_candidate = (float)i;
   const float selected_index = LocalMin(index_candidate, 0, Temp);
   const int found = (selected_index >= 0.0f && selected_index < (float)total);
   const size_t k = (found ? (size_t)selected_index : total);

На следующем этапе кандидаты передают свои индексы. Метод LocalMin выбирает минимальный индекс среди элементов с выбранным центроидом. Флаг found подтверждает корректность результата. Если допустимого представителя нет, индекс k устанавливается за пределами рабочего диапазона. В этом случае градиенты останутся нулевыми.

После выбора единственного представителя можно сформировать два градиентных сигнала.

   const float pi = IsNaNOrInf(probabilities[RCtoFlat(v,i,total_v,total,0)], 0.0f);
//--- value gradient
   quantiles_gr[RCtoFlat(v,i,total_v,total,0)] =
      (found && i == k ? value_weight * (target - zi) : 0.0f);
//--- probability gradient at SoftMax output
   probabilities_gr[RCtoFlat(v,i,total_v,total,0)] =
      (found && i == k ? probability_weight / (pi + 1.0e-37f) : 0.0f);
  }

Вероятность pi читается из массива probabilities. Метод IsNaNOrInf заменяет некорректное значение нулем. Градиент значения записывается в quantiles_gr только для выбранного элемента:

giz = λz(y − zi), если i = k; иначе giz = 0.

Коэффициент λz задается параметром value_weight. Если представитель ниже цели, сигнал направляет его вверх. Если он выше цели, знак меняется.

Градиент вероятности записывается в probabilities_gr:

gip = λp/(pi + ε), если i = k; иначе gip = 0,   ε = 10−37.

Коэффициент λp задается параметром probability_weight. Деление на pi формирует градиентный сигнал на выходе SoftMax. Чем меньше текущая вероятность выбранного представителя, тем больше модуль этого сигнала. Малое ε защищает вычисление от деления на ноль. Обратный проход через SoftMax выполняется уже на следующем этапе.

Оба градиента записываются для каждого элемента массива. После выполнения кернела выходные буферы полностью определены. Выбранный представитель получает рассчитанное значение. Остальные позиции получают ноль. Следующий этап обратного прохода не должен предварительно очищать эти области памяти. Такая обратная зависимость от pi хорошо читается и без формул. Редкий представитель получает сильный сигнал, если наблюдение попало именно в его область. Для уже вероятного представителя такая же цель меняет массу слабее. Добавка ε здесь играет только численную роль.

Один вызов FQF_DistributionTargetGradient выполняет две связанные коррекции. Значение выбранного представителя получает сигнал в сторону наблюдаемой цели. Его вероятность получает отдельный подтверждающий сигнал. Остальные элементы в этом вызове получают нулевой градиент.

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

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

Кернел еще не знает о спектре φ и функции h. Он не реализует и внешний контур AC-SRM. Пока нам нужна надежная распределительная основа. Более крупные компоненты будем собирать вокруг нее в следующей работе.


Заключение

В этой статье мы поставили задачу включить управление риском непосредственно в обучение торговой политики. Одного среднего возврата для этого мало. AC-SRM использует статическую спектральную меру риска, которая учитывает форму распределения результата и задает вес его разных областей.

Мы разобрали авторское supremum-представление SRM и двухуровневую оптимизацию. Внешний контур строит функцию h по распределению полного возврата. Внутренний Actor–Critic обучает политику при фиксированной h. Расширенное состояние сохраняет уже накопленный результат и коэффициент дисконтирования. Распределительный Критик связывает оба контура через квантильное описание возврата.

Практическую адаптацию начали с OpenCL-кернела FQF_DistributionTargetGradient. Он находит ближайшего представителя распределения и формирует градиенты его положения и вероятности. Мы получили первый проверяемый примитив будущего распределительного Критика. В следующей статье продолжим собирать вокруг него более крупные компоненты AC-SRM.


Ссылки


Программы, используемые в статье

# Имя Тип Описание
1 Trajectory.mqh Общий модуль Построение моделей и вспомогательные функции обучения
2 StudyForecast.mq5 Советник Обучение прогнозной модели
3 Study.mq5 Советник Обучение базовой модели
4 StudyOnline.mq5 Советник Онлайн-обучение модели
5 Test.mq5 Советник Тестирование модели на отложенном периоде
6 NeuroNet.mqh Библиотека классов Библиотека классов нейронных сетей
7 NeuroNet.cl OpenCL-программа OpenCL-ядра библиотеки нейронных сетей

Проект представлен на forge.mql5.io/dng.


Прикрепленные файлы |
MQL5.zip (7367.15 KB)
Особенности написания Пользовательских Индикаторов Особенности написания Пользовательских Индикаторов
Написание пользовательских индикаторов в торговой системе MetaTrader 4
Использование Экономического календаря MQL5 для фильтрации новостей (Часть 1): Реализация временных окон до и после новостей в MQL5 Использование Экономического календаря MQL5 для фильтрации новостей (Часть 1): Реализация временных окон до и после новостей в MQL5
Мы разработаем новостной фильтр на основе календаря на языке MQL5 без веб-запросов и внешних DLL. В части 1 рассматриваются загрузка и кэширование событий, сопоставление символов с валютами, фильтрация по уровню важности, определение окон до и после новостей, блокировка открытия новых сделок во время активного новостного периода и опциональное закрытие позиций перед новостью. В результате получается настраиваемый защитный механизм, совместимый с требованиями проп-фирм, который сокращает число ошибочных пауз в торговле и защищает входы в сделки в периоды волатильности.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Мастер-класс по созданию пользовательских индикаторов (Часть 2): Разработка практического советника Supertrend на MQL5 Мастер-класс по созданию пользовательских индикаторов (Часть 2): Разработка практического советника Supertrend на MQL5
Узнайте, как с нуля создать советник на основе индикатора Supertrend на языке MQL5. В статье рассматриваются встраивание индикатора в качестве ресурса, считывание значений его буферов на закрытых барах, обнаружение подтвержденных смен направления, приведение позиций в соответствие с сигналом и переворот позиций, а также настройка режимов стоп-лосса и размера позиции. В заключение рассматриваются настройка Тестера стратегий и проведение воспроизводимых тестов. В результате получается настраиваемый советник и четкая основа для дальнейших исследований и доработок.