baykovpro

← Quant

RSI 70/30: миф об «перекупленности» под микроскопом

28 августа 2026 · 14 мин · mean-reversion, momentum, бэктест, режимные фильтры

Суть идеи

Статья — классический «опровержительный» бэктест: берётся самое популярное правило технического анализа (RSI > 70 → продавай, RSI < 30 → покупай) и проверяется, есть ли у него реальный форвардный edge. Авторы тестируют шесть таймфреймов и четыре актива, затем прогоняют торгуемую версию через шесть рыночных режимов.

Результат предсказуемо скучный: средняя форвардная доходность после сигнала ≈ 0.00% там, где выборка достаточно велика. На 4-часовом таймфрейме сигнал вообще инвертирован — то есть «перекупленность» по RSI(14) на 4h исторически предшествовала продолжению роста, а не развороту. Это классический momentum-эффект, хорошо известный по акциям и ещё более выраженный в крипте.

Механизм, который должен был работать: mean-reversion — цена «устала» расти и вернётся к среднему. Механизм, который реально работает на коротких таймфреймах трендовых активов: momentum — сильный импульс продолжается, пока не изменится режим. RSI 70/30 не различает эти два режима, поэтому усредняется в ноль.

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

Для BTC/ETH вывод ещё более жёсткий, чем для акций. Крипта — высоковолатильный, режимно-нестабильный актив с выраженными трендовыми периодами (бычий цикл) и резкими медвежьими разворотами. RSI 70 на дневном BTC в 2020–2021 годах срабатывал десятки раз в условиях устойчивого тренда — каждый раз «продавать» означало пропустить продолжение.

На наших рядах это напрямую тестируется: спот OHLCV BTC/ETH есть на 1h/4h/1d. Интереснее не сам RSI, а вопрос режимного фильтра: работает ли mean-reversion по RSI лучше в периоды высокой realized vol (когда рынок «дышит») vs низкой IV (тихий drift вверх)? Это уже осмысленный вопрос для нашего движка.

Для опционного трейдера отдельный угол: если RSI-сигнал не работает как направленный вход, можно ли использовать «кластер RSI > 70» как прокси для elevated realized vol и, соответственно, для оценки VRP? Это косвенная, но более честная применимость.

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

Да, высокая воспроизводимость. RSI считается из OHLCV, данные есть. Rolling-z на форвардную доходность после сигнала — стандартная процедура в нашем движке. Walk-forward по годам (2019, 2020, 2021, 2022, 2023, 2024) покажет режимную хрупкость. Единственное, чего нет напрямую — «шесть режимов» авторов: их определение режимов непрозрачно из аннотации, придётся задать свои (например, по 200-дневной MA или по квартилям realized vol).

Сомнения

Статья сама по себе — опровержение, а не подтверждение, поэтому классический data-snooping здесь работает в обратную сторону: авторы ищут отсутствие edge, что проще «найти», чем доказать наличие. Шесть таймфреймов × четыре актива × шесть режимов = 144 ячейки — при таком числе срезов любой вывод («нет edge нигде») тоже требует поправки на множественное тестирование. Возможно, в каком-то конкретном режиме/таймфрейме edge есть, но он утонул в агрегации. Кроме того, аннотация не раскрывает, как именно определялись режимы — это ключевой параметр, и его выбор мог быть подогнан постфактум.

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

Прогнать на дневном BTC (2019–2024) walk-forward тест: сигнал = RSI(14) пересекает 70 снизу вверх, форвардная доходность +5/+10/+20 дней. Разбить по режиму: realized vol(30d) выше/ниже медианы. Гипотеза: в low-vol режиме RSI 70 → momentum (держать лонг), в high-vol режиме → mean-reversion (шорт). Если разница статистически значима после Deflated Sharpe — это уже не RSI, а режимный фильтр с RSI как триггером.

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

Дописано 2026-08-28 — прогнали идею на шести таймфреймах и шести активах, 2017–2026. Главное утверждение статьи не устояло: «перекупленность» — не ноль, а систематическое ПРОДОЛЖЕНИЕ, и не на 4-часовом графике, а на всех шести таймфреймах сразу. Торговать в этом, однако, нечего: канонический RSI(14)/70 ровно повторяет корзину обычных моментум-окон. Режимный хвост из «Следующего шага» — мёртв.

Оговорка о провенансе. Оригинал статьи по ссылке уже недоступен (редирект Quantocracy отдаёт пустую страницу), поэтому это прогон ИДЕИ по её аннотации, а не репликация авторских чисел: их набор активов, окно и — главное — определение шести режимов нам неизвестны. Всё, что ниже, — наш стенд и наши определения.

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

