AUC 0.9 на бэктесте — повод насторожиться

В ML для рынков самая дорогая ошибка — не слабая модель, а модель, которая слишком хорошо выглядит на истории.

Когда я строил ZoneX — классификатор рыночных состояний для 300+ крипто-инструментов на XGBoost, — больше всего времени ушло не на признаки и не на подбор гиперпараметров, а на валидацию. Итог — AUC 0.765 на out-of-sample. Цифра скромная, и именно поэтому ей можно доверять.

Три вещи, которые отличают честный бэктест от красивого:

1. Случайный train/test split на временных рядах — это утечка. Модель учится на будущем и предсказывает прошлое. Только walk-forward: обучился на прошлом, проверился на следующем окне, сдвинулся.

2. Признаки должны считаться только из данных, доступных на момент решения. Одна свеча «из будущего» в скользящем окне — и модель внезапно «гениальна».

3. Вместо суммы сигналов индикаторов я перешёл на зонную классификацию состояний рынка: не «индикатор выше на Х», а «в каком режиме сейчас рынок». Итого 33 признака, и они намного устойчивее к смене режима.

После 10 лет на финансовых рынках убеждён: рынок не прощает оптимизма в бэктестах. Лучше скромная цифра, которая держится на новых данных, чем красивая, которая разваливается в первую неделю live.

Код открыт: github.com/Vladok163/ZoneX-XGBoost-Zone-Based-Trading-Engine

#ML #трейдинг #финтех #DataScience