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

Глава 295: DDPG для трейдинга

1. Введение: Deep Deterministic Policy Gradient для торговли с непрерывными действиями

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

Deep Deterministic Policy Gradient (DDPG) решает эту проблему, работая непосредственно в непрерывных пространствах действий. Представленный Lillicrap et al. (2015), DDPG сочетает идеи теории детерминированного градиента политики (DPG) с репрезентативной мощью глубоких нейронных сетей. Это алгоритм типа актор-критик, безмодельный, который обучает детерминированную политику, отображающую состояния в непрерывные действия.

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

Почему DDPG для трейдинга?

  1. Непрерывный размер позиции: точные доли распределения вместо дискретных лотов.
  2. Гладкое обучение политики: детерминированный градиент политики обеспечивает градиенты с меньшей дисперсией по сравнению с методами стохастического градиента.
  3. Эффективность по выборкам: обучение вне политики с буфером воспроизведения позволяет повторно использовать исторические переходы.
  4. Масштабируемость: архитектура актор-критик разделяет оценку политики и улучшение политики.

В этой главе мы разрабатываем DDPG с нуля, выводим ключевые математические результаты, реализуем алгоритм на Rust с акцентом на производительность и безопасность, и демонстрируем его применение к торговле криптовалютами с использованием данных Bybit.


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

2.1 Марковский процесс принятия решений для непрерывного управления

Мы моделируем торговую среду как марковский процесс принятия решений (MDP), определяемый кортежем (S, A, P, R, gamma), где:

  • S — пространство состояний (рыночные признаки: цены, объёмы, технические индикаторы)
  • A — непрерывное пространство действий, A является подмножеством R^d (например, размер позиции в [-1, 1])
  • P(s’|s, a) — вероятность перехода
  • R(s, a, s’) — функция вознаграждения (например, PnL с поправкой на риск)
  • gamma из [0, 1) — коэффициент дисконтирования

2.2 Теорема о детерминированном градиенте политики

В отличие от стохастических политик pi(a|s), которые выдают распределение вероятностей по действиям, детерминированная политика mu: S -> A напрямую отображает состояния в действия:

a = mu(s)

Цель — максимизировать ожидаемое кумулятивное дисконтированное вознаграждение:

J(mu) = E[sum_{t=0}^{inf} gamma^t * R(s_t, mu(s_t), s_{t+1})]

Теорема о детерминированном градиенте политики (Silver et al., 2014) утверждает, что градиент J по параметрам политики theta равен:

nabla_theta J(mu_theta) = E_s ~ rho^mu [nabla_theta mu_theta(s) * nabla_a Q^mu(s, a)|_{a=mu_theta(s)}]

где rho^mu — распределение состояний при политике mu, а Q^mu(s, a) — функция ценности действия. Этот результат замечателен тем, что не требует интегрирования по пространству действий, в отличие от теоремы о стохастическом градиенте политики, что делает его вычислительно эффективным для непрерывных пространств действий.

2.3 Архитектура актор-критик

DDPG использует две нейронные сети:

Актор mu(s; theta^mu): отображает состояния в детерминированные действия.

Критик Q(s, a; theta^Q): оценивает функцию ценности действия для любой пары состояние-действие.

Критик обновляется минимизацией ошибки временной разности (TD):

