baykovpro

← Quant

MACD — пассажир: что реально внутри «моментум-индикатора»

1 сентября 2026 · 28 мин · momentum, mean-reversion, бэктест, режимные фильтры

Суть идеи

Авторы «The Refutation» берут MACD — пожалуй, самый растиражированный «моментум-индикатор» в трейдинге — и ставят его на суд строгой процедуры: четыре предсказания сформулированы до запуска тестов, затем 360 измерений, 320 параметрических вариантов и режимная кросс-валидация на трёх полных системах. Центральный тезис: то, что MACD «делает», сводится к разнице двух скользящих средних, то есть к обычному трендовому фильтру. Гистограмма и сигнальная линия не добавляют информации — они лишь «пассажиры», которые едут на сигнале простого EMA-спреда.

Механизм, который авторы проверяют: если убрать из MACD всё, кроме базового EMA-спреда, и сравнить результаты с полной версией индикатора, разница в доходности и коэффициентах Шарпа статистически незначима. Иными словами, дополнительная «обёртка» не несёт предсказательной силы — она лишь создаёт иллюзию сложности и провоцирует переоптимизацию параметров.

Данные в оригинале — судя по описанию, традиционные рынки (акции/фьючерсы), горизонт не уточнён в аннотации, но масштаб (360 измерений, 320 вариантов) говорит о систематическом подходе, а не о cherry-pick.

Применимость к крипте

Для BTC/ETH история с MACD ещё острее: крипта торгуется 24/7, режимы меняются быстрее, а параметры «стандартного» MACD (12/26/9) никогда не оптимизировались под криптовые тайм-фреймы. Если на традиционных рынках MACD — пассажир, на крипте он, скорее всего, ещё и с опозданием на поезд.

Переносимость прямая: EMA-спред на дневных или 4-часовых данных BTC/ETH — это ряд, который у нас есть. Интереснее наложить режимный фильтр: в периоды высокого ATM IV (опционный рынок в панике) моментум-сигналы исторически ломаются — это можно проверить через наш ряд ATM IV Deribit. Дополнительно: funding rate как прокси «перегрева» тренда — если MACD даёт лонг, а funding уже экстремально положительный, это конфликт сигналов, который стоит тестировать отдельно.

Тестируемо ли

Да, с оговорками. Спот-цены BTC/ETH daily — есть. Rolling-z на EMA-спреде (аналог MACD без обёртки) — строится тривиально. Режимный фильтр через реализованную волатильность или ATM IV — есть. Walk-forward с Deflated Sharpe на нашем движке — штатный инструмент.

Чего нет: точных параметров и методологии кросс-валидации из оригинала (аннотация обрезана). Придётся воспроизводить логику самостоятельно, что само по себе полезно — это защита от слепого копирования чужих in-sample результатов.

Сомнения

360 измерений и 320 вариантов — это звучит как строгость, но это же и потенциальный data-snooping рай. Авторы говорят, что предсказания сформулированы заранее — хорошо, но мы не видим pre-registration и не можем проверить. Режимная кросс-валидация упомянута, но без деталей непонятно, насколько режимы независимы (перекрывающиеся окна дают ложное ощущение робастности). Наконец, вывод «MACD — пассажир» может быть верен в среднем, но неверен в конкретном режиме низкой волатильности с устойчивым трендом — а именно такие режимы в крипте бывают месяцами.

Следующий шаг

Прогнать на дневном BTC (2019–2024) сравнение двух систем: (A) полный MACD(12,26,9) и (B) голый EMA-спред(12,26) без сигнальной линии и гистограммы. Walk-forward окна по 365/90 дней, метрика — Deflated Sharpe. Добавить режимный фильтр: включать сигнал только при rolling-z реализованной волатильности ниже медианы. Гипотеза: разница между A и B незначима, а режимный фильтр даёт больший прирост, чем любая параметрическая настройка MACD.

Результаты тестов

Дописано 2026-09-01 — прогнали на дневных BTC и ETH, 2017-08-17 … 2026-08-31 (3302 дня на актив), сетка 1260 конфигураций. Тезис статьи выдержал, но его формулировку пришлось переписать: гистограмма — не пассажир. Это вторая, вдвое более быстрая система, которая совпадает с голым спрэдом лишь в 58% дней и почти не коррелирует с ним по позициям. Просто своего эджа у неё нет — как, впрочем, и у самого спрэда, если честно поправиться на размер поиска. А «следующий шаг» этой карточки — режимный фильтр по волатильности — не подтвердился: он даёт меньше, чем разброс от параметрической подстройки, и его знак повторяет вол-тайминг обычной беты.

