Борьба с переобучением (overfitting) моделей градиентного бустинга на исторических данных фондового рынка

Переобучение в алготорговле превращает прибыльную стратегию в генератор убытков: разрыв между точностью на трейне (90%) и тесте (45%) — типичный симптом «подгонки» под шум. В данной статье разберем, как с помощью регуляризации CatBoost и специфического тайм-сериес кросс-валидации свести этот разрыв к минимуму в модели Инвестор v.1.2.1.

Ловушка Look-ahead bias и стандартной кросс-валидации

Использование стандартного K-Fold на финансовых данных — фатальная ошибка. При случайном перемешивании данных модель получает доступ к информации из будущего, что завышает метрики точности на 15-25%. В модели Инвестор v.1.2.1 мы применяем TimeSeriesSplit, где обучающая выборка строго предшествует тестовой. Например, при анализе данных за 5 лет мы используем скользящее окно: обучение на 12 месяцах, тест на следующих 3 месяцах.

Кейс: при переходе от K-Fold к TimeSeriesSplit Sharpe Ratio стратегии упал с 3.2 до 1.4, но именно этот результат оказался реальным при запуске на демо-счете. Микро-вывод: любая валидация, нарушающая хронологию, дает ложноположительный результат и ведет к сливу депозита.

Регуляризация L2 и контроль глубины деревьев

Градиентный бустинг склонен запоминать шум волатильных активов. Для борьбы с этим в CatBoost критически важен параметр l2_leaf_reg. Оптимальный диапазон для акций РФ: от 3.0 до 10.0. Увеличение глубины дерева (depth) с 6 до 10 часто приводит к росту точности на трейне на 2-3%, но увеличивает просадку (drawdown) на реальных данных с 12% до 22% из-за избыточной сложности модели.

Практика показывает, что ограничение depth значением 6-8 при одновременном повышении l2_leaf_reg до 5.0 позволяет сохранить обобщающую способность модели. Микро-вывод: чем выше волатильность актива, тем сильнее должна быть регуляризация и тем меньше должна быть глубина деревьев.

Ранняя остановка и мониторинг Overfitting-точки

Параметр early_stopping_rounds — главный предохранитель. Мы фиксируем мониторинг по метрике Logloss или AUC на отдельном валидационном сете (out-of-sample). Если ошибка на валидации не снижается в течение 50-100 итераций, обучение прекращается. Без этого механизма модель может уйти в глубокий оверфиттинг уже к 1000-й итерации, превращая прогноз в зеркальное отражение исторических котировок.

Пример: в стратегии на дневных таймфреймах остановка на 450-й итерации вместо 1000-й снизила точность на трейне с 72% до 64%, но увеличила прибыль на Forward-тесте на 18%. Микро-вывод: точка максимального профита всегда находится левее точки максимальной точности на обучающей выборке.

Борьба с переобучением через Feature Selection

Избыток признаков (curse of dimensionality) провоцирует модель искать ложные закономерности. При использовании 100+ синтетических признаков в модели Инвестор v.1.2.1 мы заметили, что удаление 30% наименее значимых факторов (по метрике Feature Importance) снижает шум и уменьшает дисперсию прогноза. Оптимальное соотношение признаков к количеству строк данных должно быть не более 1:100.

Кейс: сокращение набора признаков с 120 до 45 (оставив только высококоррелированные с целью показатели) сократило время инференса на 40% и стабилизировало кривую доходности, убрав резкие просадки в 5-7% на нетипичных рыночных фазах. Микро-вывод: меньше признаков — выше устойчивость модели к изменению рыночного режима.

Вывод

Для предотвращения переобучения в алготорговле необходимо отказаться от стандартного K-Fold в пользу TimeSeriesSplit и жестко ограничить глубину деревьев (depth ≤ 8). Начинать следует с настройки l2_leaf_reg в диапазоне 3-10 и обязательного внедрения early_stopping_rounds. Мой экспертный вердикт: лучше иметь модель с точностью 55%, которая стабильно работает на Out-of-Sample данных, чем «идеальную» модель с 80%, которая обнулится при первом же изменении волатильности. В модели Инвестор v.1.2.1 приоритетом всегда является минимизация разрыва между трейном и тестом, а не максимизация точности.