Тренд-следование: P&L как замкнутая функция автокорреляции
Суть идеи
Sepp и Lucic делают то, что индустрия CTA обычно избегает: записывают P&L стандартного европейского тренд-следователя в замкнутой форме. Результат — формула, в которой прибыль стратегии раскладывается ровно на два измеримых компонента: автокорреляцию торгуемых доходностей и реализованную волатильность актива. Никаких «рынки трендируют» — только числа, которые можно посчитать до того, как ставить деньги.
Механизм интуитивно понятен: тренд-следователь покупает после роста и продаёт после падения. Если доходности положительно автокоррелированы (сегодняшний плюс предсказывает завтрашний плюс), стратегия систематически оказывается на правильной стороне. Если автокорреляция нулевая или отрицательная — стратегия платит транзакционные издержки и проигрывает mean-reversion. Замкнутая форма позволяет не гадать по бэктесту, а вычислить ожидаемый P&L аналитически при заданной оценке автокорреляции.
Важно, что волатильность входит в формулу отдельно: при одинаковой автокорреляции высоковолатильный актив даёт больший абсолютный P&L, но и большую дисперсию результата. Это прямо связывает тренд-следование с VRP-логикой: если вы продаёте волатильность через опционы и одновременно держите momentum-оверлей, эти два источника дохода частично хеджируют друг друга в режиме mean-reversion и частично конкурируют в трендовом режиме.
Применимость к крипте
BTC и ETH — идеальный полигон: автокорреляция дневных доходностей там нестационарна и меняется режимно. В бычьи фазы (2020–2021, конец 2023) она устойчиво положительна на горизонте 1–5 дней; в боковиках и медвежьих фазах уходит в ноль или минус. Формула Sepp–Lucic даёт готовый скалярный индикатор: rolling-автокорреляция на окне N дней — это и есть «термометр» для включения/выключения momentum-оверлея.
Для адаптации: вместо «европейского тренд-следователя» на фьючерсах берём позицию в перпетуальных свопах BTC/ETH с сигналом по EMA-crossover или time-series momentum. Funding rate служит дополнительным фильтром — высокий положительный фандинг исторически совпадает с положительной автокорреляцией (толпа уже в лонге, импульс есть). ATM IV нужна для нормировки волатильностного компонента формулы.
Тестируемо ли
Да, и достаточно прямолинейно. Нужны: дневные/часовые доходности BTC и ETH (есть), rolling-оценка автокорреляции лага-1 (считается в pandas за одну строку), реализованная волатильность (есть через OHLCV). Замкнутую формулу можно имплементировать как аналитический предиктор P&L и сравнить с фактическим P&L momentum-стратегии — это честная out-of-sample проверка: предсказывает ли формула знак и порядок величины прибыли на новом окне?
Чего нет напрямую: оригинальная статья, судя по аннотации, работает с фьючерсами на традиционные активы. Точная спецификация «европейского тренд-следователя» (lookback, ребалансировка, нормировка позиции) влияет на коэффициенты формулы — нужно будет либо достать препринт, либо вывести аналог самостоятельно.
Сомнения
Главный риск — не переподгонка, а режимная хрупкость. Автокорреляция крипты меняется быстро и непредсказуемо: rolling-оценка на 30 дней запаздывает именно тогда, когда режим переключается. Формула красива в стационарном мире; в реальном BTC она скажет «трендируй» за день до разворота. Второй момент: транзакционные издержки и проскальзывание в крипте на разворотах режима съедают значительную часть теоретического P&L — в замкнутой форме они, скорее всего, входят как константа, но в реальности нелинейны. Наконец, data-snooping: если подбирать окно автокорреляции по истории BTC, легко получить красивый бэктест без предсказательной силы.
Следующий шаг
Взять дневные доходности BTC с 2019 по сегодня, посчитать rolling lag-1 автокорреляцию на окне 21 день, использовать её знак как бинарный фильтр для простой time-series momentum стратегии (long если momentum > 0 AND autocorr > 0, flat иначе), прогнать walk-forward с expanding window и Deflated Sharpe — и сравнить с baseline momentum без фильтра.
Результаты тестов
Дописано 16 августа 2026 — прогон «Следующего шага» на нашем движке и данных. Сама статья выше не менялась.
Спека выполнена буквально: дневные доходности BTC с 2019-01-01 по сегодня, rolling lag-1 автокорреляция на окне 21 день, её знак как бинарный фильтр для time-series momentum (long, если momentum > 0 и autocorr > 0, иначе flat), walk-forward с expanding window, Deflated Sharpe, сравнение с тем же моментумом без фильтра. Сверх буквы: ETH вторым рукавом, семейство из 65 конфигураций на актив (окно автокорреляции {10, 21, 42, 63, 126} × лукбэк моментума {1, 5, 10, 20, 50} × режим {база, фильтр, long/short, long/short с гейтом, только знак ac}) и — главное — сама замкнутая форма, выведенная и проверенная отдельно от стратегии.
Инструмент — перп Binance (со спот-бэкфиллом левее сентября 2019), издержки 6 б.п. на единицу оборота, funding в P&L по фактическим выплатам, вход строго на следующий день. Приговор выносит не DSR, а ротационный max-T; DSR приводим, раз спека его просила.
Замкнутая форма: выводится, но компонентов не два, а три
Препринта Sepp–Lucic в открытом доступе нет, поэтому форму мы вывели сами — для знакового тренд-следователя она элементарна. Пусть сигнал S_t = Σ_k w_k · r_{t−k}, позиция q_t = sign(S_t), а пара (S_t, r_{t+1}) гауссова. Тогда
E[q_t · r_{t+1}] = √(2/π) · σ_r · c, где c = corr(S_t, r_{t+1}) = Σρ(1..K) / √(K + 2·Σ_{h<K}(K−h)·ρ(h))
то есть годовой Sharpe ≈ 15.24 · c — ровно «автокорреляция × волатильность», как в аннотации. Проверка на данных даёт первую поправку: при ненулевом сносе компонентов три, а не два. Без допущения E[r] = 0 форма распадается на два слагаемых:
E[q_t · r_{t+1}] = m_r · (2Φ(a) − 1) (снос) + 2c · σ_r · φ(a) (автокорреляция), где a = m_S / σ_S
При a = 0 второе слагаемое вырождается в учебное √(2/π)·σ_r·c, а первое исчезает — отсюда и берётся «ровно два компонента». Но первый член — это чистая бета: при сносе знаковая позиция чаще длинная и зарабатывает на самом росте, без всякой автокорреляции. На BTC (снос +0.031σ в день) он даёт +0.06 годового Sharpe против +0.15 от автокорреляционного члена — не мелочь, а треть результата. Та же арифметика видна в тождестве, которое мы проверили побитово: long-only моментум спеки ≡ ½ · buy&hold + ½ · знаковая стратегия. Половина того, что спека предлагает измерять, — это бета, а не тренд.
Сравнение предсказания с фактом (брутто, окно 2019–сегодня):
| K | Σρ(1..K) | SR по автокорр. | + снос | = предсказано | факт брутто | факт нетто |
|---|---|---|---|---|---|---|
| BTC 1 | −0.0708 | −1.08 | +0.01 | −1.06 | −0.40 | −0.77 |
| BTC 5 | +0.0078 | +0.05 | +0.03 | +0.09 | +0.04 | −0.12 |
| BTC 20 | +0.0441 | +0.15 | +0.06 | +0.21 | +0.65 | +0.58 |
| BTC 50 | +0.1784 | +0.35 | +0.10 | +0.45 | +0.70 | +0.66 |
| ETH 1 | −0.0763 | −1.16 | +0.01 | −1.15 | −0.59 | −0.87 |
| ETH 20 | +0.0248 | +0.08 | +0.03 | +0.12 | +0.36 | +0.30 |
| ETH 50 | −0.0096 | −0.02 | +0.05 | +0.03 | +0.51 | +0.48 |
Знак форма угадывает (7 из 9 ячеек по обоим активам), порядок величины — нет: систематический промах в 2–4 раза, причём в обе стороны (K=1 переоценён, K=20–50 недооценён). Гауссово допущение на крипте не выполняется, и цена этого — коэффициент, а не поправка.
Как предиктор на новом окне — не работает
Именно это статья предлагает как честную проверку: оценить ρ на прошлом, предсказать P&L на следующем окне, сравнить. Мы прогнали 130 прогнозов на 91 день вперёд (оценка ρ по трейлинг-365, все пять лукбэков), конкурент — наивный трейлинг-Sharpe той же стратегии:
| ранговая IC | p (блочная перестановка) | попадание в знак | наивный конкурент | |
|---|---|---|---|---|
| BTC | −0.189 | 0.347 | 38% | −0.030 / 52% |
| ETH | −0.079 | 0.714 | 44% | +0.070 / 60% |
Предсказательной силы нет ни на одном активе (точечная оценка отрицательна, от нуля неотличима), а по знаку формула проигрывает тому, чтобы просто посмотреть на прошлый Sharpe. Средняя |предсказанная| величина 0.55–0.59 против |фактической| 1.36–1.57 — формула систематически занижает размах втрое.
Посылка статьи о режимности — не подтверждается
Утверждение «автокорреляция крипты нестационарна и меняется режимно» проверяется прямо. Нуль: знаковая рандомизация $r^_t = s_t\,|r_t|$ — траектория волатильности сохраняется точно, а истинная автокорреляция равна нулю и постоянна* по построению. Если наблюдаемый разброс rolling-оценки не выше, чем в таком мире, «режимы» неотличимы от шума оценки:
| окно | sd(ac) BTC | нуль | p | sd(ac) ETH | нуль | p |
|---|---|---|---|---|---|---|
| 10 | 0.2835 | 0.2878 | 0.72 | 0.2763 | 0.2867 | 0.93 |
| 21 | 0.2100 | 0.2174 | 0.80 | 0.1994 | 0.2156 | 0.96 |
| 42 | 0.1595 | 0.1699 | 0.81 | 0.1472 | 0.1649 | 0.94 |
| 63 | 0.1357 | 0.1473 | 0.77 | 0.1232 | 0.1409 | 0.91 |
| 126 | 0.0995 | 0.1156 | 0.86 | 0.0865 | 0.1097 | 0.96 |
На всех пяти окнах и обоих активах наблюдаемый разброс ниже нулевого. То есть вся видимая «нестационарность» rolling-автокорреляции — это дисперсия оценки на коротком окне, а не смена режима. Заодно: сама полновыборочная ρ(1) не просто не положительна в бычьих фазах, она устойчиво отрицательна — BTC −0.071 (p 0.028), ETH −0.076 (p 0.007), а Σρ(1..5) равна +0.008 и −0.014, то есть нулю. Утверждение «в бычьи фазы автокорреляция устойчиво положительна на горизонте 1–5 дней» на наших данных не воспроизводится.
Что на самом деле означает правило «autocorr > 0»
Оценка Пирсона на окне W демеанируется внутри окна и потому смещена вниз. Смещение мы измерили не по учебной аппроксимации −1/(W−1) (она промахивается на коротких окнах), а нулём знаковой рандомизации на том же ряде — и независимо подтвердили симуляцией на iid-шуме. Отсюда следствие, которого в спеке нет: «ac > 0» — это не «автокорреляция положительна», а «истинная ρ выше порога, который молча задаётся длиной окна»: +0.098 при W=10, +0.046 при W=21, +0.009 при W=126.
Что происходит, если снять смещение (то есть проверить именно положительность ρ, как написано в статье):
| окно | подразумеваемый порог ρ | Δ Sharpe BTC сырой → без смещения | Δ Sharpe ETH сырой → без смещения |
|---|---|---|---|
| 10 | +0.098 | +0.19 → +0.20 (p 0.007) | −0.58 → −0.43 |
| 21 (спека) | +0.046 | +0.10 → +0.01 (p 0.110) | −0.09 → −0.09 |
| 42 | +0.022 | −0.17 → −0.12 | +0.07 → +0.18 (p 0.060) |
| 63 | +0.014 | −0.49 → −0.25 | −0.02 → −0.02 |
| 126 | +0.009 | −0.74 → −0.58 | −0.56 → −0.53 |
Весь эффект спековой ячейки на BTC (+0.10) держался на смещении: как только порог становится настоящим нулём, остаётся +0.01. Уцелевшие ячейки — W=10 на BTC и W=42 на ETH — это разные окна на разных активах, то есть ровно то, как выглядит шум.
Стратегия: спековая ячейка
| BTC | ETH | |
|---|---|---|
| Фильтр (ac 21д, momentum 20д) | +1.04 | +0.60 |
| Baseline: momentum 20д без фильтра | +0.94 | +0.69 |
| Buy & hold | +0.74 | +0.68 |
| Δ фильтра против собственного нуля | +0.10 (p 0.038) | −0.09 (p 0.234) |
| p_max (family-wise) | 0.308 | 0.870 |
| Deflated Sharpe | 0.36 | 0.11 |
| Лучшая из 65 ячеек | +1.25 (p_max 0.086) | +0.90 (p_max 0.682) |
| Walk-forward expanding: фильтр / база / выбор по всему меню | +0.98 / +0.80 / +0.45 | +0.54 / +0.68 / +0.45 |
На BTC фильтр добавляет +0.10 Sharpe, на ETH отнимает 0.09. Family-wise не проходит ни одна из 130 конфигураций (65 × два актива); DSR нигде не приближается к 0.95. Walk-forward воспроизводит наш давний результат: выбор по всему меню (+0.45) хуже любой статики — «допуск полезен, argmax вреден» подтверждается уже пятым меню.
Отдельный нуль мы построили специально для вопроса статьи: сдвигать циклически только индикатор ac > 0, оставляя моментум и рынок на месте. Тогда доля дней «в рынке» и персистентность фильтра сохраняются точно, гибнет лишь выравнивание с рынком — и тест отвечает, несёт ли знак автокорреляции информацию сверх простого сокращения экспозиции. Ответ важен: случайный фильтр той же скважности отнимает 0.44 Sharpe на BTC (стоимость выхода из растущего актива плюс оборот), настоящий добавляет 0.10. То есть фильтр лучше случайного гейта — но family-wise по сетке из 25 вариантов это даёт p_max 0.348 на BTC и 0.868 на ETH.
Чем это НЕ объясняется
Две естественные альтернативы мы проверили и отклонили — в пользу статьи.
Это не переодетый фильтр волатильности. Корреляция ac с log RV20 всего −0.087 (BTC) и −0.097 (ETH), а vol-фильтр с точно такой же скважностью даёт −0.42 на BTC вместо +0.10. Внутри терцилей RV разница между ac>0 и ac<0 на BTC сохраняется во всех трёх бакетах (+17, +34, +148 пп годовых).
Это не лукахед. Порча будущего оставляет позиции в прошлом побитово теми же. Контрольная линза: если дать моментуму знать завтрашний день, Sharpe прыгает с +1.04 до +1.88 (BTC) и с +0.60 до +1.63 (ETH) — харнесс к таймингу чувствителен. А если то же самое сделать с автокорреляцией, Sharpe падает (+0.94 и +0.31): знание будущей ac не помогает. Лишний день лага почти ничего не меняет (+1.07 / +0.65) — сигнал ведёт себя как медленное расписание экспозиции, а не как тайминг.
Главное: конструкция не смогла бы найти эффект, даже если бы он был
Это решающий тест, и он не про BTC. Мы построили синтетические миры, в которых статья верна по построению: AR(1) с режимно переключающейся ρ известной амплитуды, блоками по 60 дней, с волатильностью BTC. Затем прогнали ровно ту конструкцию, которую предлагает «Следующий шаг», и посчитали, как часто она находит эффект на уровне 5%:
| истинная |ρ| режима | знак ac(21д) угадан | Δ Sharpe | эффект найден (BTC-мир) | найден (ETH-мир) |
|---|---|---|---|---|
| 0.05 | 56% | −0.09 | 8% | 8% |
| 0.15 | 65% | +0.00 | 13% | 12% |
| 0.30 | 76% | +0.20 | 18% | 18% |
| 0.45 | 81% | +0.38 | 22% | 20% |
| 0.60 | 83% | +0.67 | 48% | 47% |
Даже при |ρ| = 0.30 — амплитуде, которой в ликвидных рынках не бывает, — 21-дневная оценка угадывает знак режима в 76% случаев, а тест находит эффект в 18% миров. Приемлемой мощности конструкция достигает где-то за |ρ| ≈ 0.6. Выбор лучшего окна из пяти с честной поправкой на перебор не помогает. Причина арифметическая: стандартная ошибка lag-1 автокорреляции на 21 наблюдении — около 0.22, а спорные величины ρ имеют порядок 0.02–0.05, то есть отношение сигнала к шуму примерно 1:5. Знак rolling-ac меняется 32 раза в год — это частота подбрасывания монеты, а не смены режима.
Отсюда главный вывод прогона: отрицательный результат по BTC/ETH — это в первую очередь свойство метода, а не мира. Замкнутая форма может быть верна, и режимы могут существовать — но rolling-оценка автокорреляции на 21 дне не способна их разрешить, и любой бэктест на её основе измеряет собственный шум. Тот, кто получит на такой схеме красивую кривую, почти наверняка получит её из порога, спрятанного в смещении оценки.
Контроли и верификация
Пустышки: 20 миров с циклически сдвинутой доходностью — family-wise ложных 5% (BTC) и 10% (ETH) при номинальных 5%. Мощность теста: фильтр с внедрённым истинным эджем ΔSR ≈ 1.0 обнаруживается с p < 0.0001 на обоих активах — то есть тест не слеп, слепа конструкция. Контроль нуля: EW всего меню на 89-м и 76-м перцентиле (меню однородно-лонговое, здесь нуль консервативен и годится для отрицательных вердиктов), buy&hold на 18-м и 7-м.
Верификация — независимая реимплементация с нуля, 35 проверок из 35: свой обход Binance, своя rolling-автокорреляция ковариационным циклом, свой P&L дневным циклом (Sharpe сходится до 2e-4), свёрнутая формула Var(S) против прямой двойной суммы (Δ 5e-13), тождество long-only ≡ ½ B&H + ½ знаковая (Δ ровно 0), нуль фильтра на другом сиде (перцентиль 94% против 96%), смещение оценки прямой симуляцией на iid-шуме, лукахед через порчу будущего, побайтовый детерминизм повторного прогона.
Код: research_trend_autocorr.py, верификатор verify_trend_autocorr.py.