Arbitraż statystyczny w kryptowalutach — Handel parami i powrót do średniej

Arbitraż statystyczny wykorzystuje tymczasowe odchylenia od cen równowagi. Gdy dwa aktywa, które zwykle poruszają się razem, rozchodzą się, trader stat arb kupuje słabsze i sprzedaje krótko silniejsze, obstawiając konwergencję. W kryptowalutach jest to szczególnie skuteczne, ponieważ aktywa są skorelowane, ale nie idealnie, tworząc lukratywne okazje.

Przykład: Korelacja BTC i ETH wynosi 0.85. Gdy ETH osiąga wyniki o 3% gorsze niż BTC w ciągu godziny (nietypowo), trader stat arb sprzedaje krótko BTC i kupuje ETH. Historycznie konwergują w ciągu 4-8 godzin, zapewniając zysk ~1-1.5%.

Podstawy handlu parami

Wybór par

Nie wszystkie pary działają. Potrzebujesz:

Python — Wybór par
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:]:
# Oblicz korelację
corr, p_value = pearsonr(data[sym1], data[sym2])
if corr > 0.75:
# Test kointegracji (test Engle-Grangera)
residuals = data[sym1] - (data[sym2] * corr)
adf_stat = adf_test(residuals) # stacjonarność
if adf_stat < 0.05: # stacjonarne
candidates.append((sym1, sym2, corr))
return candidates

Analiza kointegracji

Co to jest kointegracja?

Dwa niestacjonarne szeregi są skointegrowane, jeśli ich kombinacja liniowa jest stacjonarna. Prościej: poruszają się razem w czasie, a odchylenia od tej relacji ostatecznie wracają.

Dla BTC i ETH:

Znajdowanie współczynnika zabezpieczenia

Użyj regresji metodą najmniejszych kwadratów, aby znaleźć optymalny współczynnik:

Python — Obliczanie współczynnika zabezpieczenia
from sklearn.linear_model import LinearRegression
def get_hedge_ratio(price1, price2):
# Regresja price1 na price2, aby znaleźć beta (współczynnik zabezpieczenia)
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)

Strategie powrotu do średniej

Użycie Z-Score

Standaryzuj spread, aby wykryć ekstrema. Gdy z-score > 2, spread jest nietypowo szeroki (okazja do handlu):

Python — Handel powrotem do średniej
def mean_reversion_signal(spread, lookback=20):
# Oblicz średnią kroczącą i odchylenie standardowe
mean = spread.rolling(window=lookback).mean()
std = spread.rolling(window=lookback).std()
# Z-score: ile odchyleń standardowych od średniej
z_score = (spread - mean) / std
# Sygnały handlowe
if z_score[-1] > 2.0:
return "LONG_SPREAD" # spread zbyt szeroki, kup słabsze
elif z_score[-1] < -2.0:
return "SHORT_SPREAD" # spread zbyt wąski, sprzedaj krótko słabsze
else:
return "NEUTRAL"

Zasady wyjścia

Zamknij, gdy spread wróci do średniej (z-score → 0) lub próg straty (stop przy odwróceniu z-score):

Python — Logika wyjścia
def check_exit(entry_z_score, current_z_score, entry_price):
# Take profit: spread zbiegł się w połowie drogi do średniej
if abs(current_z_score) < abs(entry_z_score) * 0.5:
return WYJŚCIE, profit_target
# Stop loss: z-score przesunął się w złym kierunku o >1
if (entry_z_score > 0 and current_z_score < entry_z_score + 1.0):
return WYJŚCIE, stop_loss
elif (entry_z_score < 0 and current_z_score > entry_z_score - 1.0):
return WYJŚCIE, stop_loss
return TRZYMAJ, None

Backtestowanie strategii stat arb

Kluczowe metryki dla stat arb:

Python — Backtest strategii par
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)

Dodawanie inteligencji Smart Money

Ulepsz handel parami, filtrując transakcje z potwierdzeniem Smart Money:

Python — Filtrowana strategia par
def smart_money_pairs_strategy(symbol1, symbol2, z_score):
# Sprawdź potwierdzenie Smart Money na poziomie pary
sm1 = get_smart_money_signal(symbol1)
sm2 = get_smart_money_signal(symbol2)
# Jeśli jeden jest WYSOKO byczy, a drugi WYSOKO niedźwiedzi = silna dywergencja
# Idealny czas na handel spreadem
divergence_score = abs(sm1["composite"] - sm2["composite"])
if z_score > 2.0 and divergence_score > 0.3 and sm1["confidence"] != "VETO":
return "TRADE" # Sygnał o wysokiej pewności
else:
return "SKIP" # Czekaj na zgodność

Wzmocnij stat arb sygnałami Smart Money dla par

Filtruj transakcje mean reversion z konsensusem wielorybów i danymi pochodnymi. Nasze API potwierdza ważność dywergencji par z poprawą dokładności o 62%.

Rozpocznij handel parami →