Утечка будущего в бэктесте ставок: как её обнаружить
Как проверить, что бэктест использует только информацию, которая была доступна до решения, и почему случайное перемешивание матчей может завысить результат.
Что называют утечкой будущего
Утечка возникает, когда при имитации старого решения в признаки, отбор или обучение попадает информация, которой тогда ещё не было. Модель может выглядеть точной в историческом отчёте, но фактически использовать финальный счёт, обновлённый состав, позднюю статистику или средние, рассчитанные на всей выборке. Это не прогнозирование прошлого — это просмотр ответа до того, как задали вопрос.
Первый контроль — временная точка решения. Запишите время матча, время прогноза, когда стала доступна каждая статистика, котировка и новость, а также время фиксации результата. Для каждого признака задайте вопрос: могла ли эта величина быть известна в момент ставки? Факт, опубликованный до матча, но исправленный после него, может требовать отдельного исторического снимка.
Где возникает ошибка
Типовые источники — случайное перемешивание последовательных матчей; масштабирование или заполнение пропусков на всей выборке до разделения; настройка параметров по тестовым исходам; статистика сезона, уже включающая сам матч; котировка закрытия вместо цены, доступной при прогнозе; результативность команды, пересчитанная после финального свистка. Также проверьте дубли матча, связанный турнирный тур и признаки, рассчитанные из итоговой таблицы.
Разделите историю по времени: ранний период для разработки, более поздний для проверки, и при необходимости ещё один отложенный участок, к которому не возвращаются при настройке. Для последовательных временных данных используйте expanding или rolling окно. В сравнении сезонного и короткого окна разобран выбор периода; материал о том, почему результат матча не определяет качество решения помогает отделять оценку процесса от исхода.
Мини-пример
Допустим, стратегия выбирает ставку перед матчем по среднему числу голов за предыдущие пять игр. Для матча 12 марта признак должен строиться только из предыдущих матчей и данных, доступных к моменту решения. Если скрипт сначала группирует весь сезон, рассчитывает среднее с включением результата 12 марта, а затем обучает модель, часть будущего результата попала в признак. Даже если утечка касается одного матча из пяти, итоговая оценка становится оптимистичной.
Сделайте проверку на одной строке вручную: перечислите даты, входящие в каждый признак, и удостоверьтесь, что они строго раньше времени прогноза. Затем повторите вычисление при последовательном split. Разбор проверки ИИ-прогноза напоминает проверять источник и время получения данных; для бэктеста также учите параметры предобработки только на тренировочной части, а тестовую лишь преобразуйте.
Чек-лист и ограничения
Сохраняйте замороженный прогноз до матча, event-time и publish-time полей, состав и коэффициент на доступном срезе, версию статистики, список испробованных параметров и границу train/test. Проверяйте, что тест не использовался ни для выбора признаков, ни для отбора «лучшей» стратегии. Если исходы перекрываются во времени или одна серия содержит взаимосвязанные матчи, оцените необходимость разрыва между окнами.
Хронологический split не решает все проблемы: смена правил, состава соревнования или источника данных может создать сдвиг распределения. Он лишь уменьшает конкретный риск использования будущих данных. Если в истории нет временных снимков, обозначьте результат как непроверяемый по доступности данных, а не как доказательство качества будущей ставки.