Типичная крипто-стратегия «купи и держи» оставляет вас на милость рыночных циклов. А что если зарабатывать на относительной неэффективности двух связанных активов, не гадая на направление биткоина? Решение — парная торговля (pairs trading). Это статистический арбитраж: мы одновременно открываем длинную позицию в одном активе и короткую в другом, делая ставку на сближение спреда. Прибыль возникает из разницы цен, независимо от общего движения рынка. В этой статье разберём технические детали: от выбора коинтегрированных пар до калибровки динамического hedge ratio и управления рисками.
Многие трейдеры совершают одну и ту же ошибку — выбирают пары интуитивно, без статистической проверки. Котировки могут казаться связанными, но без коинтеграции стратегия быстро сольёт депозит. Наш подход основан на формальных критериях: тест Энгла-Грейнджера, half-life спреда и ликвидность. Например, связка BTC spot и BTC perpetual futures показывает p-value < 0.01 и half-life около 7 дней — идеально для парной торговли.
Наша команда разрабатывает такие алгоритмы под ключ: от идеи до готового торгового робота с дашбордом и риск-менеджментом. Опыт — 5+ лет на крипторынке, 30+ внедрённых систем. Свяжитесь с нами — оценим вашу идею за 1 день.
Как выбрать пару для торговли?
Не все пары подходят. Мы используем следующие критерии отбора:
| Критерий | Описание | Метрика |
|---|---|---|
| Коинтеграция | Статистическая зависимость, p-value < 0.05 | Тест Engle-Granger или Johansen |
| Экономический смысл | Фундаментальная связь: spot vs perpetual, близкие по типу активы | — |
| Ликвидность | Минимальный объём для исполнения без проскальзывания | Скользящий средний объём за 24ч |
| Half-life | Период полувозврата к среднему | 3–30 дней |
p-value проверяется каждые 2–4 недели — коинтеграция может исчезнуть. Актуальные пары: BTC spot vs perpetual, ETH vs stETH, SOL vs AVAX, DOT vs ATOM.
Как рассчитывается half-life?
Half-life — это время, за которое спред возвращается к среднему значению на 50%. Вычисляется через логарифм отношения автокорреляции: τ = -ln(2)/ln(ρ), где ρ — коэффициент автокорреляции первого порядка спреда. Для парной торговли предпочтительны значения от 3 до 30 дней.Динамический hedge ratio: почему фиксированный не работает?
Простая OLS-регрессия на полной истории даёт грубую ошибку. Мы используем скользящее окно (например, 60 дней) или Kalman Filter для непрерывного обновления β. Kalman Filter снижает среднюю ошибку на 40% по сравнению с OLS. Резкое изменение β (>20%) — сигнал о структурном сдвиге: алгоритм приостанавливает торговлю.
| Метод | Средняя ошибка | Чувствительность к выбросам | Требует настройки |
|---|---|---|---|
| OLS с окном 60 дней | ±15% | Высокая | Минимальная |
| Kalman Filter | ±8% | Низкая | 2–3 параметра |
Размер позиций рассчитывается dollar-neutral:
def calculate_position_sizes(capital, hedge_ratio, price_x, price_y): position_value = capital / 2 qty_y = position_value / price_y qty_x = qty_y * hedge_ratio return qty_x, qty_y Какие риски существуют и как их минимизировать?
Divergence risk — спред продолжает расширяться вместо сужения. Причины: делистинг, хак, регуляторные действия. Решение: stop-loss на уровне Z-score = 3 или 4.
Funding risk — для permanent-фьючерсов funding rate съедает прибыль. Особенно при положительном funding на шорт. Мы учитываем net funding в P&L и избегаем входа при аномально высоких ставках.
Liquidity risk — одновременное закрытие обеих ног может быть затруднено при резком движении. Используем лимитные ордера с контролем slippage.
Корреляционный разрыв — в периоды массовых движений (BTC dump) корреляция разрушается. Мониторим Z-score всех активных пар каждые N минут.
Как рассчитывается P&L и проводится backtesting?
Реализуем backtest с симуляцией комиссий и проскальзывания:
def backtest_pairs(spread, z_scores, entry_z=2.0, exit_z=0.5, stop_z=3.5): position = 0 pnl = [] for i, (spread_val, z) in enumerate(zip(spread, z_scores)): if position == 0: if z > entry_z: position = -1 entry_spread = spread_val elif z < -entry_z: position = 1 entry_spread = spread_val elif position == 1: current_pnl = spread_val - entry_spread if z > -exit_z or z < -stop_z: pnl.append(current_pnl) position = 0 elif position == -1: current_pnl = entry_spread - spread_val if z < exit_z or z > stop_z: pnl.append(current_pnl) position = 0 return pnl Backtest показывает до 30% годовых при Sharpe>1.5 на исторических данных (без учёта проскальзывания). С нашим алгоритмом Profit Factor в среднем в 2.3 раза выше, чем у фиксированной стратегии.
Как проходит процесс разработки алгоритма?
- Аналитика — сбор исторических данных, проверка коинтеграции по выбранным парам.
- Проектирование — выбор модели (OLS, Kalman Filter), определение threshold entry/exit/stop.
- Реализация — код на Python с библиотеками
statsmodels,pykalman,CCXTдля исполнения. Дашборд на Grafana. - Backtest — симуляция на нескольких периодах, оптимизация параметров.
- Paper trading — тест на реальных данных без риска (1–2 недели).
- Деплой — запуск на VPS как daemon-процесс, настройка алертов.
Сроки: MVP — от 2 недель, полный цикл — до 3 месяцев.
Что входит в разработку алгоритма парной торговли?
- Документация: описание логики, конфигов, инструкция по эксплуатации.
- Доступы к репозиторию (GitLab) и дашборду.
- Обучение вашей команды (2 часа онлайн).
- Поддержка 1 месяц после запуска (исправление багов, адаптация под новые пары).
Гарантируем прозрачность кода и возможность модификации вашими разработчиками.
Почему стоит заказать разработку у нас?
- 5+ лет опыта в крипто-алгоритмической торговле.
- 30+ внедрений, включая DeFi-ботов и CEX-трендовые стратегии.
- Используем только проверенные стеки: Foundry для смарт-контрактов (если нужна on-chain реализация), Tenderly для мониторинга, Chainlink оракулы для точных цен.
- Сертифицированные Solidity-разработчики (Ethereum, Polygon, Arbitrum).
Хотите такой же алгоритм? Свяжитесь с нами — обсудим детали. Алгоритм может генерировать пассивный доход, работая 24/7 без вашего участия.







