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

Ринок змінюється швидше, ніж встигає ручне налаштування стратегії, а помилка в управлінні ризиком коштує дорого. Ми розробляємо RL-агента для торгівлі на базі TD3 під ключ: від проєктування середовища навчання до передачі готового рішення вашій команді. Ризик-контроль вбудовано в контур агента, тому його поведінка залишається передбачуваною на будь-якому ринку.
Часті запитання

Чому TD3-трейдинг впирається в середовище навчання

Агент, навчений на історії, показує рівну криву дохідності й втрачає її в перші тижні на живому рахунку. Причина майже завжди одна: середовище навчання агента описує ринок точніше, ніж саму угоду.

Агент бачить ціну середини спреду й миттєве виконання, тоді як реальний ордер отримує ціну гіршу на величину спреду й прослизання, а підтвердження надходить із затримкою.

Якщо функція винагороди рахує прибуток від ідеальної ціни, політика сходиться до високої частоти угод: кожен крок приносить уявну перевагу, а витрати з нього не віднімаються.

TD3 із двома критиками, відкладеним оновленням політики та згладжуванням цільової дії гасить переоцінку цінності, але не усуває зсув, закладений у саме середовище.

Друга половина проблеми — нестаціонарність. Навчання з підкріпленням для торгівлі йде за даними одного режиму волатильності, і агент запам’ятовує не закономірність, а конкретну кон’юнктуру: змінилася ліквідність або структура заявок — політика розсипається.

Стійкість агента на реальному ринку визначається не розміром мережі, а різноманіттям режимів, які він пройшов під час навчання.

Тому середовище збирають як модель виконання: витрати як функція обсягу й волатильності, лаг між сигналом і підтвердженням угоди, обмеження на доступну ліквідність, крок за реальним потоком котирувань, а не за згладженою свічкою.

Додаються рандомізація режимів і окремі прогони на зсуві розподілу — агент має відпрацювати сценарії, яких у вибірці не було. Далі розбираємо, як це закривається на практиці.

Що дає навчений агент із ризик-контролем

Ризик-контроль виноситься окремим шаром між агентом і виконанням: агент пропонує цільовий розмір позиції, а правила обмежують її за інструментом, сукупною експозицією та допустимим розкидом.

Просадка знижується не за рахунок «вгадування» розвороту, а тому що рідкісні різкі рухи не перетворюються на велику ставку. Обмеження задаються до навчання й не переписуються разом із вагами — отже, їхній внесок можна виміряти окремо.

Стійкість до волатильності дає нормалізація ознак відносно поточного режиму та штраф за просадку в самій функції винагороди, а не лише за дохідність. TD3-трейдинг працює з неперервною дією, тому розмір позиції змінюється плавно, без ривків на зміні тренду.

Алгоритм спирається на Addressing Function Approximation Error in Actor-Critic Methods: пара критиків знижує переоцінку цінності, і агент не починає переторговувати там, де одиночна мережа розходиться.

Відтворюваність навчання тримається на фіксації умов, а не на удачі прогону: початкові ваги, порядок подавання даних, зріз історії та конфігурація середовища зберігаються разом із контрольною точкою.

Профіль дохідності стратегії відновлюється повторним прогоном, а розбіжність метрик вкладається у вузький коридор. Регресійні прогони на кількох історичних вікнах показують деградацію до виходу в реальну торгівлю.

Окремо зникає клас відмов, який коштував найдорожче: ручні перевизначення лімітів, «наздоганяльні» угоди після різкого руху та неузгодженість логіки стратегії з ризик-модулем.

Підходи до TD3-трейдингу: симулятор, пісочниця, реальний рахунок

Агент на TD3 навчається на переходах «стан — дія — винагорода», і якість цих переходів визначає поведінку політики.

Той самий алгоритм за однакових налаштувань поводиться по-різному залежно від того, де він отримує дані: у моделі ринку, у тестовому контурі брокера чи на живому рахунку.

Режими не замінюють один одного, а йдуть шарами: кожен наступний додає те, що попередній не відтворює — затримку виконання, прослизання, часткове заповнення заявки, обрив каналу.

Тому перехід між режимами ми робимо окремим етапом із фіксацією метрик, а не перемиканням одного параметра.

Режим навчання Коли доречний Обмеження
Симулятор ринку Налаштування архітектури, відбір ознак, перевірка стійкості політики на історичних вікнах Модель виконання наближена: немає реальної черги заявок і впливу угоди на ціну
Пісочниця брокера Перевірка зв’язки агента з торговим контуром, затримок і форматів заявок Тестовий рахунок не відтворює реакцію ринку на обсяг
Реальний контур торгівлі Фінальна валідація на малому ризику й обмеженому обсязі Необоротні втрати при помилці, потрібні ліміти й ручний контроль

Як вибирати режим

