Разработка платформы бэктестинга AI-торговых стратегий

Проверить AI-стратегию на исторических данных — значит понять, принесёт ли она результат до того, как в работу пойдут реальные средства. Мы разрабатываем платформы бэктестинга под ключ: от загрузки данных до оценки устойчивости стратегии на разных режимах рынка. Заказчик получает единый расчётный контур, который сокращает цикл проверки гипотез в разы.
Часто задаваемые вопросы

Почему бэктестинг AI-стратегий ломается на реальных данных

Бэктестинг AI-стратегии на истории почти всегда показывает доходность лучше, чем последующая торговля. Разрыв возникает не из-за модели: прогон и живой рынок по-разному исполняют одну и ту же заявку. В истории заявка закрывается по цене бара, на рынке — по той, что осталась в стакане после всех, кто пришёл раньше.

Неучтённые издержки исполнения добивают результат тихо. Комиссия, спред, проскальзывание на объёме и задержка между сигналом и отправкой заявки накапливаются на каждой сделке, и стратегия, которая в прогоне рисует ровную кривую, в реальных торгах уходит в минус. Отдельная строка издержек в отчёте важнее итоговой доходности: она показывает, где система теряет деньги, а не где их обещает.

Третья причина — отсутствие повторяемости эксперимента. Если не зафиксированы срез данных, состав инструментов, версия признаков и случайные состояния, два прогона одной стратегии дают разные кривые, и сравнение гипотез теряет смысл. Повторяемость здесь не про удобство, а про то, можно ли вообще доверять выводу.

Обычно всё это упирается в узкое место расчётного контура: перебор параметров идёт часами, проверка на устойчивость к сдвигу окна не влезает в цикл исследования, а расхождение прогона и реальных торгов обнаруживается уже после запуска. Разбираем, как это закрывается на уровне архитектуры платформы.

Что даёт платформа: измеримый эффект на каждом этапе

Эффект платформы измеряется, а не описывается словами: каждый прогон оставляет метрики, по которым видно, что изменилось. Ниже — четыре участка, где разница заметна сразу после первого месяца работы.

Время одного прогона

Кэш промежуточных расчётов и параллельный обсчёт инструментов сжимают полный прогон портфеля с часов до десятков минут. Это меняет режим работы: стратегию успеваешь прогнать на нескольких состояниях рынка в тот же день, а не «к следующей неделе».

Воспроизводимость результатов

Прогон фиксирует версию кода, срез данных, параметры, зерно генератора и окружение — повторный запуск даёт те же метрики. Журнал экспериментов ведём в MLflow, поэтому видно, какая гипотеза что дала и к какому состоянию кода её откатить.

Скорость проверки гипотез

Единый формат данных, готовые шаблоны стратегий и автоотчёт сокращают путь от идеи до цифры до нескольких часов. За день проверяется 10–15 конфигураций вместо одной-двух: слабые гипотезы отбрасываются до того, как в них вложена разработка.

Устранённые отказы и переобучение

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

Сравнение режимов бэктестинга AI-стратегий: таблица выбора

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

Потоковый режим держит стратегию в том же виде, в котором она уйдёт в торговлю, поэтому только он честно показывает лаг отклика модели на новые данные. Режим бэктестинга выбирают под задачу, а не по умолчанию — таблица ниже.

Режим прогона Когда подходит Ограничения режима
Пакетный расчёт Первичный отсев сотен гипотез и поиск закономерностей в признаках на длинной истории Не учитывает очередь заявок и частичные исполнения — результат выходит оптимистичнее реального
Расчёт по событиям Финальная проверка перед выводом: комиссии, проскальзывание, лимиты, запрет коротких позиций Полный перебор параметров на большой истории идёт часами, стоимость прогона растёт с числом событий
Потоковый режим Проверка реакции в реальном времени: лаг отклика модели, дрейф признаков, обрыв канала данных Сложнее воспроизвести: нужен детерминированный журнал входящего потока и повтор одного и того же окна
Гибридный прогон Нужен и широкий поиск, и честная оценка: отсев пакетно, финал — по событиям Требует согласованных определений признаков в двух контурах, иначе результаты не сходятся

Как мы строим платформу: этапы инженерной работы

