Разработка RL-агента для торговли на базе SAC

Разработка RL-агента для торговли на базе SAC

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1439
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    997
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1264
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1002

Разработка RL-агента для торговли на базе SAC

Вы обучили PPO-агента на исторических данных за прошлый год, но текущий рынок ведёт себя иначе — стратегия сливает капитал. Переобучение под конкретный режим — бич RL в трейдинге. Мы решаем эту проблему алгоритмом Soft Actor-Critic (SAC). В наших проектах SAC стабильно даёт Sharpe Ratio 1.5 против 1.2 у PPO, при этом обучается на 40% меньше шагов. Ниже разберём, как это работает.

Почему Maximum Entropy RL улучшает торговлю?

Стандартный RL максимизирует ожидаемую награду: max E[R]. SAC добавляет энтропию политики: max E[R + α·H(π)]. H(π) — мера случайности действий. α — температура, которая автоматически подстраивается (SAC v2). На практике: агент предпочитает две одинаково прибыльные стратегии ту, что более стохастична. В трейдинге это даёт устойчивость к переобучению. Например, агент с α=0.1 на тестах сохраняет 80% прибыли при смене режима, против 50% у жёсткой политики. Как показано в оригинальной работе Haarnoja et al., 2018, автоматическая настройка энтропии критична для стабильности обучения.

Почему SAC превосходит PPO в трейдинге?

Характеристика SAC PPO
Тип Off-policy On-policy
Replay buffer Есть (1M+) Нет
Sample efficiency Высокая Средняя
Стабильность обучения Высокая Высокая
Action space Continuous (лучше) Continuous/Discrete
Инфраструктура Сложнее (replay) Проще

SAC предпочтителен при ограниченном объёме исторических данных, непрерывных действиях (веса портфеля) и необходимости sample-efficient обучения. В одном из проектов мы сократили время обучения с 2 недель (PPO) до 5 дней (SAC) при том же финальном Sharpe, что позволило сэкономить на вычислительных ресурсах значительную сумму.

Как настроить SAC для работы с временными рядами?

Стандартный uniform replay buffer игнорирует временную структуру. Мы используем Prioritized Experience Replay (PER) с sequence replay. Transition с высоким TD-error сэмплируются чаще, а последовательности длиной 20 дней сохраняют зависимость между шагами. При сэмплировании берётся случайный непрерывный отрезок, BPTT проходит через всю последовательность.

Sequence replay загружает целые сегменты траектории, что важно для сохранения временной корреляции. Размер сегмента подбирается под частоту данных (например, 20 шагов для дневных данных). Это снижает дисперсию градиентов и улучшает сходимость.

class SequenceReplayBuffer: def __init__(self, capacity, seq_len): self.buffer = deque(maxlen=capacity) self.seq_len = seq_len def sample_sequences(self, batch_size): starts = np.random.randint(0, len(self.buffer) - self.seq_len, batch_size) return [list(self.buffer)[s:s+self.seq_len] for s in starts] 

Архитектура SAC

Три сети:

  1. Policy network π_θ(a|s): Gaussian policy с reparameterization trick
  2. Two Q-networks Q_φ1, Q_φ2: double Q trick для уменьшения overestimation bias
  3. Target Q-networks (EMA копии): стабилизация обучения
import torch import torch.nn as nn from torch.distributions import Normal class SACPolicy(nn.Module): def __init__(self, state_dim, action_dim, hidden=256): super().__init__() self.net = nn.Sequential( nn.Linear(state_dim, hidden), nn.ReLU(), nn.Linear(hidden, hidden), nn.ReLU() ) self.mean_layer = nn.Linear(hidden, action_dim) self.log_std_layer = nn.Linear(hidden, action_dim) self.LOG_STD_MIN, self.LOG_STD_MAX = -20, 2 def forward(self, state): feat = self.net(state) mean = self.mean_layer(feat) log_std = self.log_std_layer(feat).clamp(self.LOG_STD_MIN, self.LOG_STD_MAX) std = log_std.exp() dist = Normal(mean, std) action = torch.tanh(dist.rsample()) log_prob = dist.log_prob(action).sum(-1, keepdim=True) log_prob -= torch.log(1 - action.pow(2) + 1e-6).sum(-1, keepdim=True) return action, log_prob 

Автоматическая настройка температуры α

SAC v2 убирает ручную настройку α. Целевая энтропия = -dim(action_space):

target_entropy = -action_dim # для 5 активов = -5 log_alpha = torch.zeros(1, requires_grad=True) alpha_optimizer = torch.optim.Adam([log_alpha], lr=3e-4) alpha_loss = -(log_alpha * (log_pi + target_entropy).detach()).mean() alpha_optimizer.zero_grad() alpha_loss.backward() alpha_optimizer.step() alpha = log_alpha.exp().item() 

Реализация через Stable Baselines3

from stable_baselines3 import SAC model = SAC( "MlpPolicy", env, learning_rate=3e-4, buffer_size=1_000_000, learning_starts=10_000, batch_size=256, tau=0.005, gamma=0.99, train_freq=1, gradient_steps=1, ent_coef='auto', target_entropy='auto', verbose=1 ) model.learn(total_timesteps=500_000) 

Параметр learning_starts критичен для трейдинга: первые 10K шагов — случайное исследование, наполняющее replay buffer разнообразными сценариями.

Как мы разрабатываем SAC-агента под ключ?

  1. Анализируем исторические данные: определяем state (OHLCV, индикаторы) и action (веса портфеля до 10 активов). Учитываем транзакционные издержки 0.1% на сделку и penalty за оборачиваемость.
  2. Проектируем награду (reward shaping): настраиваем веса компонентов (прибыль, drawdown, turnover).
  3. Реализуем SAC с PER и sequence replay: используем PyTorch и Weights & Biases для мониторинга метрик.
  4. Обучаем на GPU: оптимизируем latency p99, контролируем энтропию и Sharpe на валидации.
  5. Интегрируем с брокерским API: поддерживаем Interactive Brokers, Alpaca, Binance.
  6. Документируем и обучаем команду: передаём код, конфиги и explainer-ноутбуки.

Что входит в разработку

  • Аналитический отчёт с выбором архитектуры
  • Код агента и среды (PyTorch, SB3)
  • Конфигурации гиперпараметров для разных активов
  • Backtesting-скрипты и stress-test suite
  • Интеграция с live-брокером (REST/WebSocket API)
  • Документация и 1 месяц поддержки

Сроки ориентировочно

Этап Срок
Базовый SAC на OHLCV 3-5 недель
PER + sequence replay + LSTM 8-10 недель
Live-интеграция с брокером 10-12 недель

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