Binance spot, часовые OHLC (фолбэк на fapi), шесть активов — BTC, ETH, BNB, SOL, XRP, DOGE — от листинга (BTC/ETH с 2017-08-17) по 2026-08-28, 79 032 часовых бара на самом длинном ряде. Шесть таймфреймов {1h, 2h, 4h, 8h, 12h, 1d} собираются из ОДНОЙ часовой базы с выравниванием по UTC; неполный tf-бар (дыра биржи) выбрасывается целиком, иначе 12-часовой бар из трёх часов даёт фиктивную доходность. RSI Уайлдера, событие — пересечение порога, решение по закрытию бара, форвард 1/5/10/20 баров своего таймфрейма. Первичная ячейка зафиксирована ДО прогона прямо по «Следующему шагу» этой карточки: BTC, дневки, RSI(14) пересекает 70 снизу вверх, горизонт 10 дней.

Мерим не «среднюю доходность после сигнала», а её премию над базой: d = E[доходность | сигнал] − E[доходность]. Разница принципиальная. У BTC на дневках сырое среднее после сигнала +3.44%, но безусловное среднее за любые 10 дней +0.89% — и приписать индикатору всю первую цифру значит записать ему в заслугу снос актива. Именно поэтому формулировка «≈0.00% форвардной доходности» из аннотации сама по себе неинформативна: ноль относительно чего?

Нуль — круговой сдвиг ТОЛЬКО индикатора события против доходностей: скважность и кластеризация событий остаются настоящими, гибнет ровно выравнивание. 1000 общих календарных сдвигов, всё распределение считается через БПФ, поправка на множественность — распределение max|z| при общем сдвиге (Westfall–Young), а не Бонферрони.

Первичная ячейка не решает ничего — и это первый результат

значение
событий (пересечений 70 вверх за 9 лет) 71
E[доходность за 10 дней | сигнал] +3.44%
безусловное среднее за 10 дней +0.89%
d — премия над базой +2.55%
z против нуля сдвига +1.46 (pEmp 0.124)
MDE конструкции (мощность 0.8) ≈3.5%

Честная мощность считалась в мире БЕЗ эффекта (доходности циклически сдвинуты, события целы, снос внедряется поверх): δ=2% ловится в 31% случаев, δ=3% — в 68%, δ=5% — в 98%. Наблюдённые +2.55% лежат ниже порога различимости. То есть на ячейке, которую мы сами же и предрегистрировали, единственно возможный вердикт — «эффект, если он есть, меньше того, что выборка способна показать». Ноль здесь свойство выборки, а не рынка; 71 событие за девять лет — это просто мало.

⚠️ Первый заход этого контроля был сломан: снос внедрялся поверх РЕАЛЬНОГО ряда, у которого t уже был +2.38, и «мощность» вышла 1.00 даже при δ=0. Мощность обязана считаться в мире, где эффекта нет.

Знак один во всех 36 ячейках

Мощность живёт не в одной ячейке, а в их согласии. При горизонте 10 баров премия d положительна в 36 ячейках из 36 (6 активов × 6 таймфреймов), и растёт с таймфреймом ровно как положено масштабу горизонта:

таймфрейм d, медиана по 6 активам знак + событий пульный z p
1h +19 бп 6/6 6 220 +2.55 0.000
2h +54 бп 6/6 3 347 +3.13 0.000
4h +100 бп 6/6 1 760 +2.84 0.000
8h +266 бп 6/6 941 +3.08 0.000
12h +368 бп 6/6 609 +3.00 0.000
1d +563 бп 6/6 331 +1.68 0.006

Пульный тест по всем 36 ячейкам: z = +2.71 при σ нуля 0.24, p < 0.001. Он не был в предрегистрации и помечен как разведочный — но 288 ячеек это не 288 гипотез, а одна, и её честная проверка именно такая. Поячеечный max-T, наоборот, не пропускает ничего: минимальный pMax по базовой сетке 0.052, выживших ноль. Оба утверждения верны одновременно и означают разное: общий эффект есть, но назвать конкретную ячейку эти данные не позволяют.

Эффект не сидит в закрытии сигнальной свечи: вход баром позже сохраняет 89–94% премии на 2h–8h, 82% на 12h и 63% на дневках (на часовиках даже растёт).

Год за годом — включая два медвежьих