Оговорка о провенансе. Ссылка на оригинал (редирект Quantocracy) отдаёт HTTP 400, аннотация обрезана: ни списка активов, ни горизонта, ни того, что именно авторы называли «360 измерениями» и «320 вариантами», мы не видим. Поэтому ниже — прогон ИДЕИ по её описанию, на своём стенде и со своими определениями, а не репликация авторских чисел.

Стенд и предрегистрация

Binance, дневные close: перп плюс спот-бэкфилл левее 2019-09, незакрытый бар сегодняшнего дня отброшен. Доходность держания считается по перпу — r = ret − funding, лонг платит, шорт получает (средний фандинг за период: BTC +9.0%/год, ETH +10.4%/год; это не мелочь, а прямой вычет из любого длинного трендследования). Издержки — лестница 0/2/6/10/20 бп на единицу оборота.

Сетка объявлена целиком ДО прогона, потому что «прошло/не прошло поправку на множественность» — свойство объявленной сетки, а не эффекта; сужать её постфактум под результат нельзя:

Итого 21 × 3 × 2 = 126 конфигураций B и по 378 на каждое A-правило — 1260 на актив. Окна: ART 2019–2024 (буква статьи), POST 2025-01 … 2026-08 (истинный out-of-sample за горизонт публикации) и FULL.

Гистограмма — не обёртка, а второй сигнал

Это первое, что стоило проверить до всякой экономики. hist = MACD − EMA₉(MACD) — не алгебраическая функция знака спрэда, а его дискретная производная. Как следствие:

канон (12, 26, 9), полная история BTC ETH
доля дней, где знак гистограммы совпадает со знаком спрэда 57.6% 59.0%
корреляция позиций +0.13 +0.15
оборот кросса сигнальной, раз/год 51.0 52.7
оборот голого спрэда, раз/год 21.8 20.0
оборот «гистограмма разворачивается» 184.7 179.8

Совпадение 58% при двух состояниях — это чуть лучше подбрасывания монеты. Метафора «пассажир, который едет на чужом сигнале» описывает не то, что происходит. Пассажир ехал бы теми же позициями; здесь — вторая система, в среднем в 2.4 раза более оборотистая, расходящаяся с первой в 42% дней. Правильная формулировка вывода другая: обёртка несёт СВОЙ, почти независимый сигнал — и этот сигнал ничего не даёт. Разница не косметическая: из «дубликат» следует «можно выбросить и ничего не заметить», а из «независимый сигнал без эджа» — «выбросить можно, но заодно вы перестаёте платить лишние ~1.8% годовых комиссии за пустой оборот» (51 оборот × 6 бп ≈ 3.1% годовых у кросса против 1.3% у спрэда; у «разворота гистограммы» — 11.1% годовых, съедаемых до всякой торговой идеи).

Парный контраст: разницы нет

Главный тест — разность Sharpe между A-правилом и правилом B при тех же (f, s, θ, k): 378 пар на правило. Нуль контраста берётся не из головы, а из кругового сдвига доходностей при сохранённых позициях — обе ножки считаются на одном и том же сдвиге, так что механический штраф за оборот и экспозицию остаётся в нуле, а гибнет ровно выравнивание сигнала с рынком.

окно FULL, 6 бп Δ̄SR (A − B) доля пар > 0 нуль контраста p (двусторонний)
BTC · кросс сигнальной −0.096 0.36 −0.070 ± 0.397 0.93
BTC · полный MACD (оба условия) +0.063 0.65 −0.023 ± 0.179 0.58
BTC · разворот гистограммы −0.405 0.12 −0.134 ± 0.396 0.47
ETH · кросс сигнальной −0.228 0.27 −0.046 ± 0.371 0.47
ETH · полный MACD (оба условия) +0.065 0.52 −0.019 ± 0.162 0.52
ETH · разворот гистограммы −0.612 0.01 −0.089 ± 0.391 0.16

Ни одна строка не отличается от своего нуля. На окне статьи (2019–2024) картина та же: BTC −0.286 при нуле −0.185 ± 0.459 (p 0.78), ETH −0.104 при нуле −0.145 ± 0.422 (p 0.88).

