Разработка алгоритма mean reversion
Mean reversion — торговая концепция: цена актива после отклонения от своего исторического среднего склонна возвращаться обратно. Это противоположность momentum-торговле. Алгоритм открывает позицию против краткосрочного движения, рассчитывая на возврат к среднему.
Когда работает mean reversion
Стратегия эффективна в конкретных рыночных условиях:
- Флэт/боковик — цена колеблется вокруг определённого уровня
- High-frequency движения — краткосрочные отклонения, после которых market makers возвращают цену
- Overextended moves — движение значительно превысило ATR, вероятен откат
- Фундаментально устойчивые активы — активы с сильным спросом на конкретных уровнях
Стратегия плохо работает в тренде: открыв шорт на отклонении вверх, можно «поймать» продолжение тренда.
Индикаторы для mean reversion
Bollinger Bands: классический инструмент. Цена касается нижней полосы (−2σ) → покупка. Касается верхней (+2σ) → продажа. Выход при возврате к средней (SMA 20).
RSI (Relative Strength Index): RSI < 30 → oversold → потенциальная покупка. RSI > 70 → overbought → потенциальная продажа.
Z-score от rolling mean:
def zscore_signal(prices, window=20):
rolling_mean = prices.rolling(window).mean()
rolling_std = prices.rolling(window).std()
z = (prices - rolling_mean) / rolling_std
return z
Сигнал покупки при Z < -2, продажи при Z > +2, закрытие при |Z| < 0.5.
Mean Reversion Index (MRI): собственный индикатор на основе расстояния от EMA и исторического ATR:
MRI = (Price - EMA(n)) / ATR(n)
Фильтр тренда
Без фильтра тренда mean reversion алгоритм разрушителен на трендовых рынках. Добавляем фильтры:
- ADX < 25: торгуем только когда тренд слабый (ADX — индикатор силы тренда)
- Price in range: цена между EMA(50) и EMA(200) — флэтовая зона
- Choppiness Index > 61.8: рынок в состоянии хаоса, а не тренда
Entry и exit логика
Entry: открытие позиции при достижении порогового Z-score + подтверждение разворотной свечи (pin bar, hammer, engulfing).
Exit:
- Profit target: возврат к rolling mean (Z-score = 0)
- Stop-loss: дальнейшее расширение отклонения до Z = ±3.5 (или фиксированный % от ATR)
- Time-based exit: если через N свечей позиция не закрылась в прибыль — закрываем
Частичный take profit: закрываем 50% позиции при Z = ±1.0, остаток при Z = 0.
Оптимизация параметров
Параметры (window для mean/std, entry Z-score, exit Z-score) оптимизируются через walk-forward анализ на исторических данных. Важно избегать overfitting: тестируем на нескольких независимых периодах.
Стек: Python (pandas, numpy, ta-lib), CCXT для биржевого подключения, PostgreSQL для хранения сигналов и сделок. Параметры конфигурируются через YAML файл без изменения кода.