Круговой сдвиг честно меряет выравнивание, но за девять лет крипты укладывается примерно два цикла, и эффективных независимых сдвигов там единицы. Поэтому решающая проверка — календарная:

год 2018 2019 2020 2021 2022 2023 2024 2025 2026
d, нормирован на σ года +0.18 +0.16 +0.12 +0.26 +0.02 +0.10 +0.16 +0.13 +0.12
доля ячеек с d>0 79% 89% 81% 90% 53% 65% 78% 86% 65%

Девять лет из девяти в плюс, включая медвежьи 2018 и 2022 (в 2022 эффект почти исчезает — 53% ячеек, — но знак не переворачивается). Split-half по половинам выборки: знак совпал в 88% ячеек, корреляция половин +0.77.

Сторона перепроданности пуста

Зеркальный сигнал (RSI пересекает 30 вниз) не даёт ничего ни в одном виде: пульный z от −0.21 до −0.38 при p 0.16–0.31, знак совпадает лишь в 53% ячеек между половинами выборки (корреляция +0.21), в плюс только 3 года из 9. Это важно для интерпретации: если бы работал «возврат к среднему», обе стороны обязаны были бы говорить одно и то же. Работает одна.

Правило статьи, торгуемое как написано, действительно теряет деньги

Шорт после пересечения 70, лонг после пересечения 30, удержание h баров, издержки 6 бп на сторону: медиана Sharpe по 144 ячейкам −0.74, в плюсе 1.4% ячеек, лучшая +0.25. Здесь статья права полностью — и вывод у неё правильный, несмотря на то, что механизм описан неверно.

Но и наоборот торговать нечего

Правильная торгуемая форма находки — лонг-оверлей: лонг h баров после пересечения 70 вверх, иначе флэт. При экспозиции всего 10% времени медиана Sharpe +0.72 (6 бп), в плюсе 88% ячеек, издержки съедают мало (при 20 бп ещё +0.55). Соперники при равной скважности:

конструкция (Sharpe@6бп, медиана)
лонг-оверлей по RSI(14)/70 +0.72
случайный триггер той же частоты −0.01
трендовый гейт SMA50 той же частоты −0.08
buy & hold (экспозиция 100%) +0.42
триггер по 14-барной доходности +0.45

Случайный триггер той же частоты RSI проигрывает в 97% ячеек (на горизонтах 5–20 баров — в 100%), buy & hold — в 71% при вдесятеро меньшей экспозиции. Выглядит как находка. И тут вступает главный тест.

Корзина наивных окон. Сравнивать фичу с её отсутствием нельзя: у наивной альтернативы свои ручки. Даём сопернику восемь окон — пересечение ret_n вверх через порог, подобранный под ТУ ЖЕ скважность, n ∈ {3, 5, 7, 10, 14, 20, 30, 50}, — и берём его максимум, то есть заводим смещение сознательно против собственной находки:

Sharpe@6бп, медиана
RSI(14)/70 — канон, без подбора +0.825
максимум по 8 наивным окнам +0.812
медиана по 8 наивным окнам +0.495
наивное окно 14 (пара к RSI) +0.509

RSI бьёт максимум корзины ровно в 53% ячеек (57 из 108), парная разница +0.015 Sharpe — то есть ничью. Медиану корзины он бьёт в 89% ячеек. Читается это так: никакой собственной информации сверх обычного моментума RSI не несёт — но канонический, ничем не подобранный конфиг (14, 70) попадает примерно в оптимум наивного семейства. Это комплимент настройке по умолчанию, а не индикатору.

Аргмакс по корзине размазан по всем окнам (10/14/20/30 выигрывают почти поровну), а надбавка «лучшего из восьми» на чистом шуме составляет +0.45 Sharpe против +0.29 у наивной корзины — то есть окна корзины согласованы между собой и её максимум не раздут отбором. Сравнение честное.

Режимный хвост «Следующего шага» — мёртв

Гипотеза карточки была: в высокой воле RSI 70 разворачивает, в тихой продолжает. Мерим DiD против пассива — (события при воле выше медианы − события при воле ниже) минус то же для самого актива, чтобы не выдать за свойство сигнала свойство рынка:

Предрегистрированное правило не выполнено ни по одному из четырёх пунктов. Расщепления по воле нет.

Перепрогон только на BTC и ETH

Половина стенда — альты, и первым же вопросом к находке будет «а не держится ли она на DOGE 2021 года»: в расширенном поиске из 16 выживших 15 были DOGE и XRP. Прогнали всё заново на двух активах, которые эта карточка и называет в разделе применимости, — BTC и ETH, те же шесть таймфреймов, те же нули.