Важная деталь про издержки: дефицит A-правил не создаётся комиссией. При нулевых издержках он на месте (BTC FULL −0.072, ETH FULL −0.209) и растёт с ростом издержек лишь линейно и медленно — то есть это не история про «экономию комиссии», как бывает у правил, снижающих оборот. Это просто отсутствие сигнала, к которому потом добавляется плата за оборот.

И контрольный аргумент против цитирования одиночных конфигураций. Разность у канонического MACD(12,26,9) против голого спрэда(12,26) при 6 бп:

BTC ETH
ART 2019–2024 −0.346 +0.023
POST 2025+ +0.034 −1.222
FULL −0.107 −0.364

Знак и величина полностью определяются тем, какой актив и какое окно взять. Любой из этих шести чисел можно вынести в заголовок — и получить противоположные «доказательства». Сеточная статистика существует именно для того, чтобы этого не делать.

Поправка на размер поиска не пропускает никого

Ротационный max-T (студентизированный Westfall–Young, 500 общих круговых сдвигов) по всем 1260 конфигурациям:

окно лучшая конфигурация её SR pEmp pMax E[max SR | H₀]
BTC ART A_both (5, 100, 18) +1.013 0.028 0.48 +0.97
BTC POST A_sig (20, 100, 5, θ .0, k 3) +1.704 0.000 0.51 +1.60
BTC FULL A_both (20, 21, 9, θ 1.0) +0.940 0.010 0.43 +0.77
ETH ART A_both (30, 50, 18) +0.969 0.046 0.73 +1.00
ETH POST A_sig (30, 100, 5, k 3) +2.424 0.000 0.17 +1.64
ETH FULL A_both (30, 50, 18) +1.205 0.008 0.07 +0.76

Ноль конфигураций из 1260 проходит family-wise ни в одном окне у обоих активов. Лучший результат сетки почти везде стоит на уровне ожидаемого максимума под нулём — то есть ровно там, где его и положено найти, если сигнала нет вовсе. Тот же ответ даёт независимая проверка в мире без памяти: перетасовываем пары (доходность, фандинг), пересобираем ценовой путь и всю сетку заново, 200 раз. Лучший SR сетки на реальном BTC +0.940 против +0.751 ± 0.225 в мире без памяти, pEmp 0.185.

Отдельно стоит отметить, что и голый спрэд не выживает, хотя выглядит живее: на FULL его одиночный pEmp 0.028–0.050, но pMax 0.74–0.86. Трендследование на дневках BTC/ETH за девять лет — на границе различимости, а его MACD-обёртка за эту границу не заходит вовсе.

Режимный фильтр — самый интересный провал

«Следующий шаг» карточки предполагал: включать сигнал только когда реализованная волатильность ниже медианы, и что этот фильтр даст больше, чем любая параметрическая настройка. Проверяем гейт «перцентиль RV₂₀ за 252 дня < 0.5» (скважность 0.58 BTC / 0.56 ETH):

BTC ETH
Δ̄SR от гейта по всей сетке −0.010 +0.259
доля конфигураций, которым стало лучше 0.37 0.91
нуль фильтра (сдвинут ТОЛЬКО гейт, скважность цела) −0.099 ± 0.128 −0.089 ± 0.112
pEmp против нуля фильтра 0.26 0.000
разброс SR от параметрической настройки (p90 − p10) 0.703 0.984
тот же гейт на ПОСТОЯННОМ лонге +0.685 → +0.527 (−0.158) +0.588 → +0.751 (+0.162)

Три вывода, и все три против гипотезы.

Во-первых, гейт не воспроизводится: на ETH он значим, на BTC его нет вовсе. Один актив из двух — это не эффект, это монетка.

Во-вторых, даже там, где он есть, он меньше разброса от подстройки параметров (0.259 против 0.984), то есть утверждение «фильтр даёт больше, чем любая параметрическая настройка» на нашем стенде неверно в обе стороны.

В-третьих — и это главное — гейт по волатильности есть график экспозиции, а не взаимодействие с MACD. Последняя строка таблицы разделяет одно от другого: приложите тот же гейт к постоянному лонгу, где никакого отбора нет. На ETH он даёт +0.162, на BTC −0.158 — то есть весь знак сеточного эффекта повторяет вол-тайминг обычной беты, с точностью до величины. Ничего специфически «моментумного» фильтр не чинит. Он просто убирает вас с рынка в дни высокой волы, и хорошо это или плохо — свойство актива, а не индикатора.

