Сколько бэктестов убивают стратегию: эксперимент с BTC/ETH перпами
Суть идеи
Авторы из Rulyfi провели один и тот же поиск стратегий на 5.7-летней истории BTC и ETH perpetuals дважды — с единственным отличием: во втором прогоне убрали «выметенные» конфигурации двух параметров. Результат: одна и та же стратегия с побитово идентичными сделками получила Deflated Sharpe (DSR) 0.035 в первом прогоне (21.9M испытаний) и 0.919 во втором (14.8M испытаний). Стратегия не изменилась ни на йоту — изменился знаменатель поправки на множественное тестирование.
DSR — это классический Sharpe, скорректированный на число независимых испытаний в пространстве поиска. Чем шире пространство, тем жёстче штраф: при 21.9M попыток даже хорошо выглядящая кривая капитала оказывается статистически неотличима от случайного везения. Сократи пространство вдвое — и та же кривая «проходит» порог значимости.
Механизм прост и беспощаден: если ты перебрал достаточно комбинаций параметров, хотя бы одна из них случайно подстроится под шум в данных. DSR пытается это учесть, но сам DSR зависит от того, насколько честно ты сообщаешь о размере поиска. Занизи число — получишь ложное ощущение значимости.
Применимость к крипте
Эксперимент проведён прямо на BTC/ETH perps — переносить ничего не нужно. Это редкий случай, когда методологическая статья использует именно наш актив-класс. Выводы напрямую касаются любого grid-поиска по параметрам: скользящие окна для rolling-z, пороги gamma flip, уровни VRP-фильтра, длины look-back для SOPR или STH-MVRV. Каждый дополнительный параметр, каждый дополнительный диапазон значений — это множитель к числу испытаний и, соответственно, штраф к DSR.
Для нашего движка это означает: нужно логировать полное число протестированных конфигураций с самого начала, а не только «финалистов». Иначе DSR, посчитанный постфактум, будет оптимистично смещён.
Тестируемо ли
Да, и именно на нашем движке. Нужны: BTC/ETH OHLCV (perp или spot), любая параметризованная стратегия (например, momentum с rolling-z), два прогона grid-search с разным охватом пространства параметров. Считаем DSR для каждого прогона по формуле Бейли–Лопес де Прадо. Данные есть, формула открытая, Python-реализация существует. Единственное честное ограничение: нужно заранее зафиксировать и не редактировать список конфигураций — иначе воспроизводим именно ту ошибку, о которой статья предупреждает.
Сомнения
Статья сама по себе — демонстрация проблемы, а не её решение. DSR не защищает от data-snooping полностью: он работает только если ты честно сообщаешь о размере пространства поиска. На практике исследователи часто «забывают» посчитать предварительные эксперименты, ручные правки и отброшенные идеи — и DSR снова становится оптимистичным. Кроме того, 5.7 лет BTC/ETH — это несколько очень разных режимов (бычий 2020–2021, медвежий 2022, боковик 2023–2024); стратегия, выжившая в grid-search, могла просто поймать один из этих режимов. Walk-forward OOS здесь необходим, но в аннотации о нём не упоминается.
Следующий шаг
Взять нашу rolling-z momentum стратегию на BTC perp (параметры: окно look-back, порог входа, стоп), запустить два grid-search: широкий (все комбинации) и узкий (только «разумные» диапазоны), посчитать DSR для каждого прогона и сравнить — насколько DSR лучшей конфигурации меняется в зависимости от задекларированного размера пространства. Горизонт: 2020–2024, walk-forward split 70/30.