Статистический арбитраж в криптовалюте — Парный трейдинг и возврат к среднему

Статистический арбитраж использует временные отклонения от равновесных цен. Когда два актива, которые обычно движутся вместе, расходятся, трейдер покупает отстающий актив и продает опережающий, делая ставку на сближение. В криптовалютах это особенно эффективно, так как активы коррелируют, но не идеально, создавая прибыльные возможности.

Пример: Корреляция BTC и ETH составляет 0.85. Когда ETH отстает от BTC на 3% за 1 час (необычно), трейдер продает BTC и покупает ETH. Исторически они сближаются за 4-8 часов, фиксируя прибыль ~1-1.5%.

Основы парного трейдинга

Выбор пар

Не все пары подходят. Нужно:

Python — Выбор пар
import pandas as pd
from scipy.stats import pearsonr
def find_cointegrated_pairs(symbols, data):
candidates = []
for i, sym1 in enumerate(symbols):
for sym2 in symbols[i+1:]:
# Рассчитать корреляцию
corr, p_value = pearsonr(data[sym1], data[sym2])
if corr > 0.75:
# Проверить коинтеграцию (тест Энгла-Грейнджера)
residuals = data[sym1] - (data[sym2] * corr)
adf_stat = adf_test(residuals) # стационарность
if adf_stat < 0.05: # стационарный
candidates.append((sym1, sym2, corr))
return candidates

Анализ коинтеграции

Что такое коинтеграция?

Два нестационарных ряда коинтегрированы, если их линейная комбинация стационарна. Проще говоря: они движутся вместе со временем, а отклонения от этой связи в итоге возвращаются.

Для BTC и ETH:

Поиск хедж-коэффициента

Используйте регрессию методом наименьших квадратов для оптимального соотношения:

Python — Расчет хедж-коэффициента
from sklearn.linear_model import LinearRegression
def get_hedge_ratio(price1, price2):
# Регрессия price1 на price2 для нахождения beta (хедж-коэффициент)
X = price2.reshape(-1, 1)
y = price1
model = LinearRegression().fit(X, y)
hedge_ratio = model.coef_[0]
intercept = model.intercept_
return hedge_ratio, intercept
# Spread = price1 - (hedge_ratio × price2) + intercept
beta, alpha = get_hedge_ratio(btc_prices, eth_prices)
spread = btc - (beta * eth)

Стратегии возврата к среднему

Использование Z-оценок

Стандартизируйте спред для выявления экстремумов. При z-score > 2 спред необычно широк (торговая возможность):

Python — Трейдинг на возврат к среднему
def mean_reversion_signal(spread, lookback=20):
# Рассчитать скользящее среднее и стандартное отклонение
mean = spread.rolling(window=lookback).mean()
std = spread.rolling(window=lookback).std()
# Z-оценка: сколько стандартных отклонений от среднего
z_score = (spread - mean) / std
# Торговые сигналы
if z_score[-1] > 2.0:
return "LONG_SPREAD" # спред слишком широк, покупаем отстающий
elif z_score[-1] < -2.0:
return "SHORT_SPREAD" # спред слишком узок, продаем отстающий
else:
return "NEUTRAL"

Правила выхода

Закрывать при возврате спреда к среднему (z-score → 0) или при достижении порога убытка (стоп при развороте z-score):

Python — Логика выхода
def check_exit(entry_z_score, current_z_score, entry_price):
# Фиксация прибыли: спред вернулся наполовину к среднему
if abs(current_z_score) < abs(entry_z_score) * 0.5:
return ВЫХОД, цель_прибыли
# Стоп-лосс: z-оценка сместилась в неправильном направлении на >1
если (entry_z_score > 0 и current_z_score < entry_z_score + 1.0):
вернуть ВЫХОД, стоп_лосс
иначе если (entry_z_score < 0 и current_z_score > entry_z_score - 1.0):
вернуть ВЫХОД, стоп_лосс
вернуть ДЕРЖАТЬ, None

Бэктестинг стратегий статистического арбитража

Ключевые метрики для стат. арбитража:

Python — Бэктест стратегии пар
def backtest_pairs_strategy(price1, price2, hedge_ratio):
spread = price1 - (hedge_ratio * price2)
mean = spread.rolling(20).mean()
std = spread.rolling(20).std()
z_score = (spread - mean) / std
trades = []
position = None
for i in range(len(z_score)):
if position is None:
if z_score[i] > 2.0:
position = {"entry": spread[i], "z_entry": z_score[i], "idx": i}
else:
exit_reason = check_exit(position["z_entry"], z_score[i], spread[i])[1]
if exit_reason:
pnl = position["entry"] - spread[i]
trades.append({"pnl": pnl, "reason": exit_reason})
position = None
return pd.DataFrame(trades)

Добавление интеллекта Smart Money

Улучшите торговлю парами, фильтруя сделки с подтверждением Smart Money:

Python — Фильтрованная стратегия пар
def smart_money_pairs_strategy(symbol1, symbol2, z_score):
# Проверка подтверждения Smart Money на уровне пары
sm1 = get_smart_money_signal(symbol1)
sm2 = get_smart_money_signal(symbol2)
# Если один HIGH бычий, а другой HIGH медвежий = сильная дивергенция
# Отличное время для торговли спредом
divergence_score = abs(sm1["composite"] - sm2["composite"])
if z_score > 2.0 и divergence_score > 0.3 и sm1["confidence"] != "VETO":
вернуть "TRADE" # Сигнал с высокой уверенностью
else:
вернуть "SKIP" # Ждите выравнивания

Усильте стат. арбитраж сигналами Smart Money для пар

Фильтруйте сделки на возврат к среднему с консенсусом китов и данными деривативов. Наш API подтверждает валидность дивергенции пар с улучшением точности на 62%.

Начать торговлю парами →