Перейти к содержимому

Глава 298: C51 Распределительное обучение с подкреплением для трейдинга

1. Введение

Традиционные алгоритмы обучения с подкреплением для трейдинга, такие как Deep Q-Networks (DQN), обучают единственное ожидаемое значение для каждой пары состояние-действие. Хотя этот подход показал впечатляющие результаты во многих областях, он принципиально отбрасывает огромный объём информации о базовом распределении доходности. На финансовых рынках, где управление рисками имеет первостепенное значение, а распределения доходности далеки от нормального, это ограничение может быть критическим.

C51 (Categorical 51-atom) — это алгоритм распределительного обучения с подкреплением, представленный Бельмаром, Дабни и Мюно в 2017 году. Вместо изучения единственного скалярного Q-значения, C51 обучает полное распределение вероятностей доходности. Он делает это, представляя распределение как категориальное распределение по фиксированному набору из 51 равномерно расположенного «атома», охватывающего заданный диапазон возможных значений.

Название «C51» происходит от использования 51 категории (атома) для дискретизации распределения доходности. Это, казалось бы, простое изменение от точечных оценок к распределениям даёт замечательные улучшения как в стабильности обучения, так и в конечной производительности. Для торговых приложений преимущества ещё более выражены: распределительное RL естественным образом обеспечивает принятие решений с учётом рисков, захватывает мультимодальные распределения доходности, характерные для финансовых рынков, и позволяет реализовать сложные стратегии управления рисками, далеко выходящие за рамки возможностей методов с точечными оценками.

В этой главе мы создаём полную реализацию C51 на Rust, интегрируем её с данными биржи Bybit в реальном времени и демонстрируем, как распределительное RL трансформирует подход агента к принятию торговых решений.

2. Математические основы

2.1 Распределение значений

В стандартном RL мы обучаем ожидаемую доходность:

Q(s, a) = E[Z(s, a)]

где Z(s, a) — случайная величина, представляющая доходность. C51 вместо этого обучает полное распределение Z(s, a).

2.2 51 атом

C51 дискретизирует распределение доходности на фиксированную опору из 51 атома:

z_i = V_min + i * dz, i = 0, 1, ..., 50
dz = (V_max - V_min) / 50

где V_min и V_max определяют диапазон возможных доходностей. Для каждой пары состояние-действие (s, a) сеть выводит вектор вероятностей p(s, a) длиной 51, где p_i(s, a) представляет вероятность того, что доходность равна z_i.

Ожидаемое Q-значение можно восстановить:

Q(s, a) = sum_{i=0}^{50} p_i(s, a) * z_i

2.3 Проецированное обновление Беллмана

Распределительное уравнение Беллмана:

