Агент ИИ для разработки стратегий может выдать корректный бэктест, используя информацию, которой ещё не было в момент предполагаемого совершения сделок. Код работает. Кривая капитала выглядит правдоподобно. Сигнал может даже казаться разумным. Но метка времени, объединение данных или обновлённое поле незаметно подсказали ему ответ из будущего.
Чтобы этого избежать, доступность данных должна стать частью исследовательского контракта. Для каждого входного значения нужно чётко ответить на два вопроса: к какому моменту оно относится и когда стратегия могла узнать его впервые?
Как выглядит смещение заглядывания вперёд в стратегии, созданной ИИ?
Самый очевидный случай — сигнал, рассчитанный по цене закрытия той же свечи, с последующим исполнением по этой цене. Если для принятия решения стратегии нужна цена закрытия, она не может одновременно совершить сделку по этой цене. Но при объединении источников данных или выборе удобных настроек агенты часто создают более тонкие варианты такой ошибки.
Представим, что модель рассчитывает скользящее среднее за 20 баров при закрытии каждой минуты и открывает позицию, когда цена закрытия пересекает среднее. Если бэктест исполняет сделку по этому же закрытию, он использует последнюю сделку бара раньше, чем она стала доступна стратегии. Перенос ордера на открытие следующего бара может быть разумным приближением, хотя для рыночного ордера всё равно нужно учитывать комиссии и влияние на цену.
Теперь пусть признаком будут дневные фундаментальные данные по акциям или снимок открытого интереса на крипторынке. В строке может стоять дата понедельника, но значение могли опубликовать после закрытия рынка в понедельник или исправить позднее. Дата — это не метка времени доступности.
Как проставлять временные метки входным данным стратегии?
Если источник это позволяет, храните как минимум 3 момента времени: период, к которому относится значение, время публикации источником и время получения вашей системой. В набор информации стратегии на момент принятия решения могут входить только значения, доступные к этому моменту.
| Поле | На какой вопрос отвечает | Типичная ловушка |
|---|---|---|
| Время события | Когда произошло событие на рынке? | Использовать цену закрытия бара до его завершения |
| Время публикации | Когда источник опубликовал это значение? | Считать, что пометка «на конец дня» означает публикацию в начале торгов |
| Время получения | Когда исследовательская система могла получить эти данные? | Не учитывать задержку поставщика данных или конвейера |
| Время пересмотра | Когда записали или исправили эту версию? | Заполнить историю пересмотренными значениями, будто они были первоначальными |
Для стратегии с интервалом 1 минута задержка в 1 секунду не обязательно безвредна. Значение имеет момент принятия решения и то, какие данные использует сигнал. Если на вход подаётся завершённая почасовая статистика, задержка может почти ничего не изменить. Если это дисбаланс стакана, измеренный незадолго до выставления ордера, он может перевернуть сделку.
Может ли хранилище данных на момент времени предотвратить утечки?
Да, если под «на момент времени» понимается возможность получить значение, известное на исторический момент принятия решения, вместе с актуальной на тот момент версией. Таблица, в которой просто указаны исторические даты, всё ещё может содержать сегодняшние исправленные значения за эти даты.
Для каждой записи храните интервал действия и метку времени доступности, а версии сохраняйте вместо перезаписи. Затем явно задавайте условия исторических запросов: возвращать последнюю версию, доступную на момент смоделированного решения. Это особенно важно для фундаментальных данных, состава индексов, публикаций экономической статистики и очищенных поставщиком наборов данных.
Есть и не самая эффектная операционная тонкость: идеальная метка времени публикации бесполезна, если задание загрузки данных запустилось на 20 минут позже. Если историческое хранилище не фиксирует время получения, используйте консервативную задержку и укажите это. Точность, которую источник никогда не записывал, — просто декорация.
Какие проверки выявляют смещение заглядывания вперёд до бумажной торговли?
Попросите исследовательского агента сформировать временную шкалу признаков и ордеров вместе с бэктестом. Для каждого решения записывайте время доступности самого свежего источника для каждого признака, время решения, время выставления ордера и смоделированное время исполнения. Отклоняйте все строки, в которых входные данные поступили после принятия решения.
- Сдвиньте сигналы на 1 бар вперёд и сравните результаты. Резкое падение может выявить зависимость от тайминга «закрытие—закрытие», хотя это лишь диагностическая проверка, а не доказательство утечки.
- Ограничьте каждый источник исторической датой отсечения, повторно запустите конвейер и сравните полученные признаки с сохранёнными историческими признаками.
- Замените подозрительный признак константой. Если результаты почти не изменились, проверьте, использовал ли код нужный временной ряд.
- Пропустите через конвейер заведомо невозможный признак из будущего. Проверка должна немедленно завершиться ошибкой, если время его доступности позже времени принятия решения.
Эти проверки не сертифицируют стратегию. Они делают конкретные предположения о тайминге явными и выявляют распространённые способы их нарушения.
Доказывает ли бумажная торговля, что в бэктесте не было утечек?
Нет. Бумажная торговля может выявить, что в реальном потоке данных есть задержки, пропуски или несоответствие историческому потоку. Но она не доказывает, что старые обучающие признаки отражали известную тогда информацию. Модель также может перестать получать выгоду от утечки просто потому, что случайно увиденное ею будущее уже стало настоящим.
Используйте бумажную торговлю для проверки согласованности: сравните значения признаков в реальном потоке, временные метки решений, формирование ордеров и смоделированные исполнения с определениями в бэктесте. Если они расходятся, проследите путь конкретного входного значения и часов. Исследовательская команда агентов, способная объяснить набор информации для каждого решения, занимается полезной работой. Если команда может показать только гладкую кривую, она пропустила самую сложную проверку.
← Все статьи