Работу начинаем не с кода, а с аудита данных: откуда приходит история котировок, как обрабатываются пропуски, сплиты и дивиденды, совпадают ли временные интервалы источников. Пока это не проверено, стратегия красиво выглядит на истории и расходится с реальными сделками — поэтому схему расчёта для бэктестинга и метрики фиксируем письменно заранее.

  1. Аудит данных. Сверяем источники, проверяем полноту истории, находим дыры и дубли, приводим торговые календари и часовые пояса к одному виду. Итог — отчёт о пригодности данных и список ограничений.
  2. Схема расчёта. Фиксируем метрики, правила входа и выхода, учёт комиссий, задержек исполнения и проскальзывания — чтобы расчёт не расходился с реальной торговлей.
  3. Прототип на узком срезе. Собираем расчётный контур на одном инструменте и коротком периоде: гипотеза проверяется быстро, а ошибки в логике видны до масштабирования.
  4. Настройка окружения. Разворачиваем изолированные среды, настраиваем воспроизводимость прогонов и хранение результатов вместе с параметрами запуска — любой расчёт можно повторить и сравнить.
  5. Проверка на контрольных наборах. Данные для проверки отделяем заранее, смотрим устойчивость на разных периодах и рыночных режимах, отсекаем варианты, которые держатся только на переобучении под историю.
  6. Промышленный контур. Ставим прогоны по расписанию, добавляем отчёты и оповещения о расхождениях между ожидаемой и фактической динамикой — платформа работает без ручных запусков.
  7. Передача и обучение команды. Отдаём документацию, доступы, разбор архитектуры и проводим совместные прогоны на ваших задачах, чтобы ваши специалисты могли менять стратегии и данные самостоятельно.

Что передаём на руки: конфигурации, схемы, регламенты

Проект по бэктестингу AI-стратегий считаем сданным не тогда, когда модель отработала на демонстрационном наборе, а когда ваша команда воспроизводит любой прогон без нас. Поэтому передаём не презентацию с графиками, а рабочий контур: конфигурации, схемы расчёта, политики доступа и регламенты, по которым платформа живёт дальше.

  • Конфигурации платформы — версионируемый набор параметров: источники котировок, окна ребалансировки, комиссии и проскальзывание, ограничения на размер позиций.
  • Схемы расчёта — конвейер от загрузки данных до метрик: где считаются доходность, просадка и оборачиваемость, как исключается подглядывание в будущее.
  • Спецификация признаков — какие ряды и производные показатели подаются в модель, как фиксируются версии весов при переобучении.
  • Политики доступа — роли участников, права на данные, запуск прогонов и правку конфигураций, журнал действий.
  • Документация — архитектура, локальный запуск, разбор типовых сбоев с признаками и порядком действий.
  • Регламенты сопровождения — периодичность переобучения, контроль расхождения тестового и рабочего результата, откат на предыдущую версию стратегии.
  • Приёмочные прогоны — эталонные сценарии с зафиксированными результатами: после ваших правок видно, что расчёт не разошёлся.

Разбираем контур вместе с вашей командой: инженер проходит по каждому артефакту и отвечает на вопросы по расчётам и доступам. Опишите задачу — вернёмся с оценкой и планом.

Кейс: от разрозненных скриптов к единому расчётному контуру

До: разрозненные скрипты

До переезда расчёт жил в десятках отдельных ноутбуков Jupyter и локальных скриптов: у каждой стратегии свой набор исторических данных и свои промежуточные выгрузки. Прогон одного набора параметров занимал около шести часов и не влезал в рабочее окно, поэтому проверку запускали ночью, а правки вносили уже после. Результат зависел от окружения: две копии одного скрипта на разных машинах давали разную доходность, и до трети чисел приходилось перепроверять вручную.

После: единый расчётный контур

Собрали единый расчётный контур бэктестинга: один источник исторических данных с версионированием срезов, неизменяемые окружения под каждый запуск и журнал параметров, который однозначно восстанавливает любой прогон. Тяжёлые расчёты разбили на независимые задачи и распараллелили, а результаты складываются в общее хранилище вместе со срезом данных и версией кода.

Время прогона сократилось с шести часов до сорока минут — гипотезу проверяют несколько раз в день, а не раз в сутки. Доля воспроизводимых результатов выросла с 70 до 99%: тот же набор параметров на том же срезе даёт тот же итог, а расхождения объясняются новыми рыночными данными, а не окружением. Число спорных результатов, которые разбирали вручную, упало почти в пять раз — сравнение стратегий идёт по общим метрикам, а не по переписке.

