Вероятно, сигнал входа — наименее важная часть вашего бэктеста. Возьму одно посредственное правило на основе импульса, оставлю все временные метки входа и выхода без изменений, поменяю только функцию, которая определяет число контрактов в позиции, и чистый коэффициент Шарпа сдвинется с 0.41 до 0.71, а максимальная просадка — с 31% до 13%. Те же сделки. Те же исполнения. Другая стратегия.
Такое утверждение раздражает людей — и не зря: выходит, что большая часть времени, потраченного на подбор периодов и порогов фильтров, уходит на мелочь. Поэтому покажу реальные прогоны, а затем признаю правоту критиков: у этого аргумента есть неверная версия, и важно понимать, какую именно версию отстаиваю я.
Один сигнал, 6 способов держать позицию
Сигнал: бессрочный контракт ETHUSDT на Binance USDⓈ-M, 1-часовые бары; длинная позиция, когда 12-часовая EMA выше 96-часовой EMA, иначе вне рынка; коротких позиций нет. С июля 2022 по июнь 2026 года. 431 сделка туда-обратно. Комиссии taker в обе стороны по 5.0 б.п., funding уплачивается или начисляется каждые 8 часов по фактической позиции, проскальзывание моделируется на основе глубины лучших цен. Сигнал намеренно скучный — я выбрал его, потому что никто не станет его защищать, а значит, это чистая основа для проверки.
Во всех строках ниже временные метки баров входа и выхода совпадают. Различается только функция расчёта размера позиции.
| Правило расчёта размера позиции | Чистый коэффициент Шарпа | Макс. просадка | Годовой оборот номинала (× средний размер позиции) | Издержки в % от валовой прибыли | Пиковое плечо |
|---|---|---|---|---|---|
| Фиксированный номинал $10k | 0.41 | 18.2% | 246× | 14% | 1.0× |
| Фиксированная доля, 100% капитала | 0.44 | 30.8% | 251× | 15% | 1.0× |
| Размер позиции обратно пропорционален реализованной волатильности за 20 дней | 0.68 | 14.1% | 690× | 29% | 4.4× |
| Целевая годовая волатильность 20%, перебалансировка каждый час, без ограничения | 0.71 | 12.9% | 1,180× | 41% | 6.3× |
| Целевая волатильность 20%, зона без сделок 20%, ограничение плеча 3× | 0.66 | 15.3% | 402× | 19% | 3.0× |
| Половина Келли по скользящим среднему и дисперсии за 60 дней | 0.52 | 24.6% | 830× | 33% | 8.1× |
Посмотрите на разброс. Между худшей и лучшей строками относительная разница коэффициента Шарпа составляет 73%, а просадка отличается в 2.4 раза. А теперь найдите на этом наборе данных параметр сигнала входа, который сдвинет коэффициент Шарпа на 0.30 и при этом не будет выглядеть как явная подгонка. Я искал. Период пары EMA меняет показатель примерно на 0.12 во всей правдоподобной сетке значений, и большая часть этого сдвига — шум, который не сохраняется на вневыборочных данных.
Почему обратная волатильности схема так хороша и какая часть улучшения реальна
Механизм прост. При фиксированном номинале размер позиции не связан с реализованной волатильностью, а значит, долларовый риск на сделку пропорционален волатильности в конкретную неделю. За этот период реализованная волатильность ETH за 20 дней колебалась от 31% до 118% в годовом выражении. В марте 2024 года фиксированный номинал давал в 3.8× больший долларовый риск, чем в июле 2023-го: не потому, что сигнал стал увереннее, а потому, что рынок стал шумнее. Почти вся его просадка приходится на верхний квинтиль волатильности. Расчёт размера позиции обратно пропорционально волатильности устраняет эту связь, и это действительно улучшает форму потока доходности.
Однако часть прироста коэффициента Шарпа — артефакт измерения, и если не отделить одно от другого, дальше вы будете принимать неверные решения. Коэффициент Шарпа делит доходность на стандартное отклонение доходности. Таргетирование волатильности по определению стабилизирует стандартное отклонение доходности. То есть вы напрямую оптимизируете знаменатель. Правило, которое масштабирует позиции для достижения постоянной ожидаемой волатильности, повысит коэффициент Шарпа почти у любого потока доходности с кластеризацией волатильности, в том числе у потоков с нулевым преимуществом. Я проверил это на перемешанных сигналах: случайным образом меняем временные метки входа, оставляем надстройку с таргетированием волатильности — и коэффициент Шарпа всё равно улучшается примерно на 0.06 относительно фиксированного номинала при нулевом среднем базового потока. Немного, но не ноль, и причина чисто механическая.
Поэтому при внутреннем сравнении правил расчёта размера позиции коэффициент Шарпа никогда не бывает единственным показателем в таблице. Мне нужны Calmar, чистая прибыль на единицу среднего задействованного номинала и распределение валовой прибыли на чистую, потому что эти три показателя гораздо сложнее подкрутить манипуляцией со знаменателем.
Оценка волатильности — это модель, и она подвержена утечке данных
Самая распространённая причина, по которой хороший результат расчёта размера позиции оказывается фиктивным: оценка волатильности использует данные бара, для которого рассчитывается размер. Если ряд волатильности вычисляется по центрированному окну, либо через `rolling().std()` по умолчанию в pandas после ресемплинга, включающего текущий незакрытый бар, либо на основе стандартизации по всей выборке, значит, у вас утечка данных. Её легко не заметить, потому что волатильность обладает устойчивостью: утечка мала для любой отдельной строки, а кривая капитала всё ещё выглядит правдоподобно. Просто она немного чересчур гладкая именно в самые важные недели.
Перед тем как допустить результат в очередь бумажной торговли, наши агенты проверяют каждое правило расчёта размера позиции по 4 пунктам:
- Доступность данных на момент принятия решения. Размер позиции для бара, открывающегося в 14:00, должен рассчитываться на основе данных с временной меткой закрытия не позже 13:59:59.999. Мы проверяем это, повторно рассчитывая ряд размеров позиций по обрезанному фрейму для случайной выборки из 200 точек принятия решения и сравнивая результаты.
- Период оценки — полноценный параметр. Окно волатильности в 20 дней и окно в 60 дней — это 2 разные стратегии. Период включается в сетку параметров для walk-forward тестирования наравне со всем остальным, а если результат работает только при одном периоде, это говорит о хрупкости стратегии.
- Траектория плеча, а не только его пик. Выводите полное распределение валового плеча. Прогон с неограниченным таргетированием волатильности выше провёл 4% часов с плечом более 5×. Такое обычно не попадает в сводную таблицу, хотя полностью определяет, можно ли реализовать стратегию.
- Чувствительность расчёта размера позиции как тест на устойчивость. Если коэффициент Шарпа рушится при изменении целевой волатильности с 20% до 25%, значит, стратегия подстроена не под целевую волатильность, а под плечо — вы нашли преимущество, просто выбрав нужное число.
Ограничение плеча — часть определения стратегии, а не декоративное дополнение к управлению рисками. На Binance уровни для ETHUSDT снижают максимальное плечо по мере роста номинала позиции, а вместе с ним повышается ставка поддерживающей маржи. Бэктест, который позволяет правилу таргетирования волатильности разогнаться до 6.3× при номинале $400k, описывает позицию, которую биржа не позволит держать с такой маржой. Строка с ограничением стоит 0.05 коэффициента Шарпа и лишь она из этих двух описывает реальную позицию.
На перебалансировке и утекают деньги
Обратите внимание на столбец издержек. Ежечасная перебалансировка под целевую волатильность дала лучший показатель коэффициента Шарпа и одновременно отдала бирже 41% валовой прибыли. За год проторговали номинал, в 1,180× превышающий средний номинал позиции, с комиссией 5 б.п. в каждую сторону плюс спред и рыночное воздействие. Очевидное решение — реже перебалансироваться по расписанию. Лучше использовать зону без сделок: менять размер позиции, только если текущий размер отклоняется от целевого больше заданного порога.
Зона в 20% сократила годовой оборот номинала с 1,180× до 402× — на 66% — и снизила коэффициент Шарпа на 0.05. Я проверил это уже на 8 сигналах, и результат повторяется: зоны от 15% до 25% сохраняют большую часть эффекта контроля риска при одной трети оборота, а порог ниже 10% — это просто комиссии за косметическую точность величины, которую вы всё равно оцениваете по окну в 20 дней. Нельзя перебалансировать до 3 знаков после запятой, опираясь на число со стандартной ошибкой 15%.
В феврале у нас был прогон, где в отчёте агента улучшение коэффициента Шарпа на 0.22 приписали «улучшенному фильтру входа». Разница заключалась в одной строке модуля расчёта размера позиции. Фильтр не менялся. Теперь я добавляю в начало отчёта хеш конфигурации размера позиции: атрибуция требует дисциплины, а модели так же охотно сочиняют складные истории, как и люди.
Как бумажная торговля меняет правило расчёта размера позиции
Именно здесь разрыв между бэктестом и бумажной торговлей становится максимальным, и в основном причина арифметическая. При расчёте размера позиции с учётом волатильности размер колеблется в 4–8 раз за весь период. На обоих концах этого диапазона возникают ограничения биржи, которые бэктест не моделировал.
При малом размере: шаг количества и минимальный номинал. Для бессрочного контракта ETHUSDT шаг количества равен 0.001, а минимум — $5. Если размер позиции в режиме низкой волатильности составляет 0.0004 ETH, бэктест удерживает её, а в бумажной торговле позиции нет. Звучит как редкий случай, пока не поймёшь, что правило таргетирования волатильности выставляет самые маленькие размеры в самых спокойных рынках, где при следовании за трендом часто появляются хорошие входы. При большом размере возникают другие ограничения: лимиты позиций, уровни маржи и необходимость строго контролировать изолированную маржу для позиции с плечом 6× — хотя в бэктесте даже не было модели ликвидации.
Мы обнаружили случай, когда кривая капитала в бумажной торговле шла в пределах 3% от бэктеста 6 недель, а затем резко разошлась. Причина была в округлении: усечение через `int()` вместо округления к шагу в модуле выставления размера ордера применялось к позициям со средним размером 1.4 шага. Бэктест рассчитывал размер в непрерывном пространстве, а реальный модуль терял 20-30% от целевого размера в каждой небольшой сделке. Никаких экзотических моделей исполнения, никаких историй о задержках. Усечение.
В чём критики правы
Есть 3 весомых возражения, и я не собираюсь их замалчивать.
Первое и самое важное: размер позиции распределяет преимущество, но не создаёт его. Если валидное ожидание сигнала до вычета реалистичных комиссий и funding равно нулю или ниже, любое правило из этой таблицы принесёт убыток — продвинутые правила лишь обеспечат более красивое распределение доходности. Я выбрал сигнал с небольшим, но положительным чистым преимуществом за этот период. Если применить те же 6 правил к сигналу с чистым результатом −1.2 б.п. на сделку, ранжирование останется тем же, но итоговый капитал по каждому правилу окажется ниже начального. Расчёт размера позиции — это множитель чего-то. Само это что-то вам всё ещё нужно.
Второе: у таргетирования волатильности есть реальный и хорошо задокументированный недостаток — оно сокращает плечо внизу резкого обвала и наращивает его после отскока. При резком V-образном движении фиксированный номинал выигрывает, иногда с большим отрывом. Падение акций в марте 2020 года и обвал крипторынка в августе 2024-го оба наказали расчёт размера позиции с учётом волатильности на отскоке. В моём четырёхлетнем периоде по ETH оказалось больше затяжных движений с кластеризацией волатильности, чем V-образных разворотов, что выгодно для строк с обратной зависимостью от волатильности. На другом периоде часть порядка результатов меняется, и если бы я начал с таблицы за 2020 год, мой аргумент был бы гораздо слабее.
Третье: правило расчёта размера позиции можно так же подогнать, как и любой другой параметр. Показательный пример в моей таблице — половина Келли по скользящим оценкам: выглядит изощрённо, имеет теоретическое обоснование, но привела ко второй по величине просадке, потому что скользящая оценка среднего шумного ряда доходности никуда не годится, а критерий Келли крайне чувствителен к ней. Любое правило расчёта размера позиции, которое использует ожидаемую доходность, наследует ошибку этой оценки, причём в усиленном виде. Правила, использующие только оценку дисперсии, ведут себя гораздо устойчивее, потому что дисперсия — единственный момент, который действительно можно оценить по 4 годам часовых данных.
Вот что я вынес из всего этого: если результат бэктеста вас удивил, сначала проверьте модуль расчёта размера позиции, прежде чем искать хитрости в сигнале. А публикуя коэффициент Шарпа, указывайте рядом траекторию плеча и распределение валовой прибыли на чистую: число, которое настолько зависит от решения о размере позиции, вообще не является свойством сигнала.
← Все статьи


