Створення торгового агента з використанням DQN
Торговий агент на DQN (Deep Q-Network)
Дискретна торгівля — класична задача для RL. Але DQN у сирому вигляді дає збої: overestimation bias, нестабільність, шум фінансових даних. Ми проектуємо та розробляємо RL-агентів на базі DQN/DDQN під конкретний інструмент з урахуванням усіх нюансів. Наш досвід — 5+ років у RL для фінансів, понад 20 впроваджених проектів. Гарантуємо стабільність навчання та валідацію на out-of-sample даних.
Deep Q-Network — перший deep RL алгоритм, що продемонстрував superhuman performance в іграх Atari. Для трейдингу: дискретний простір дій (buy/sell/hold), experience replay, target network. Підходить для single-asset торгівлі з чіткими входами/виходами.
Як DQN справляється з шумом фінансових даних?
Фінансові ряди зашумлені та нестаціонарні. DQN не вимагає моделі ринку, але страждає від high variance. Рішення: Double DQN (знижує overestimation bias на 50% порівняно з DQN), Dueling DQN (розділяє value і advantage), повільний epsilon decay (decay_factor=0.9995, epsilon_min=0.01). Ми використовуємо ці техніки, щоб агент не переучувався на шумі.
Що таке Rainbow DQN і навіщо він у трейдингу?
Rainbow DQN — комбінація шести покращень: Double, Dueling, Prioritized Experience Replay (PER), Multi-step returns (n=3), Distributional RL (C51/QR-DQN), Noisy Networks. Для трейдингу найцінніші: distributional дає risk-aware policy (бачить не тільки середню дохідність, але й волатильність), multi-step прискорює кредитне присвоєння, PER фокусується на рідкісних, але значущих рухах (наприклад, gap-відкриття).
DQN для трейдингу
Оригінальний DQN працює з дискретними діями. Це робить його природним для сигнальних стратегій: Action space:
- 0: Hold (нічого не робити)
- 1: Buy (відкрити довгу позицію)
- 2: Sell / Close (закрити позицію / відкрити шорт)
Для single-asset це розумно. Для multi-asset потрібен DQN з factored action space або перехід на SAC/PPO.
Q-функція оцінює очікувану сумарну дисконтовану винагороду зі стану s при дії a.
| Алгоритм | Тип дій | Переучування | Стабільність | Коли використовувати |
|---|---|---|---|---|
| DQN/DDQN | Дискретні (3-10) | Ризик high variance | Середня (потрібне налаштування) | Single-asset, чіткі сигнали |
| SAC/PPO | Неперервні | Нижче | Висока | Multi-asset, continuous position sizing |
Архітектура
import torch import torch.nn as nn class DQNTrading(nn.Module): def __init__(self, state_dim, n_actions=3, hidden=256): super().__init__() # Dueling DQN архітектура self.feature = nn.Sequential( nn.Linear(state_dim, hidden), nn.ReLU(), nn.Linear(hidden, hidden), nn.ReLU() ) # Value stream: V(s) self.value = nn.Sequential( nn.Linear(hidden, 128), nn.ReLU(), nn.Linear(128, 1) ) # Advantage stream: A(s, a) self.advantage = nn.Sequential( nn.Linear(hidden, 128), nn.ReLU(), nn.Linear(128, n_actions) ) def forward(self, x): feat = self.feature(x) V = self.value(feat) A = self.advantage(feat) # Q = V + (A - mean(A)) return V + (A - A.mean(dim=1, keepdim=True)) Dueling DQN розділяє V(s) і A(s,a). У трейдингу: часто стан ринку визначає загальну цінність (V), а вибір дії — відносну перевагу (A). Зазвичай швидше сходиться.
Experience Replay і Target Network
Два ключові механізми: Experience replay buffer:
from collections import deque import random class ReplayBuffer: def __init__(self, capacity=100_000): self.buffer = deque(maxlen=capacity) def push(self, state, action, reward, next_state, done): self.buffer.append((state, action, reward, next_state, done)) def sample(self, batch_size): batch = random.sample(self.buffer, batch_size) states, actions, rewards, next_states, dones = zip(*batch) return (torch.FloatTensor(np.array(states)), torch.LongTensor(actions), torch.FloatTensor(rewards), torch.FloatTensor(np.array(next_states)), torch.FloatTensor(dones)) Target network (заморожена копія Q-мережі):
# оновлення кожні C кроків if step % target_update_freq == 0: target_net.load_state_dict(online_net.state_dict()) Без target network: Q-targets рухаються одночасно з Q-predictions → нестабільність → divergence.
Навчання з Double DQN
def train_step(batch, online_net, target_net, optimizer, gamma=0.99): states, actions, rewards, next_states, dones = batch # поточні Q-значення q_values = online_net(states).gather(1, actions.unsqueeze(1)) # Double DQN: online обирає дію, target оцінює with torch.no_grad(): next_actions = online_net(next_states).argmax(1) next_q = target_net(next_states).gather(1, next_actions.unsqueeze(1)) target_q = rewards.unsqueeze(1) + gamma * next_q * (1 - dones.unsqueeze(1)) loss = nn.SmoothL1Loss()(q_values, target_q) # Huber loss (стійкий до викидів) optimizer.zero_grad() loss.backward() nn.utils.clip_grad_norm_(online_net.parameters(), 10) # градієнтний кліпінг optimizer.step() return loss.item() Double DQN усуває overestimation bias оригінального DQN. У фінансових середовищах з високим шумом це критично — без Double DQN Q-значення систематично завищені.
Epsilon-greedy для фінансових середовищ
# Експоненційний decay epsilon epsilon = max(epsilon_min, epsilon_start * (epsilon_decay ** step)) if np.random.random() < epsilon: action = env.action_space.sample() # випадкове дослідження else: with torch.no_grad(): q_vals = online_net(state_tensor) action = q_vals.argmax().item() Фінансова специфіка epsilon:
- epsilon_start = 1.0 (повне дослідження на початку)
- epsilon_min = 0.01 (1% випадкових дій завжди)
- Повільний decay (decay=0.9995) — ринок складніший за Atari
Коли DQN, коли SAC/PPO
DQN доречний для: single-asset, чіткі сигнали buy/sell, невеликий action space (3–10 дій), binary decision making. SAC/PPO переважніші для: multi-asset portfolio, continuous position sizing, коли розмір позиції важливий.
Що входить в роботу
- Архітектура агента (Dueling DQN, Double DQN, Rainbow).
- Скрипти навчання та бектестингу на PyTorch.
- Конфігурація гіперпараметрів під ваш інструмент (learning rate, batch size, replay buffer size, target update frequency).
- Модель карда (model card) з метриками (Sharpe, Max Drawdown, Win Rate, P99 latency).
- Документація з відтворення.
- Інтеграція з live trading (опціонально, +3-4 тижні).
- Підтримка 2 місяці після деплою.
Терміни та вартість
Базовий DQN агент — від 2 до 3 тижнів, вартість стартує від 2500$. Rainbow з PER, Distributional, multi-step — від 6 до 8 тижнів, від 6000$. Live trading інтеграція з риск-менеджментом — додатково від 3 до 4 тижнів, від 3000$. Вартість розраховується індивідуально після аналізу даних.
Чому варто замовити розробку у нас?
Ми впровадили RL-агентів для 20+ проектів у фінансах. Використовуємо production-ready стек: PyTorch, Ray, Weights & Biases, MLflow. Гарантуємо відтворюваність експериментів (seed, конфіги в YAML) та валідацію на out-of-sample даних. Напишіть нам — обговоримо ваш кейс та підготуємо комерційну пропозицію.







