Статистичний арбітраж у крипто — Торгівля парами та повернення до середнього

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

Приклад: Кореляція 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
# Спред = price1 - (hedge_ratio × price2) + intercept
beta, alpha = get_hedge_ratio(btc_prices, eth_prices)
spread = btc - (beta * eth)

Стратегії повернення до середнього

Використання Z-показників

Стандартизуйте спред для виявлення екстремумів. Коли z-показник > 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-показник → 0) або при досягненні порогу збитків (зупинка при зміні z-показника):

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 Intelligence

Покращіть парний трейдинг, фільтруючи угоди з підтвердженням 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":
return "TRADE" # Сигнал високої довіри
else:
return "SKIP" # Чекати на вирівнювання

Посильте стат-арбітраж з сигналами Smart Money для пар

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

Розпочати торгівлю парами →