L(theta^Q) = E_{(s,a,r,s') ~ D} [(r + gamma * Q'(s', mu'(s'; theta^{mu'}); theta^{Q'}) - Q(s, a; theta^Q))^2]

где D — буфер воспроизведения, а сети со штрихами — целевые сети.

Актор обновляется с использованием выборочного градиента политики:

nabla_{theta^mu} J approx (1/N) * sum_i nabla_{theta^mu} mu(s_i; theta^mu) * nabla_a Q(s_i, a; theta^Q)|_{a=mu(s_i)}

2.4 Целевые сети и мягкие обновления

Прямой бутстрэппинг с быстро меняющимся критиком приводит к нестабильности. DDPG решает это через целевые сети — медленно обновляемые копии актора и критика:

theta^{Q'} <- tau * theta^Q + (1 - tau) * theta^{Q'}
theta^{mu'} <- tau * theta^mu + (1 - tau) * theta^{mu'}

где tau << 1 (обычно tau = 0.005). Это усреднение Поляка гарантирует, что целевые значения изменяются медленно, стабилизируя обучение.

2.5 Шум Орнштейна-Уленбека для исследования

Поскольку политика детерминирована, исследование должно добавляться извне. DDPG использует временно коррелированный шум Орнштейна-Уленбека (OU), который подходит для физического управления и трейдинга, поскольку создаёт гладкие, возвращающиеся к среднему возмущения:

dx_t = theta_ou * (mu_ou - x_t) * dt + sigma * dW_t

В дискретном времени:

x_{t+1} = x_t + theta_ou * (mu_ou - x_t) + sigma * N(0, 1)

Параметры:

  • theta_ou (скорость возврата к среднему): контролирует, как быстро шум возвращается к mu_ou
  • mu_ou (долгосрочное среднее): обычно 0 для симметричного исследования
  • sigma (волатильность): контролирует величину исследования

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

2.6 Буфер воспроизведения

Буфер воспроизведения опыта хранит переходы (s, a, r, s’) в буфере фиксированного размера и выбирает мини-батчи равномерно случайным образом для обучения. Это разрывает временные корреляции в потоке данных и позволяет использовать каждый переход для нескольких обновлений градиента, повышая эффективность по выборкам.


3. Применения в трейдинге

3.1 Непрерывный размер позиции

Основное применение DDPG в трейдинге — непрерывный размер позиции. Агент наблюдает вектор состояния, построенный из рыночных признаков, и выдаёт сигнал позиции в [-1, 1]:

  • +1: Максимальная длинная позиция (полностью инвестировано)
  • 0: Нет позиции (в деньгах)
  • -1: Максимальная короткая позиция (полностью в шорте)

Промежуточные значения представляют дробные позиции. Например, выход +0.3 означает распределение 30% доступного капитала в длинную позицию.

Признаки состояния обычно включают:

  • Нормализованные ценовые доходности за несколько горизонтов
  • Нормализованный объём
  • Технические индикаторы (RSI, MACD, ширина полос Боллинджера)
  • Текущий размер позиции
  • Нереализованная прибыль/убыток
  • Временные признаки (час дня, день недели)

Проектирование функции вознаграждения критически важно. Распространённые варианты:

  • Простая PnL: r_t = position_t * return_{t+1}
  • С поправкой на риск: r_t = position_t * return_{t+1} - lambda * (position_t * return_{t+1})^2
  • По мотивам Шарпа: скользящий коэффициент Шарпа за окно
  • С штрафом за просадку: PnL минус штраф за просадки

3.2 Непрерывный размер ордера для крипторынков

Криптовалютные рынки на биржах вроде Bybit обладают свойствами, делающими DDPG особенно подходящим:

  1. Дробный размер: криптоактивы бесконечно делимы, что делает непрерывный размер позиции естественным.
  2. Рынки 24/7: непрерывная работа обеспечивает обилие обучающих данных.
  3. Высокая волатильность: агент должен научиться модулировать размеры позиций с волатильностью — естественно непрерывная задача управления.
  4. Кредитное плечо: Bybit предлагает до 100x плеча; DDPG может обучить оптимальные коэффициенты плеча как непрерывную переменную.

Агент DDPG может быть обучен:

  • Размерять позиции пропорционально уверенности в сигнале
  • Снижать экспозицию в режимах высокой волатильности
  • Постепенно наращивать или сворачивать позиции для минимизации влияния на рынок
  • Обучать оптимальное плечо как часть непрерывного пространства действий

3.3 Мультиактивное расширение

Для мультиактивных портфелей пространство действий расширяется до R^n, где n — количество активов. DDPG обрабатывает это естественно:

a = [w_1, w_2, ..., w_n], где sum |w_i| <= 1

Каждый w_i представляет вес портфеля для актива i, а ограничение может быть реализовано через нормализацию или штрафные члены в вознаграждении.


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

Наша реализация на Rust предоставляет полноценную систему DDPG производственного класса со следующими компонентами:

Обзор архитектуры

ddpg_trading/
rust/
src/lib.rs -- Основные компоненты DDPG
examples/
trading_example.rs -- Интеграция с Bybit и цикл обучения
Cargo.toml

Основные компоненты в lib.rs:

  1. ActorNetwork: Сеть прямого распространения, отображающая векторы состояния в непрерывные действия в [-1, 1] через активацию tanh. Реализована с ручными матрицами весов и прямым распространением с использованием ndarray.

  2. CriticNetwork: Принимает конкатенированные векторы состояние-действие и выдаёт скалярные Q-значения. Использует скрытые слои с ReLU и линейный выход.

  3. TargetNetwork: Обёртывает актор и критик с мягкими обновлениями Поляка (tau = 0.005).

  4. OUNoise: Процесс Орнштейна-Уленбека для временно коррелированного шума исследования с настраиваемым возвратом к среднему, волатильностью и затуханием.

  5. ReplayBuffer: Кольцевой буфер фиксированной ёмкости, хранящий кортежи (состояние, действие, вознаграждение, следующее_состояние, завершено) с равномерной случайной выборкой.

  6. DDPGAgent: Управляет полным циклом обучения: выбор действий с шумом, хранение опыта, выборка мини-батчей, обновление градиентов критика и актора, мягкие обновления целевых сетей.

  7. BybitClient: Асинхронный HTTP-клиент для получения данных OHLCV из API Bybit v5.

Ключевые проектные решения

  • Без внешних ML-фреймворков: все операции нейронных сетей реализованы с нуля с использованием ndarray, обеспечивая прозрачность и образовательную ценность.
  • Числовая стабильность: аккуратное использование ограничения tanh и клиппинга градиентов предотвращает расхождение.
  • Эффективность буфера воспроизведения: использует кольцевой буфер с O(1) вставкой и O(k) выборкой для мини-батчей размера k.
  • Разделение ответственности: торговая среда, алгоритм DDPG и получение данных чётко разделены.

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

Реализация получает данные OHLCV (Open, High, Low, Close, Volume) из публичного API Bybit v5:

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

Это возвращает часовые свечи для бессрочных фьючерсов BTCUSDT. Данные обрабатываются в признаки состояния:

  • Нормализованные доходности: (close - prev_close) / prev_close
  • Нормализованный объём: volume / скользящее_среднее_объёма
  • Простые технические индикаторы, вычисленные из ценового ряда

API-ключи не требуются для публичных конечных точек рыночных данных, что делает этот пример сразу запускаемым.

Конвейер данных

  1. Получение: HTTP GET к API Bybit для данных OHLCV
  2. Разбор: Десериализация JSON-ответа в структуры Rust
  3. Преобразование: Вычисление доходностей, нормализация признаков, построение векторов состояния
  4. Среда: Симуляция торговли с непрерывным размером позиции
  5. Обучение: Запуск цикла обучения DDPG на исторических данных
  6. Оценка: Измерение кумулятивной PnL, коэффициента Шарпа, максимальной просадки

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

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

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

  3. Целевые сети с мягкими обновлениями (tau = 0.005) необходимы для стабильности обучения. Без них бутстрэппированные TD-цели меняются слишком быстро, вызывая расхождение.

  4. Шум Орнштейна-Уленбека обеспечивает временно коррелированное исследование, хорошо подходящее для трейдинга, где плавные корректировки позиции предпочтительнее случайных скачков.

  5. Буфер воспроизведения опыта разрывает временные корреляции и позволяет эффективно использовать выборки при обучении вне политики на исторических рыночных данных.

  6. Архитектура актор-критик разделяет оценку ценности (критик) и улучшение политики (актор), позволяя оптимизировать каждый компонент независимо с разными скоростями обучения.

  7. Инженерия вознаграждений — самое важное проектное решение. Вознаграждения с поправкой на риск (по мотивам Шарпа или с штрафом за просадку) порождают более устойчивые торговые стратегии, чем сырая PnL.

  8. Реализация на Rust обеспечивает безопасность памяти, абстракции с нулевой стоимостью и производительность, подходящую для промышленного развёртывания, без ущерба для ясности кода.

  9. DDPG имеет известные ограничения: смещение переоценки в критике (решается TD3), чувствительность к гиперпараметрам и потенциал преждевременной сходимости к субоптимальным детерминированным политикам.

  10. Для промышленного развёртывания рассмотрите TD3 (Twin Delayed DDPG) или SAC (Soft Actor-Critic) как более устойчивые продолжения, в то время как DDPG остаётся фундаментальным алгоритмом для понимания RL с непрерывными действиями в трейдинге.


Ссылки

  • Lillicrap, T.P., Hunt, J.J., Pritzel, A., et al. (2015). “Continuous control with deep reinforcement learning.” arXiv:1509.02971.
  • Silver, D., Lever, G., Heess, N., et al. (2014). “Deterministic Policy Gradient Algorithms.” ICML.
  • Fujimoto, S., van Hoof, H., Meger, D. (2018). “Addressing Function Approximation Error in Actor-Critic Methods.” ICML (TD3).
  • Haarnoja, T., Zhou, A., Abbeel, P., Levine, S. (2018). “Soft Actor-Critic.” ICML.
  • Документация API Bybit: https://bybit-exchange.github.io/docs/v5/intro