Walk-forward: подстраивать хуже, чем не подстраивать

Расширяющееся окно, IS ≥ 365 дней, OOS 90 дней, 32 фолда — как и просила карточка. Out-of-sample Sharpe при 6 бп:

BTC ETH
argmax по A-семейству (выбираем лучший MACD на IS) −0.003 +0.377
argmax по B-семейству (лучший спрэд на IS) +0.175 +0.418
равновзвешенно вся сетка 1260 +0.452 +0.397
фиксированный канон MACD(12, 26, 9) +0.315 +0.202
фиксированный голый спрэд 12/26 +0.646 +0.384

Выбор лучшей конфигурации по прошлому не переносится: на BTC он проигрывает фиксированному голому спрэду 0.65 SR, на ETH ничью держит только за счёт того, что там проигрывают все. Это независимое воспроизведение старого результата нашего стенда — argmax по меню вреден, а равновзвешенная корзина всего меню устойчиво лучше своего же победителя. Deflated Sharpe лучшей конфигурации, для полноты: 0.40–0.57 по окнам и активам, но сравнивать этот уровень можно только внутри одного прогона — он двигается от состава меню.

Чем вердикт аттестован (и где он слаб)

Отрицательный вывод стоит ровно столько, сколько стоит способность теста увидеть эффект, если бы он был. Поэтому контраст прогнан через два синтетических мира одинаковой длины:

Разделение d = 2.56. Статистика миры различает, значит вердикт по ней выносим. Наблюдённые на BTC −0.096 и на ETH −0.228 лежат между ними, ближе к «статья верна».

Слабое место — мощность. Внедряя снос в мир с УБИТЫМ выравниванием (иначе «мощность» выходит фиктивной: если внедрять поверх реального ряда, где статистика уже сдвинута, тест «находит» эффект при нулевом сносе), получаем MDE ≈ 20 бп/день на днях расхождения A и B. Это много. Эффект силой 5 бп/день — а это порядка 18% годовых на 42% дней — мы бы просто не увидели. Поэтому корректная формулировка: разницы не обнаружено, а не доказано её отсутствие. Практический вес выводу добавляет не контраст сам по себе, а то, что ни одна из 1260 конфигураций не обыгрывает собственный нуль: даже если у обёртки есть свои 5 бп/день, забрать их предложенным способом не выходит.

Своя ошибка по дороге

Первая версия прогона брала позицию от z-скора спрэда, а не от его знака. Выглядит как безобидная нормировка, но z вычитает скользящее среднее — и правило EMA(12) > EMA(26) незаметно превращается в «спрэд выше своего среднего за год», то есть в другую систему. Расхождение с каноном — 15.6% дней на BTC, и оно двигало контраст на 0.1–0.3 SR. Поймал это независимый верификатор, а не сам прогон. Отдельно поучительно, что при исправленном определении знак контраста на BTC при нулевых издержках переворачивается от одного лишь сдвига прогрева на полгода (+0.076 против −0.088) — лучшей иллюстрации того, что мерим мы здесь шум, придумать трудно.

Что осталось

  1. «Пассажир» — неверная метафора при верном практическом выводе. Гистограмма и сигнальная линия несут собственный, почти независимый от спрэда сигнал (совпадение позиций 58%, корреляция +0.13). Этот сигнал не окупается — но он не дубликат.
  2. Разница между полным MACD и голым спрэдом на нашем стенде статистически не обнаружена ни на одном из трёх окон, ни на одном из двух активов, ни при каких издержках от 0 до 20 бп. С честной оговоркой о мощности: MDE ≈ 20 бп/день.
  3. Единственное правило с устойчиво отрицательным знаком — «разворот гистограммы» (Δ̄SR −0.31…−0.61, доля выигрышных пар 1–17%). Оно и по механике худшее: 180 оборотов в год против 20 у спрэда. Даже оно не проходит нуль контраста, но если из всей статьи выбрасывать что-то первым — то это.
  4. Гипотеза про режимный фильтр не подтвердилась. Фильтр по волатильности не воспроизводится между активами, даёт меньше параметрической подстройки и по знаку совпадает с вол-таймингом беты на постоянном лонге. То есть это не «спасение моментума в тихом режиме», а обычное управление экспозицией — и обсуждать его надо в этих терминах.
  5. Подстройка параметров MACD out-of-sample вредна. Фиксированный голый спрэд 12/26 обыгрывает argmax по MACD-семейству на 0.65 SR (BTC) и держит ничью на ETH.
  6. И сам голый спрэд честной поправки не проходит. pEmp 0.03, но pMax 0.77–0.86. Долгосрочно на дневках BTC/ETH трендследование живёт где-то на границе различимости, и весь спор «MACD или EMA-спред» идёт внутри шума, а не над ним.