6 активов только BTC+ETH
пульный z стороны 70-вверх (h=10) +2.71 +2.48 (p<0.001)
знак d по ячейкам, h=10 36/36 12/12
лет с положительным d 9 из 9 9 из 9
split-half: совпадение знака / корреляция 88% / +0.77 92% / +0.64
лонг-оверлей, Sharpe@6бп +0.72 +0.72 (buy&hold +0.36)
ячеек оверлея, прошедших family-wise 0 из 144 6 из 48
RSI против МАКСИМУМА корзины наивных окон +0.825 / +0.812, победа в 53% +0.834 / +0.820, победа в 53%

Вывод не меняется ни в одном пункте: эффект не альтовый и не эпизодный. Побочно он даже чище — доля премии, держащейся на одном эпизоде, падает с 32% до 11%, а «только RSI» в двойной сортировке остаётся положительным в 48 ячейках из 48 (было 131 из 144). За счёт вчетверо меньшей сетки поправка на множественность перестаёт съедать всё, и шесть ячеек оверлея проходят family-wise (min pMax 0.020, таймфреймы 2h/8h/12h) — но экономический вердикт держится: против лучшего окна простого моментума это по-прежнему ничья.

Заметная деталь — затухание: нормированная премия падает с +0.18 (2018) и +0.21 (2019) до +0.074 (2025) и +0.035 (2026, половина ячеек в минусе).

И одна поправка по ходу. На двух активах расширенный поиск вытолкнул наверх ячейки стороны перепроданности на горизонте в один бар — BTC 1h, порог 25, 559 событий, d +18 бп, устойчиво во всех 10 годах. Это не сигнал, а bid-ask bounce: пересечение 30 вниз происходит на крупном падающем баре, чей close стоит по биду. Лестница исполнения ставит точку —

ячейка вход по close(t) close(t+1) close(t+2)
BTC 1h, порог 25 +18.3 бп +6.0 −11.1
BTC 2h, порог 25 +24.4 бп −0.2 −8.6
BTC 4h, порог 25 +32.8 бп −25.5 +7.6
ETH 1h, порог 25 +10.6 бп −5.5 −11.7

— один бар задержки съедает две трети, два переворачивают знак. У стороны перекупленности на тех же ячейках картина обратная: BTC 4h с RSI(21) даёт +22.3 → +21.7 → +14.5 бп. Это и есть разделительная линия: продолжение после перекупленности переживает задержку, отскок после перепроданности — нет.

Что осталось

  1. Аннотация «edge нет» неверна для стороны перекупленности и верна для стороны перепроданности. Правильная формулировка: после пересечения 70 вверх цена продолжает расти относительно базы — устойчиво, на всех шести таймфреймах, во всех девяти годах.
  2. «Инверсия на 4h» — правда про знак и неправда про исключительность. 4h ничем не отличается от 1h, 2h, 8h и 12h; отдельно взятая 4h-ячейка family-wise не проходит.
  3. Практический вывод статьи при этом верен: продавать по RSI 70 убыточно. Просто причина не «сигнал усредняется в ноль», а «сигнал систематически указывает в противоположную сторону».
  4. Своего эджа у индикатора нет. RSI(14) — монотонная переупаковка 14-барной доходности (ρ рангов 0.81–0.86), и при равной скважности он играет вничью с лучшим окном простого моментума.
  5. Никакая одиночная ячейка не проходит family-wise ни в базовой сетке (min pMax 0.052), ни в расширенном поиске 3238 конфигураций (16 выживших — все сторона перекупленности, 15 из них DOGE и XRP, почти все при порогах 75/80, то есть жирный хвост того же самого эффекта; медианно 32% их премии держится на одном эпизоде, хотя удаление этого эпизода не переворачивает знак ни в одной).

В прод ничего не идёт: торговать нечего, а знать полезно — «перекупленность» на нашем стенде это состояние продолжения, а не разворота.

Скрипты: research_rsi_regime.py (стенд, событийный тест, нули, контроли), research_rsi_regime2.py (пульный тест, лестница исполнения, джекнайф, по годам, split-half, честная мощность), research_rsi_regime3.py (экономика оверлея), research_rsi_regime4.py (фронтир наивных окон), verify_rsi_regime.py — независимая реимплементация: RSI свёрткой против рекурсии, агрегация resample против groupby, нуль сдвига перебором против БПФ, лаговый профиль и future-shock на лукахед, детерминизм, плацебо базы. 15 проверок из 15.

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