Розробка алгоритму 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 файл без зміни коду.