В прод ничего не идёт. Практический смысл прогона — не в том, что MACD плох (это и так знали), а в том, что аргумент «это просто переупакованные скользящие средние» неверен фактически: переупаковка была бы безобидной, а здесь вы получаете вторую систему с втрое большим оборотом, которую никто не тестировал отдельно.

Где копаем дальше

Открытым остаётся кусок, который наш стенд закрыть не может. Мы мерили дневки, а MACD живёт в основном на внутридневных графиках — там, где оборот на порядок выше и где вопрос «есть ли сигнал» полностью подчинён вопросу «переживает ли он спред». Часовые данные у нас есть, и это следующий естественный заход: тот же парный контраст на 1h/4h с лестницей исполнения, чтобы увидеть, где именно умирает быстрая нога — в предсказании или в исполнении. Второе направление — «оба условия» (A_both): это единственное правило, у которого контраст держится около нуля, а не в минусе, и на BTC FULL оно даже слегка положительно (+0.063). Скорее всего, это просто следствие того, что оно чаще стоит вне рынка, но проверить фронтир «SR ~ экспозиция» отдельно стоит.

Если вы гоняли MACD на своих данных — особенно на внутридневных или на акциях, где нет фандинга и структура издержек другая, — интересно сверить: расходятся ли у вас позиции кросса и нулевой линии так же сильно, или 58% совпадения это криптовая специфика 24/7. Пишите, добавим в прогон.

Пока же — итог осторожный: тезис статьи мы подтвердили, её метафору поправили, а её собственный «следующий шаг» на нашем стенде не выжил.

Скрипты: research_macd_passenger.py (стенд, сетка 1260, ротационные нули, миры, walk-forward), verify_macd_passenger.py — независимая реимплементация pandas-идиомами против матричного numpy: определения MACD, механика позиций, парный контраст, лестница исполнения на лукахед, знак фандинга, конвенции ddof и сверка канонических Sharpe с JSON прогона. 13 проверок из 13, расхождение двух реализаций ≤ 0.016 SR.

Внутридневное продолжение: 1ч и 4ч

Дописано 2026-09-01 — закрываю хвост, объявленный абзацем выше. Часовая и 4-часовая база, BTC и ETH, 78 750 и 19 683 бара, та же сетка 1260 конфигураций на панель. Короткий ответ на вопрос «где умирает быстрая нога»: у разных ног по-разному, и оба ответа неприятные. Кросс сигнальной линии на часовках имеет положительный гросс — но безубыточная комиссия у него 1.75 бп при тейкере 4.5, то есть он умирает в исполнении. «Разворот гистограммы» умирает раньше, в предсказании: его гросс отрицателен, и никакая комиссия его не спасёт. Заодно всплыла вещь, которой на дневках не было, — на внутридневных панелях конфигурации начинают проходить поправку на множественность; разбору этого посвящена отдельная секция ниже, и он тоже кончается не находкой.

Стенд

Часовые OHLC Binance (спот-база), 2017-09-01 … 2026-09-01, незакрытый час отброшен. 4-часовые бары собираются из ОДНОЙ часовой базы по сетке UTC, неполные выбрасываются целиком (39 штук). В часовом ряду 28 дыр, максимальный разрыв 34–40 часов — это простои биржи, доходность через них считается одним баром; на выводы не влияет, но знать полезно. Фандинг перпа списывается на баре, содержащем момент платежа (8-часовая сетка), а не размазывается.

Сетка — ровно та же, что на дневках, и намеренно задана в БАРАХ: MACD так и применяют на любом графике, а сохранение чисел делает три горизонта сравнимыми. Определения сигналов импортируются из дневного скрипта, ни одной своей копии. Основные издержки — 4.5 бп на единицу оборота (тейкер Binance USDT-M perp), лестница 0/1/2/4.5/10.

