Переоцінка Q-функції — системна помилка DDPG, яка ламає навчання в трейдингових задачах. Алгоритм TD3 (Twin Delayed Deep Deterministic Policy Gradient, запропонований Scott Fujimoto в роботі Addressing Function Approximation Error in Actor-Critic Methods Addressing Function Approximation Error in Actor-Critic Methods) вирішує цю проблему трьома механізмами: twin critics, delayed policy updates і target smoothing. Ми застосовуємо TD3 для побудови торгових агентів із безперервним position sizing, забезпечуючи стабільне навчання та відтворювані результати на реальних ринках.
В одному з проєктів перехід з DDPG на TD3 підняв Sharpe ratio з 0.8 до 1.6 на 15-хвилинних свічках ф'ючерсів S&P 500. Ключовим фактором стало пригнічення overestimation bias, яке в DDPG призводило до переторговки та частого потрапляння в drawdown.
Проблеми, які вирішує TD3
Overestimation bias. Стандартний DDPG завищує value-оцінки, і policy оптимізується під нереалістичні цілі. TD3 використовує двох критиків з target = min(Q₁, Q₂), що дає консервативну апроксимацію.
Нестабільне навчання. Швидке оновлення policy відносно criticів призводить до oscillation. TD3 оновлює actor кожні d кроків (d=2), дозволяючи Q-функціям стабілізуватися.
Гіперактивна торгівля. Без регуляризації агент здійснює надлишкові угоди. Додавання target policy smoothing з Gaussian noise (σ=0.2) і штраф за транзакційні витрати (0.1% на угоду) вирішують проблему.
Як TD3 вирішує проблему переоцінки?
Два незалежні критики Q₁ та Q₂ працюють як взаємна перевірка. Target value:
y = r + γ · min(Q₁_target(s', π(s')), Q₂_target(s', π(s'))) Така оцінка систематично нижча за true value, але не завищує. На практиці це знижує variance оновлень і покращує підсумкову дохідність.
Коли TD3 виграє у SAC?
TD3 — детермінована policy, SAC — стохастична. TD3 дає відтворювані сигнали, що критично для live-торгівлі. SAC кращий при високій невизначеності, але для трендових ринків TD3 показує більш стабільний Sharpe.
| Критерій | TD3 | SAC |
|---|---|---|
| Тип policy | детермінована з exploration noise | стохастична з entropy bonus |
| Відтворюваність | висока (однакові дії при одному state) | низька (через стохастичність) |
| Ринки | трендові, низька ентропія | волатильні, висока невизначеність |
| Exploration | explicit noise schedule | implicit через entropy |
Архітектура для трейдингу
class TD3Actor(nn.Module): def __init__(self, state_dim, action_dim, max_action): super().__init__() self.net = nn.Sequential( nn.Linear(state_dim, 256), nn.ReLU(), nn.Linear(256, 256), nn.ReLU(), nn.Linear(256, action_dim), nn.Tanh() ) self.max_action = max_action def forward(self, state): return self.net(state) * self.max_action class TD3Critic(nn.Module): def __init__(self, state_dim, action_dim): super().__init__() # Q1 self.q1 = nn.Sequential( nn.Linear(state_dim + action_dim, 256), nn.ReLU(), nn.Linear(256, 256), nn.ReLU(), nn.Linear(256, 1) ) # Q2 self.q2 = nn.Sequential( nn.Linear(state_dim + action_dim, 256), nn.ReLU(), nn.Linear(256, 256), nn.ReLU(), nn.Linear(256, 1) ) def forward(self, state, action): sa = torch.cat([state, action], dim=1) return self.q1(sa), self.q2(sa) def q1_forward(self, state, action): sa = torch.cat([state, action], dim=1) return self.q1(sa) Continuous position sizing і reward
Action space: [-1, 1] для кожного активу, з бюджетним обмеженням Σ|wᵢ| ≤ 1. Reward включає Sharpe-подібну метрику та штраф за зміни позицій:
def reward_fn(returns_series): if len(returns_series) < 20: return returns_series[-1] mean_r = np.mean(returns_series[-20:]) std_r = np.std(returns_series[-20:]) + 1e-8 sharpe = mean_r / std_r return sharpe * returns_series[-1] position_change = np.abs(new_position - old_position) transaction_cost = position_change * 0.001 reward -= transaction_cost Важливо: додавання штрафу за транзакції (0.1% на угоду) суттєво знижує кількість угод і покращує чисту дохідність. В одному проєкті це скоротило частоту торгів на 40% при збереженні загального прибутку.
Які гіперпараметри задавати?
| Параметр | Типове значення | Коментар |
|---|---|---|
| Exploration noise σ | 0.1–0.3 | Лінійний decay до 0.02 за 500k кроків |
| Policy delay | 2 | Оновлення actor кожні 2 кроки |
| Target noise | 0.2 (std) | Додається до action в target |
| Buffer size | 1e6 | Для multi-asset збільшити до 2e6 |
| Learning rate | 1e-3 (actor) / 5e-4 (critic) | Adam optimizer, можливий decay по cosine |
Для multi-asset сценаріїв action space нормується так, щоб сума абсолютних ваг не перевищувала 1. Це легко реалізувати через softmax-подібне перетворення або проекцію на симплекс.
Чому варто обрати TD3 для вашого трейдинг-проєкту?
TD3 забезпечує детермінованість дій при одному і тому ж state, що критично для бектестування та live-торгівлі. Ви отримуєте відтворювану стратегію, яку можна протестувати на історичних даних без стохастичних флуктуацій. Крім того, механізм target smoothing робить агента стійким до шуму ринкових даних.
Що входить в роботу?
- Повна реалізація TD3-агента (actor/critic мережі, буфер, навчання)
- Пайплайн збору даних та симуляційне середовище
- Підбір гіперпараметрів та крос-валідація
- Інтеграція з брокерським API (Interactive Brokers, Alpaca, ваш)
- Документація з відтворення та модифікації
- Навчання команди (1 сесія) та гарантійна підтримка 3 місяці
Процес розробки під ключ
- Аналіз — історичні дані, метрики, бенчмарки
- Проєктування — state/action/reward, симуляційне середовище
- Навчання — підбір гіперпараметрів, decay exploration, моніторинг
- Тестування — out-of-sample backtest, stress-test на кризових періодах
- Деплой — інтеграція з брокерським API, налаштування моніторингу та алертів
Досвід нашої команди в RL-трейдингу — понад 5 років, реалізовано 10+ проєктів для фондів та приватних трейдерів. Зв'яжіться з нами для попередньої консультації — ми оцінимо ваш проєкт за один робочий день. Замовте консультацію з RL-трейдингу, щоб обговорити можливості впровадження TD3 у вашу стратегію.