Что делать, если часть расчётов уже автоматизирована

Автоматизированный расчётный контур — не помеха, а точка опоры: обычно в нём уже есть выверенные правила подготовки данных, массивы исторических котировок и логика исполнения заявок. Мы начинаем с инвентаризации — фиксируем источники данных, форматы хранения, расписание прогонов и то, какие метрики команда считает эталонными. После этого по каждому блоку решаем отдельно: переносим как есть, оборачиваем в тонкий слой совместимости или оставляем на месте и только подключаемся к нему.

Наработки при этом сохраняются: индикаторы, правила фильтрации, обработка пропусков и корпоративных событий переезжают в новый контур без переписывания логики. Мы приводим их к единому интерфейсу, чтобы движок бэктестинга AI вызывал их так же, как собственные модули, — иначе сравнение старых и новых результатов теряет смысл.

Бесшовное встраивание проверяется параллельным прогоном: прежний и новый контуры считают один и тот же исторический отрезок, а мы сверяем кривую доходности, максимальную просадку, число сделок и распределение результатов по периодам. Расхождение выше оговорённого порога останавливает переключение — сначала находим причину. На практике это чаще всего разное заполнение пропусков, момент учёта комиссии или разъезд в правилах переноса позиции через ночь.

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

Технические сомнения инженеров перед стартом

Перед первым запуском инженер задаёт одни и те же вопросы: хватит ли истории, где гарантия, что расчёт верен и не получится ли красивая кривая на прошлых данных, которая рассыплется на живом рынке. Эти сомнения снимаем до разработки — здесь ошибка в расчёте стоит не бага, а неверного решения о запуске стратегии.

Ниже — короткие ответы на технические возражения, которые чаще всего всплывают на этапе оценки.

Историю придётся чистить вручную?

Загрузчик приводит ряд к единому часовому поясу, пересчитывает корпоративные действия и помечает пропуски, а не заполняет их молча. Отдельно подтягиваем делистингованные инструменты, иначе расчёт смещён в сторону выживших.

Как понять, что стратегия не подогнана под прошлое?

Обучающее и проверочное окна разделены, скользящая проверка идёт по последовательным периодам, результат считается только на невиданных данных. Комиссии и проскальзывание заложены в расчёт, а не в отчёт.

Как подключаются биржевые и брокерские источники?

Работаем и с потоковыми подключениями, и с выгрузками в файлах: схема полей, часовой пояс и точность метки времени описаны для каждого источника. Дубликаты отсекаются по ключу инструмент-время, разрывы дозагружаются, расхождения между источниками уходят в журнал.

Как вы убеждаетесь, что расчёт корректен?

Есть эталонные сценарии с заранее известным ответом — последовательность сделок, комиссии, дивиденды. Тот же прогон повторяем независимой реализацией и сверяем журнал сделок, а на коротком окне с живым рынком — расчётные сделки с фактическими.

Обсудим задачу и вернёмся с оценкой и планом

Для старта обсуждения задачи достаточно описать её в терминах стратегий, данных и результата — тогда оценка опирается на инженерную реальность, а не на общие соображения. Специально готовить пакет документов не нужно: подойдут выгрузки, заметки аналитика или краткое описание идеи.

  • Стратегии. Логика входа и выхода, набор инструментов, горизонт удержания позиции, правила управления риском, частота сигналов.
  • Исходные данные для оценки. Какие исторические ряды уже есть, за какой период и с какой детализацией, в каком формате и где лежат; если данных нет — из каких источников их брать и есть ли к ним доступ.
  • Требования к отчётности. Ключевые метрики — доходность, максимальная просадка, доля прибыльных сделок; нужны ли разрезы по периодам и инструментам и в каком виде отчёт удобен вам.
  • Критерии качества. Как отличаем рабочую стратегию от подгонки под историю: проверка на отложенном периоде, скользящее окно, сравнение с базовым сценарием.
  • Ограничения. Сроки, доступы к данным и инфраструктуре, размещение — облако или закрытый контур, число одновременных прогонов.
  • Пользователи и сценарии. Кто работает с платформой — аналитик, трейдер, риск-менеджер: от этого зависят интерфейс и разграничение прав.

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

Направления AI-разработки

Последние работы

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