RSI 70/30: миф об «перекупленности» под микроскопом
Суть идеи
Статья — классический «опровержительный» бэктест: берётся самое популярное правило технического анализа (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/1d/OB/h=10: DiD −0.75%, z −0.24, pEmp 0.83 (событий 23 против 42);
- знак гипотезы держится на 4 активах из 6 при требовании 5 из 6;
- по всей режимной сетке из 277 ячеек family-wise проходит ровно 1.
Предрегистрированное правило не выполнено ни по одному из четырёх пунктов. Расщепления по воле нет.
Перепрогон только на 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 бп. Это и есть разделительная линия: продолжение после перекупленности переживает задержку, отскок после перепроданности — нет.
Что осталось
- Аннотация «edge нет» неверна для стороны перекупленности и верна для стороны перепроданности. Правильная формулировка: после пересечения 70 вверх цена продолжает расти относительно базы — устойчиво, на всех шести таймфреймах, во всех девяти годах.
- «Инверсия на 4h» — правда про знак и неправда про исключительность. 4h ничем не отличается от 1h, 2h, 8h и 12h; отдельно взятая 4h-ячейка family-wise не проходит.
- Практический вывод статьи при этом верен: продавать по RSI 70 убыточно. Просто причина не «сигнал усредняется в ноль», а «сигнал систематически указывает в противоположную сторону».
- Своего эджа у индикатора нет. RSI(14) — монотонная переупаковка 14-барной доходности (ρ рангов 0.81–0.86), и при равной скважности он играет вничью с лучшим окном простого моментума.
- Никакая одиночная ячейка не проходит 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.