Обновить

Я завысил собственный Sharpe. Исправляю публично

Перед стартом торговли реальными деньгами прогнал плановый аудит кода своей ML-системы — и нашёл два бага, из-за которых опубликованные цифры были лучше реальности.

Ошибка 1. Проскальзывание применялось только в live-контуре, но не в историческом бэктесте (комиссии были в обоих). Честный пересчёт: Sharpe системы ~2.7 → ~1.8, доходность за пять лет +75% → +47%. Треть доходности уходила в неучтённые издержки.

Два поворота. Бенчмарк (SMA-кросс) торгует чаще нейросети и пострадал сильнее (Sharpe 0.98 → 0.59) — отрыв системы от него после исправления даже вырос. А LightGBM-бейзлайн, который с одними комиссиями показывал «скромные, но плюсовые» +5%, с полными издержками ушёл в −19%: его кромка была тоньше издержек. «Модель немного зарабатывает после комиссий» — это не результат, а вопрос, какие издержки вы забыли.

Ошибка 2. Я публиковал стресс-тест: замороженная модель на чужой эпохе (2015–2020) теряет −28%, вывод — «в чужом режиме опасна». Аудит нашёл дыру в самом тесте: часть признаков физически существует только с 2020–2021, и загрузчик молча подставлял вместо них нули (виноват except: pass, «удобно» глотавший отсутствующую таблицу). Тест мерил не модель в чужой эпохе, а модель, ослепшую на две трети входов.

Перемер зрячей версией (только признаки, существующие в обеих эпохах): +22% вместо −28%, все шесть лет от −1% до +8.5%. Катастрофы не было — минус рисовали нули в данных, а не смена режима.

И каскадное следствие: раньше казалось, что от «катастрофы» спасает еженедельное переобучение (walk-forward на той эпохе давал +17%). Теперь видно: зрячая замороженная модель даёт +22% — переобучение ничего не спасало, спасать было нечего.

Чек-лист, если хотите проверить свой бэктест на те же грабли:

  1. Все ли слои издержек применяются во всех симуляторах, или только в одном?

  2. Бенчмарк несёт те же издержки? Частота сделок разная — эффект несимметричен.

  3. Существуют ли все признаки модели на всём периоде стресс-теста?

  4. Есть ли в загрузчиках данных молчаливые except, превращающие отсутствующую таблицу в нули?

  5. Стресс-тест показал катастрофу — сначала проверьте тест, потом модель.

Подробный разбор — в UPD к статье про сидовый шум. Цифры в старых текстах не правил — только явный UPD: тихая правка убила бы весь смысл протокола честности.

Не является индивидуальной инвестиционной рекомендацией.

Теги:
+3
Комментарии0

Публикации