Как я перестал верить красивым бэктестам: 10 ловушек с реальными цифрами

За последний год я проверил около двадцати торговых идей. Каждая сначала выглядела убедительно: приличная t-статистика, гладкая кривая доходности, понятная история. И каждая умерла на конкретной проверке. В этой статье собраны эти проверки с реальными цифрами «до» и «после».
Полезным итогом года оказалась не стратегия, а скорость, с которой я научился убивать неправильные.
Правила, без которых результат не считается
Признаки строятся только из прошлого. Скользящее окно заканчивается на предыдущем баре, а не на текущем.
Пороги фиксируются до прогона. Если перебираете сетку, печатайте её целиком, чтобы видеть, как знак меняется между ячейками.
Доходность меряется вперёд от бара входа.
Контроль — весь юниверс за те же минуты, а не годовой дрейф. На растущем рынке «прибыльна» любая покупка: один только пятидневный дрейф давал от +70 до +119 бп.
Издержки вычитаются явно: комиссия, половина спреда, проскальзывание.
Значимость считается по независимым единицам (подробнее ниже, это главное).
Период делится пополам. То, что живёт в одной половине и умирает в другой, — шум.
Юниверс должен включать инструменты, которых уже нет.
В итоговой цифре нет максимума по сетке.
Единица счёта
Наблюдений много, событий мало. Три реальных случая:
что мерил | наивный t | правильная единица | результат |
|---|---|---|---|
агрессивный поток покупок → цена через 15 мин | +15.0 по дням | вход с задержкой 5 мин | −0.2 бп, эффект жил внутри сигнального бара |
«индикатор на 30-дневном минимуме» → −32 бп на следующий день | −2.7 по дням | по эпизодам входа в состояние | −0.3 |
«сильный сигнал даёт +0.34R» | +4.67 по сделкам | без одного дня обвала | −0.010R |
В последнем случае 104 сделки из 434 открылись в один день обвала и дали 111% всей прибыли. Без этого дня стратегии не было.
Отсюда правила. Сигнал-состояние (инструмент сидит в нём днями) считается по эпизодам, а не по барам. Сигналы внутри одного рыночного события — одно наблюдение, а не сто. Всегда проверяйте, что останется без лучшего дня и без лучших трёх недель. А если все инструменты торгуются в одну минуту, сначала усредните по инструментам внутри дня, потом считайте t по дням.
Смещение выживания — не ошибка округления
На юниверсе из 840 инструментов, где 315 исчезли за два года, длинная сторона отличалась на 1–2 процентных пункта в год между «полным юниверсом» и «только выжившими». Короткая — на 8–18 пунктов. Любой вывод «шорт не работает», сделанный на выживших, недействителен: в данных просто нет тех бумаг, которые стоило шортить.
Попутный факт: прямо перед делистингом цена уже перестала падать. Медианное движение за последние 30 дней — 0.0%. Обвал случился задолго до этого. К моменту, когда видно, что бумага уходит, шортить уже нечего.
Каталог самообманов
Выбор чемпиона на отложенной выборке. Максимум из сотен кандидатов смещён вверх. +0.50R на отложенной выборке превратились в −0.05R вне выборки.
Признак, который тайно равен «количество × цена». Открытый интерес в долларах — это контракты, умноженные на цену, так что «OI на максимуме» означает «цена на максимуме». В натуральных единицах +48.7 бп превратились в +4.7 при t = −0.1.
Замаскированный моментум. Индикаторы позиционирования движутся вместе с ценой. Разбивка по прошлой доходности: от −12 до −16 бп везде, кроме корзины «уже выросло больше 5%», где было +138.
Подглядывание через агрегат. Если срез данных помечен временем начала своего окна, вы читаете будущее. Задержка входа на один интервал превратила +4.65 бп в −0.22.
Эффект меньше спреда. На неликвидных бумагах «возврат к среднему» — это отскок между бидом и аском. Исполнение по худшей стороне бара превратило +26.0 бп в −26.8 при внутриминутном размахе 53 бп.
Равный вес на день. «+111 бп по дням» при нуле по сделкам означает, что вес получили дни с одной сделкой.
Сортировка, которая знает будущее. Упорядочивание одновременных сигналов по времени выхода дало +51% годовых вместо +2.3%.
Стоп, который меняет знак. Кандидат с +13.7 бп на сделку ушёл в −8…−26 бп со стопом 3×ATR. Стоп — часть стратегии, мерить их надо вместе.
Хвост решает год. Сетап с +70% годовых держался на 30 сделках из 3504. Проверяйте результат без топ-1/3/5/10/20 сделок.
Фальшивая широта. «Работает на 71% инструментов» ничего не значит, если они коррелированы.
Что выжило
На акциях США после всего этого выжил только хрестоматийный моментум 12-1: ранжирование по доходности за последние 12 месяцев без последнего месяца, равные веса, ребаланс раз в месяц. Любая попытка его улучшить делала хуже. Градиентный бустинг ранжировал не лучше равновзвешенной корзины. Стоп-лоссы были в минусе во всех 108 опробованных комбинациях, фильтры по индикаторам — во всех 44, а умные правила выхода ни разу не обыграли «продать, когда выпала из топа».
Цифры сдвинуло исполнение. Спред в первые минуты после открытия был около 61 бп, а к полудню по Нью-Йорку — около 15 бп, поэтому ордера теперь уходят после 12:00. А при минимальной комиссии за ордер маленький счёт с 10 бумагами обыграл тот же счёт с 20.
Чек-лист
Признаки только из прошлого, пороги объявлены заранее.
Издержки названы и вычтены, эффект сравнён с ними.
Эффект больше внутриминутного размаха.
t посчитан по независимым единицам.
Результат переживает удаление лучшего дня и лучших трёх недель.
Обе половины периода дают один знак.
Юниверс включает делистингованные инструменты.
Вход задержан на один интервал, эффект на месте.
Ни одна итоговая цифра не является максимумом по сетке.
Практический вывод: измеряйте до того, как пишете код. Вечерний скрипт, который закрывает гипотезу навсегда, дешевле недели, потраченной на её реализацию.
Этот стенд теперь двигает мой проект Femidko Stock Analyzer & Trader: он ведёт портфель по правилу 12-1 на собственном счёте пользователя через API-ключ без права вывода, только покупки, и всё начинается бесплатно на бумаге. Сейчас работает Binance, на подходе Alpaca, Tiger Brokers и Kraken xStocks. Сегодня у проекта запуск на Product Hunt — буду рад отзывам и критике там или в комментариях здесь. На вопросы по устройству стенда отвечу.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.