Механика держится на всех трёх горизонтах

совпадение знака гистограммы со знаком спрэда, BTC 57.2% 57.9% 57.6%
то же, ETH 58.4% 58.4% 59.0%
корреляция позиций +0.14…+0.17 +0.15…+0.16 +0.13…+0.15
оборот кросса сигнальной, раз/год (BTC) 1 335 326 51
оборот голого спрэда, раз/год (BTC) 603 146 22

Соотношение «обёртка торгует в 2.2–2.4 раза чаще, а совпадает с базой чуть больше чем в половине баров» не зависит от таймфрейма вообще. Это укрепляет главный вывод дневного прогона: сигнальная линия — не переупаковка спрэда, а вторая система, и на любом графике она такая.

Контраст растёт с укорочением бара — но растёт и его нуль

панель Δ̄SR (кросс − голый) доля пар > 0 нуль контраста p
BTC · 1ч −0.846 0.04 −0.476 ± 0.268 0.18
BTC · 4ч −0.495 0.04 −0.153 ± 0.289 0.25
BTC · 1д −0.096 0.36 −0.070 ± 0.397 0.93
ETH · 1ч −0.691 0.04 −0.376 ± 0.276 0.24
ETH · 4ч −0.397 0.14 −0.096 ± 0.288 0.31
ETH · 1д −0.228 0.27 −0.046 ± 0.371 0.47

Дефицит обёртки растёт монотонно по мере укорочения бара — но ровно так же растёт и то, что объясняется одной механикой оборота. Формально вердикт не меняется ни на одном горизонте: p от 0.18 до 0.93.

Единственная строка во всём исследовании, которая значимо хуже своего нуля, — «разворот гистограммы» на часовках: −3.054 против −1.679 ± 0.341 у BTC и −2.769 против −1.345 ± 0.361 у ETH, p < 0.001 в обоих случаях, и доля выигрышных пар ровно 0.00 из 1134. Это не находка в смысле эджа, это находка в смысле вреда.

Предсказание или исполнение: безубыточная комиссия

Sharpe при одной выбранной комиссии на этот вопрос не отвечает. Отвечает c* — комиссия, при которой гросс-эдж обнуляется (средняя нетто линейна по издержкам, так что величина считается точно, а не подбором). Тейкер = 4.5 бп.

c*, бп на единицу оборота BTC·1ч BTC·4ч ETH·1ч ETH·4ч
голый спрэд +9.96 +35.99 +16.15 +51.13
кросс сигнальной +1.75 +4.96 +4.92 +9.31
оба условия (полный MACD) +3.90 +13.93 +8.15 +18.48
«разворот гистограммы» −2.65 +1.69 −2.45 +0.43
гросс-SR «разворота гистограммы» −0.96 +0.21 −0.79 +0.04

Читается это так:

Голый спрэд держит запас втрое–одиннадцатикратный над тейкером на всех панелях (88–100% его конфигураций выше 4.5 бп). Медленное трендследование на внутридневных барах криптовалют исполнимо — вопрос только в том, есть ли в нём сигнал (см. следующую секцию).

Кросс сигнальной линии на BTC·1ч умирает в исполнении: гросс у него положительный (SR +0.26 при нулевых издержках), но безубыток 1.75 бп — вы платите за оборот больше, чем он приносит. На 4ч запас появляется, но остаётся вчетверо-впятеро тоньше, чем у голого спрэда.

«Разворот гистограммы» на часовках умирает в предсказании: гросс-SR −0.96 (BTC) и −0.79 (ETH), c* отрицательна. Комиссия тут ни при чём — правило указывает не в ту сторону ещё до всяких издержек.

И механизм у последнего называется, а не угадывается. Знак приращения гистограммы совпадает со знаком последнего бара в 72.1% случаев (BTC·1ч) — то есть «гистограмма разворачивается» это переодетая ставка на однобаровый моментум. А наивное однобаровое правило «покупай после зелёного бара» даёт на часовках гросс-SR −1.43 (BTC) и −0.69 (ETH): на часовом масштабе в крипте однобарового моментума нет, там разворот. На 4ч тот же наивный гросс уже −0.78/−0.47, а у «разворота гистограммы» +0.21/+0.04 — эффект слабеет с удлинением бара ровно так, как положено микроструктурному.

