Разработка 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