Вибір визначається тим, який ризик перевіряється, а не зручністю. Для стійкості до зміни волатильності достатньо симулятора з кількома сценаріями; щоб зрозуміти, чи переживе політика реальні затримки й витрати, потрібна пісочниця, а виведення в реальний контур — лише після неї.

Етапи впровадження: від аудиту даних до передачі агента

Маршрут розбитий на етапи так, щоб результат кожного перевірявся до переходу до наступного: без чистих даних і формалізованої мети навчання перетворюється на підгонку під минуле, а не на робочу стратегію.

  1. Аудит історичних даних. Перевіряємо глибину історії за інструментами, пропуски, дроблення інтервалів, розбіжності між джерелами. Розриви та бари, перераховані заднім числом, вирізаємо або відновлюємо — інакше агент вивчить артефакти запису, а не поведінку ринку.
  2. Постановка цільової функції. Фіксуємо, що оптимізуємо: дохідність із поправкою на ризик, просадку, оборот, витрати. У TD3 це функція винагороди — від неї залежить, чи почне агент торгувати або утримувати позицію заради статистики.
  3. Схема ризик-обмежень. Задаємо ліміти на розмір позиції, денний збиток, плече та частоту угод. Обмеження виносимо в шар виконання, поза агентом, — тоді вони працюють за будь-якої поведінки моделі.
  4. Навчання й налаштування. Ділимо історію на періоди, фіксуємо генератор випадкових чисел і параметри середовища, логуємо кожну ітерацію. Так будь-яку аномалію в результатах можна відтворити, а не обговорювати на словах.
  5. Перевірка агента. Прогоняємо на ковзному вікні та окремому відкладеному періоді, включно зі зміною режиму ринку. Порівнюємо з простими еталонними стратегіями й дивимося поведінку в просадці, а не лише підсумкову дохідність.
  6. Передача рішення. Віддаємо навчені ваги, конфігурації, код оточення, документацію та регламент донавчання. Окремо описуємо правила зупинки агента й відкату на попередню збірку.

Артефакти проєкту: код, конфігурації, регламенти, схеми

Проєкт здано не тоді, коли агент показав гарну криву на історії, а коли ваша команда може підняти його, змінити та зупинити без нас. Тому передаємо не лише ваги моделі, а й весь контур навколо них.

  • Вихідний код — репозиторій із навчанням і торговим контуром: реалізація TD3, середовище симуляції ринку, обгортки над брокерським API, тести. Збірка на чистій машині відтворюється.
  • Конфігурації середовища — гіперпараметри агента, набори ознак і горизонти в окремих файлах, правляться без правки коду. Профілі навчання й торгівлі розділені, експеримент не зачіпає робочий режим.
  • Контрольні точки моделі — збережені стани агента разом із нормалізаторами ознак. Відкат на попередню версію — заміна каталогу, а не перенавчання.
  • Політики доступу — хто запускає навчання, хто змінює ліміти ризику, хто виводить агента з торгівлі. Ключі брокера зберігаються поза кодом і поза історією змін.
  • Регламент моніторингу — просадка, частка відхилених заявок, розбіжність реальної дохідності із симуляцією; пороги спрацювання й порядок зупинки агента.
  • Документація рішення — архітектурна схема, опис ознак і функції винагороди, журнал експериментів, інструкції із запуску та відновлення.

Передачу закриваємо спільними прогонами на вашому контурі: ви самі піднімаєте агента з репозиторію, змінюєте конфігурацію й повторюєте сценарій зупинки. Потрібне розширення — опишіть задачу, повернемося з оцінкою та планом.

Кейс: агент на товарному ринку — метрики до і після

Задача надійшла від торгового напряму на товарному ринку: зняти з трейдера ручне управління позицією за ф’ючерсами на метали. Річ не про прогноз ціни, а про виконання — розмір входу, добір при підтвердженні сценарію, зріз ризику на різких рухах.

Правила, написані вручну, впевнено тримали спокійний профіль волатильності й розвалювалися на розривах і тонкій ліквідності.

Вузьким місцем виявилася не точність сигналу, а поведінка стратегії в нештатному режимі: набір умов розходився, позиція залишалася відкритою довше за план, частина днів закривалася з перевищенням ліміту ризику.

Агент на TD3 замінив цей набір єдиною політикою — неперервна дія за розміром позиції, навчання на історичних даних з урахуванням комісії та прослизання.

Окремо налаштували штраф за порушення ліміту ризику та право не входити в угоду, якщо режим ринку незнайомий навченій політиці. Це дало більше, ніж приріст дохідності: агент коректно бездіє там, де його оцінки розходяться з реальністю.

Метрики до і після: максимальна просадка скоротилася з 17% до 9%, частка днів із перевищенням ліміту ризику — з 7% до нуля, розкид результату за місяцями звузився приблизно втричі.

Стабільність виконання зросла тому, що рішення за позицією ухвалюється за один крок і не залежить від людського фактора.