Потолок оракула (подставляем точное будущее): E|ret| 44–57 бп на часовом баре и 88–116 на 4-часовом против ~4.8 бп круговых издержек идеального предиктора. То есть дизайн не кост-ограничен — денег в конструкции полно. Ограничение целиком в предсказании: у обёртки сигнала настолько мало, что его гросс не дотягивает до комиссии.

Неожиданное: на внутридневных панелях кто-то проходит family-wise

На дневках поправку на размер поиска не проходил никто: 0 из 1260 в шести срезах. На часовых и 4-часовых панелях выживших вдруг много — BTC·1ч 7, ETH·1ч 53, ETH·4ч 7 (BTC·4ч по-прежнему 0). Первое объяснение очевидно: 78 750 баров против 3 302, оценки Шарпа гораздо теснее, ожидаемый максимум под нулём падает с +0.77 до +0.26 — то есть у теста просто появилась мощность.

Второе объяснение подозрительнее, и его надо было проверить первым: круговой нуль тождественно бессилен против почти постоянной позиции. У стратегии, которая почти всегда в лонге на растущем активе, дисперсия нуля схлопывается, и «прошёл family-wise» может означать всего лишь «сидел в лонге». Три проверки:

  1. Это не почти-постоянный лонг. Средняя позиция выживших +0.02…+0.04 (по сетке +0.01…+0.02), экспозиция 0.44–0.56, стандартное отклонение нуля у них 0.309–0.325 против медианы по сетке 0.314–0.329 — не схлопнуто. Более того, постоянный лонг, прогнанный через ТОТ ЖЕ нуль, даёт SR +0.664 при нуле +0.664 ± 0.0011, то есть z = +0.0: пройти он не может по построению. Опасение снято зеркально тому, как ожидалось.
  2. Это не бета. Вычитаем из доходностей безусловный снос и повторяем всё: выживают все до одного (7/7, 53/53, 7/7), средний Sharpe меняется с +0.636 на +0.613, с +0.725 на +0.709, с +1.086 на +1.062.
  3. Но это не переносится вперёд. Честный сплит — отбор ТОЛЬКО по первой половине выборки, оценка ТОЛЬКО по второй:
BTC·1ч BTC·4ч ETH·1ч ETH·4ч
argmax по 1-й половине, её же Sharpe +1.219 +1.059 +1.417 +1.381
он же на 2-й половине −0.279 +0.695 +0.710 +1.008
топ-10 равновзвешенно, 2-я половина −0.337 +0.297 +0.144 +0.714
фиксированный голый спрэд 12/26 −0.335 −0.062 −0.191 −0.078
buy & hold +0.419 +0.419 +0.209 +0.206
пересечение топ-50 половин 1/50 5/50 4/50 11/50

Последняя строка и есть ответ. Ранговая корреляция Sharpe по ВСЕЙ сетке между половинами высокая (+0.49…+0.89) — то есть устойчиво воспроизводится, какие СЕМЕЙСТВА хороши, а какие плохи. А вот кто именно победитель, не воспроизводится совсем: из полусотни лучших конфигураций первой половины во вторую попадают от одной до одиннадцати. Это ровно тот случай, для которого есть готовая формулировка: общий эффект в меню есть, но назвать конкретную конфигурацию данные не позволяют.

И «общий эффект» — не про обёртку MACD. Состав топ-50 по первой половине: «оба условия» 24–46 позиций из 50, голый спрэд 3–23, кросс сигнальной 1–5, «разворот гистограммы» ноль; медленная EMA 100 доминирует. Иначе говоря, внутридневные панели с их 79 тысячами баров действительно нашли статистически различимое медленное трендследование — и в этой находке сигнальная линия участвует по остаточному принципу.

Мёртвая зона — единственная ручка, пережившая свой нуль