Z(s, a) =_D r + gamma * Z(s', a*)

где =_D обозначает равенство по распределению. Целевое распределение вычисляется следующим образом:

  1. Для каждого атома z_j в целевом распределении вычисляем проецированный атом:
T_z_j = clip(r + gamma * z_j, V_min, V_max)
  1. Находим позицию на опоре:
b_j = (T_z_j - V_min) / dz
  1. Распределяем вероятность p_j(s', a*) на два ближайших атома с помощью линейной интерполяции:
l = floor(b_j)
u = ceil(b_j)
m_l += p_j(s', a*) * (u - b_j)
m_u += p_j(s', a*) * (b_j - l)

Этот шаг проекции критически важен: он гарантирует, что целевое распределение всегда представлено на той же фиксированной опоре, что и предсказанное распределение.

2.4 Потеря KL-дивергенции

Сеть обучается путём минимизации KL-дивергенции (перекрёстной энтропии) между проецированным целевым распределением m и предсказанным распределением p:

L = -sum_{i=0}^{50} m_i * log(p_i(s, a))

Это эквивалентно потере перекрёстной энтропии, что является естественным выбором для сравнения распределений вероятностей.

2.5 Выход Softmax

Сеть выводит необработанные логиты для каждого атома, которые преобразуются в вероятности с помощью softmax:

p_i(s, a) = exp(logit_i) / sum_{j=0}^{50} exp(logit_j)

Это гарантирует, что выход формирует корректное распределение вероятностей (неотрицательное, с суммой равной единице).

3. Почему распределения лучше точечных оценок для трейдинга

3.1 Осознание рисков

Финансовые рынки демонстрируют распределения с тяжёлыми хвостами, значительной асимметрией и эксцессом. Точечная оценка Q-значения +5% может соответствовать совершенно разным профилям риска:

  • Сценарий A: Почти гарантированная доходность 5% (низкий риск)
  • Сценарий B: 50% вероятность +15%, 50% вероятность -5% (высокий риск)

Оба имеют одинаковое ожидаемое значение, но трейдер, осознающий риски, безусловно предпочтёт Сценарий A. C51 естественным образом различает эти случаи, поскольку обучает полное распределение.

3.2 Мультимодальные доходности

Финансовые доходности часто демонстрируют несколько мод. Например, перед объявлением о прибыли акция может иметь два вероятных исхода: значительный рост или значительное падение. Точечная оценка усредняет их, потенциально предсказывая близкую к нулю доходность, что искажает оба исхода. C51 напрямую захватывает бимодальную природу.

3.3 Управление хвостовыми рисками

Изучая нижний хвост предсказанного распределения доходности, агент C51 может оценивать Value at Risk (VaR) и Conditional Value at Risk (CVaR) непосредственно из своих обученных распределений. Это позволяет реализовать торговые стратегии с ограничениями по риску:

VaR_alpha = z_k где sum_{i=0}^{k} p_i >= alpha
CVaR_alpha = (1/alpha) * sum_{i=0}^{k} p_i * z_i

3.4 Улучшенная динамика обучения

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

3.5 Обнаружение режимов

Различные рыночные режимы (трендовый, возврат к среднему, высокая волатильность) производят характерно различные распределения доходности. Агент C51 неявно обучается распознавать эти режимы через форму своих предсказанных распределений, что позволяет адаптивно выбирать стратегии.

4. Реализация на Rust

Наша реализация на Rust состоит из нескольких ключевых компонентов:

4.1 Архитектура сети C51

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

Вход: состояние (признаки)
-> Скрытый слой 1 (128 нейронов, ReLU)
-> Скрытый слой 2 (128 нейронов, ReLU)
-> Выход: num_actions * 51 логитов
-> Преобразование в [num_actions, 51]
-> Softmax для каждого действия -> вероятности

4.2 Основные компоненты

  • C51Network: Нейронная сеть, отображающая состояния в распределения вероятностей по атомам для каждого действия.
  • CategoricalProjection: Проецирует целевое распределение на фиксированную опору из 51 атома после применения обновления Беллмана.
  • ReplayBuffer: Воспроизведение опыта с равномерной выборкой для стабильного обучения.
  • C51Agent: Управляет циклом обучения с epsilon-жадной стратегией исследования.
  • BybitClient: Получает данные OHLCV из API Bybit для интеграции с реальным рынком.

4.3 Цикл обучения

для каждого эпизода:
состояние = среда.сброс()
пока не завершено:
действие = epsilon_жадный(состояние)
след_состояние, награда, завершено = среда.шаг(действие)
буфер.добавить(состояние, действие, награда, след_состояние, завершено)
если буфер.длина() >= размер_батча:
батч = буфер.выборка(размер_батча)
целевое_распр = проекция_распределения(батч)
потеря = перекрёстная_энтропия(предсказанное_распр, целевое_распр)
обновить_веса(потеря)
периодически: копировать веса в целевую сеть

4.4 Инженерия признаков

Вектор состояния включает технические индикаторы, вычисленные из сырых данных OHLCV:

  • Логарифмические доходности за несколько таймфреймов (1, 5, 10, 20 свечей)
  • Нормализованный объём относительно скользящей средней
  • RSI (Индекс относительной силы)
  • Ширина и позиция полос Боллинджера
  • Пересечение сигнальной линии MACD

5. Интеграция с Bybit

Реализация получает реальные рыночные данные из API биржи Bybit:

// Получение часовых свечей BTCUSDT
let client = BybitClient::new();
let klines = client.fetch_klines("BTCUSDT", "60", 1000).await?;

5.1 Конечные точки API

Мы используем конечную точку Bybit V5 API для данных свечей (kline):

GET https://api.bybit.com/v5/market/kline?category=linear&symbol=BTCUSDT&interval=60&limit=1000

5.2 Конвейер обработки данных

  1. Получение: Сырые данные OHLCV из Bybit
  2. Парсинг: Преобразование JSON-ответа в структурированные объекты Kline
  3. Вычисление признаков: Расчёт технических индикаторов из сырых цен
  4. Нормализация: Масштабирование признаков до подходящих диапазонов для входа нейронной сети
  5. Разделение: Деление на периоды обучения и оценки

5.3 Моделирование среды

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

  • Действия: Купить (0), Продать (1), Удерживать (2)
  • Награда: Логарифмическая доходность позиции с момента последнего действия
  • Отслеживание позиции: Поддержание текущего состояния позиции
  • Транзакционные издержки: Настраиваемая модель комиссий (по умолчанию 0.075% для фьючерсов Bybit)

6. Ключевые выводы

  1. Распределительное RL даёт полную картину: Обучая распределения доходности вместо точечных оценок, C51 обеспечивает принципиально более богатое представление ценности, которое естественно согласуется с управлением финансовыми рисками.

  2. 51 атом — оптимальный баланс: Выбор 51 атома обеспечивает достаточное разрешение для захвата важных характеристик распределения (мультимодальность, асимметрия, хвостовой риск) при сохранении вычислительной эффективности.

  3. Проецированное обновление Беллмана необходимо: Шаг категориальной проекции обеспечивает математическую согласованность при распространении распределений через уравнение Беллмана и является ключевой алгоритмической инновацией C51.

  4. Метрики риска получаются бесплатно: VaR, CVaR и другие меры риска могут быть вычислены непосредственно из обученных распределений без дополнительного моделирования.

  5. Лучшие градиенты приводят к лучшему обучению: Потеря перекрёстной энтропии по распределениям обеспечивает более богатую градиентную информацию, чем скалярная TD-ошибка, что приводит к более стабильному и эффективному обучению.

  6. Осознание рыночных режимов: Форма предсказанных распределений доходности неявно кодирует информацию о рыночном режиме, что позволяет использовать адаптивные торговые стратегии.

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

  8. Визуализация распределений помогает интерпретации: В отличие от непрозрачных точечных оценок, распределительные выходы C51 могут быть визуализированы и интерпретированы, давая трейдерам понимание логики и уровня уверенности агента.

Ссылки

  • Bellemare, M. G., Dabney, W., & Munos, R. (2017). “A Distributional Perspective on Reinforcement Learning.” ICML.
  • Dabney, W., Rowland, M., Bellemare, M. G., & Munos, R. (2018). “Distributional Reinforcement Learning with Quantile Regression.” AAAI.
  • Barth-Maron, G., et al. (2018). “Distributed Distributional Deterministic Policy Gradients.” ICLR.
  • Документация Bybit API: https://bybit-exchange.github.io/docs/v5/intro