Перед запуском пройшли перевірку на відкладеному періоді та на режимі зі штучно погіршеною ліквідністю, а перехід робили паралельною роботою старої логіки й агента з ручним контролем лімітів.

Що робити, якщо у вас уже є власний агент

Перший крок — аудит моделі. Відтворюємо навчання з фіксованим зерном і перевіряємо, чи тримається результат на одному вдалому запуску: якщо розкид між запусками зіставний із заявленою перевагою, справа не в архітектурі.

Окремо дивимося середовище на заглядання в майбутнє, урахування комісії та прослизання — там найчастіше губиться зв’язок між історією та реальною поведінкою.

Якщо навчання відтворюване, ідемо в доопрацювання наявного агента на TD3: розширюємо простір станів ознаками, яких він не бачить, перебудовуємо функцію винагороди під ваші пріоритети, донавчаємо на режимах ринку, що не потрапили у вибірку, і додаємо регуляризацію, щоб політика не виродилася в одну стратегію.

Коли розбіжність накопичується між навчанням і торгівлею, перебудовуємо середовище навчання: симулятор виконання з обмеженою ліквідністю, затримками й частковими угодами, ковзні вікна замість одного довгого відрізка історії, окремі набори під тренд, боковик і високу волатильність. Часто агент після цього поводиться стійкіше без правок самої мережі.

Третій сценарій — контур ризик-контролю навколо працюючого агента, якщо змінювати модель ризиковано. Ліміти на розмір позиції та денну просадку, аварійне вимкнення, тіньовий режим на реальних даних, журнал рішень і метрики розбіжності очікуваної та фактичної поведінки.

Вибір залежить від підсумків аудиту: чи відтворюється навчання, де губиться стійкість, чи є доступ до середовища й даних. Напишіть, що вже зібрано, — повернемося з оцінкою та планом.

Технічні сумніви перед запуском агента

Перед виведенням агента на реальний рахунок виникають чотири питання: чи втримає політика результат при зміні режиму ринку, чи вистачить якості даних, чи не перенавчилася модель і хто відповідає за ризик при помилковому рішенні.

Як агент переживає зміну режиму ринку?

Політику навчаємо на вікнах із трендом, боковиком і кризовими провалами, перевіряємо на окремому відрізку історії.

У робочому контурі стежимо за волатильністю, кореляціями та просадкою в ковзному вікні: вихід за межі переводить агента в консервативний режим зі скороченням позицій.

Як перевіряєте якість даних?

Звіряємо котирування з кількох джерел, відновлюємо розриви торгів, приводимо таймфрейми до єдиної сітки, окремо контролюємо виживший зсув за делістингованими паперами. На вхід TD3 ідуть лише очищені ряди, інакше агент учиться на артефактах потоку котирувань.

Як не допустити перенавчання?

Історію розділяємо за часом, а не випадково, — так виключаємо витік майбутнього, а відкладений період тримаємо фінальним фільтром. Рання зупинка, обмеження складності політики та ансамбль із кількох незалежних запусків навчання дають стійке рішення замість одного вдалого прогону.

Де ваша відповідальність, а де наша?

Ми відповідаємо за код, навчання, інтеграцію зі шлюзом брокера (наприклад, Interactive Brokers), моніторинг і журнал рішень агента. Ліміти за позицією, денною просадкою й автостопом затверджуєте ви — наш контур їх не обходить.

Передаємо агента команді й супроводжуємо запуск

Робота починається не з коду, а з даних і доступів. Потрібні історичні котирування та журнал угод за горизонт, який покриває різні ринкові режими — тренд, боковик, різкі розвороти, — і тестовий контур, ізольований від реального рахунку.

Від замовника потрібен інженер, який забирає код і залишається власником системи: без відповідального з вашого боку передача вироджується в разову демонстрацію.

План робіт фіксуємо до старту й тримаємо як договір за строками:

  • Аудит даних: повнота історії, пропуски, зсуви часу, коректність розрахунку дохідності.
  • Стенд навчання: середовище, де агент TD3 навчається на історії й не торкається реальних ордерів.
  • Перевірка на відкладеній ділянці: агент бачить дані, яких під час навчання не було.
  • Приймання за метриками: просадка, відновлення після зміни режиму, стійкість до прослизання.
  • Навчання команди замовника: розбір архітектури, самостійний перезапуск навчання, читання журналів.
  • Супровід запуску: чергування на перших прогонах, розбір розбіжностей між стендом і робочим контуром.
  • Передача рішення команді: репозиторій, конфігурації, регламент перенавчання й відкат на попередню модель.

Фінальний ритуал — приймання при вас: запускаємо навчання на ваших даних, ваша команда робить це вдруге сама. Після передачі супровід запуску йде за регламентом, де заздалегідь прописано, хто й що робить при відхиленні метрик від контрольних значень.

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

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

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142