Побочный результат, который стоит записать. Мёртвая зона θ = 1.0 (не торговать, пока спрэд не отошёл от нуля на одно стандартное отклонение) поднимает голый спрэд 12/26 с +0.179 до +0.306 на BTC·1ч и с +0.291 до +0.783 на ETH·4ч, оставаясь в рынке лишь 31% времени. Нуль фильтра — циклический сдвиг ТОЛЬКО профиля простоя, скважность сохраняется точно — даёт pEmp 0.010 / 0.058 / 0.004 / 0.008 по четырём панелям, случайный профиль той же скважности проигрывает разгромно. И это не вол-тайминг: доля времени вне рынка ровная по квинтилям реализованной волатильности (0.65–0.72), то есть механизм не сводится к «уходим в высокой воле», который у нас уже умер на дневках.

Оговорки обязательны: это одна пара параметров, четыре панели, без поправки на то, что θ мы тоже выбирали из трёх значений. Но по сравнению со всем остальным в этом прогоне выглядит это заметно живее — и относится к голому спрэду, а не к MACD.

⚠️ Первая версия этого контроля была тавтологией, и её стоит показать. Я наложил «профиль простоя θ=1» на позицию θ=0 и получил Sharpe, совпадающий с настоящей θ=1 до третьего знака на всех четырёх панелях. Выглядело как блестящее подтверждение, а на деле мёртвая зона симметрична: там, где θ=1 не ноль, её знак РАВЕН знаку спрэда, поэтому «наложение» побитово воспроизводит саму стратегию. Совпадение до третьего знака на четырёх независимых панелях сразу — это не подтверждение, а сигнал, что контроль ничего не контролирует.

Что это меняет

В главном — ничего.

  1. «Пассажир» неверен одинаково на 1ч, 4ч и 1д: 57–59% совпадения позиций, оборот вдвое-втрое выше. Это устойчивое свойство конструкции, а не артефакт дневного масштаба.
  2. Разница между полным MACD и голым спрэдом не обнаружена ни на одном горизонте. Точечные оценки на внутридневных горизонтах уходят глубже в минус, но ровно настолько же уходит и нуль.
  3. Ответ на вопрос хвоста получен и он двойной. Кросс сигнальной линии на часовках умирает в исполнении (c* 1.75 бп против тейкера 4.5), «разворот гистограммы» — в предсказании (гросс-SR −0.96, механизм: переодетый однобаровый моментум, которого на часовках нет).
  4. Дизайн не кост-ограничен. Потолок оракула в 10–25 раз выше издержек: проблема не в комиссии, а в том, что предсказывать этими правилами нечего.
  5. Статистически различимое медленное трендследование на внутридневных данных существует — но назвать конфигурацию нельзя (пересечение топ-50 половин 1–11 из 50), а обёртка MACD в топе почти не представлена.
  6. Мёртвая зона на спрэде — единственный кандидат, переживший свой нуль, и он про спрэд, а не про MACD.

В прод по-прежнему ничего не идёт.

Где копаем дальше

Остаётся один честный кусок, который ни дневки, ни этот прогон не закрывают: мёртвая зона выглядит живой на четырёх панелях, но проверена как одна пара параметров без поправки на выбор самой θ. Правильный следующий заход — объявить сетку порогов заранее, прогнать её на большем числе активов и посмотреть фронтир «Sharpe ~ доля времени в рынке» против наивных способов торговать реже. Это уже не про MACD, а про то, окупается ли вообще фильтр слабого тренда — и вот на этот вопрос ответ был бы полезен.

Отдельно интересно чужое: у нас часовая база спотовая, а издержки перповые и без проскальзывания, что для 1 335 оборотов в год оптимистично. Если вы гоняли MACD на реальных фиксах внутри дня — на крипте или на акциях, где структура издержек другая, — напишите, какая у вас выходит безубыточная комиссия у кросса сигнальной линии. Это единственное число, которое здесь по-настоящему решает.

Скрипты: research_macd_intraday.py (панели, безубыточная комиссия, лестница исполнения, БПФ-нуль по всем сдвигам, потолок оракула), research_macd_intraday2.py (разбор выживших: профиль, снос долой, контроль постоянным лонгом, механизм histmom), research_macd_intraday3.py (честный сплит, walk-forward, состав топ-50), research_macd_intraday4.py (починенный нуль фильтра для мёртвой зоны), verify_macd_intraday.py — независимая реимплементация: БПФ-нуль против прямого перебора сдвигов (сошлись до 5·10⁻¹⁶), безубыточная комиссия формулой против численного корня, агрегация 4ч groupby против resample, сеточный контраст заново на pandas (сошёлся до 0.001 SR на всех четырёх панелях). 26 проверок из 26.

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