Розробка платформи бектестингу 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
    1543
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1374
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142