За последний год я проверил около двадцати торговых идей. Каждая сначала выглядела убедительно: приличная 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 — буду рад отзывам и критике там или в комментариях здесь. На вопросы по устройству стенда отвечу.
ссылка на оригинал статьи https://habr.com/ru/articles/1088994/