baykovpro

← Quant

Тренд-следование: P&L как замкнутая функция автокорреляции

14 августа 2026 · 14 мин · momentum, автокорреляция, VRP, режимные фильтры

Суть идеи

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.

Источник: Aligrithm · оригинал на английском, разбор — авторский на русском.