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

Переоцінка Q-функції — системна помилка DDPG, яка ламає навчання в трейдингових задачах. Алгоритм TD3 (Twin Delayed Deep Deterministic Policy Gradient, запропонований Scott Fujimoto в роботі <cite>Addressing Function Approximation Error in Actor-Critic Methods</cite> [Addressing Function Approximati

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1440
  • 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

Переоцінка 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 місяці

Процес розробки під ключ

  1. Аналіз — історичні дані, метрики, бенчмарки
  2. Проєктування — state/action/reward, симуляційне середовище
  3. Навчання — підбір гіперпараметрів, decay exploration, моніторинг
  4. Тестування — out-of-sample backtest, stress-test на кризових періодах
  5. Деплой — інтеграція з брокерським API, налаштування моніторингу та алертів

Досвід нашої команди в RL-трейдингу — понад 5 років, реалізовано 10+ проєктів для фондів та приватних трейдерів. Зв'яжіться з нами для попередньої консультації — ми оцінимо ваш проєкт за один робочий день. Замовте консультацію з RL-трейдингу, щоб обговорити можливості впровадження TD3 у вашу стратегію.