Statistische Arbitrage im Krypto-Bereich — Pairs Trading und Mean Reversion

Statistische Arbitrage nutzt vorübergehende Abweichungen von Gleichgewichtspreisen. Wenn zwei Assets, die sich normalerweise gemeinsam bewegen, auseinanderdriften, kauft ein Stat-Arb-Trader den Underperformer und shorten den Outperformer, um auf eine Konvergenz zu setzen. Im Krypto-Bereich ist dies besonders effektiv, da Assets korreliert, aber nicht perfekt korreliert sind, was profitable Gelegenheiten schafft.

Beispiel: Die Korrelation zwischen BTC und ETH beträgt 0,85. Wenn ETH innerhalb einer Stunde um 3 % schlechter abschneidet als BTC (ungewöhnlich), shorten Stat-Arb-Trader BTC und gehen long in ETH. Historisch gesehen konvergieren sie innerhalb von 4-8 Stunden und sichern sich einen Gewinn von ~1-1,5 %.

Grundlagen des Pairs Trading

Auswahl der Paare

Nicht alle Paare funktionieren. Sie benötigen:

Python — Paarauswahl
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:]:
# Korrelation berechnen
corr, p_value = pearsonr(data[sym1], data[sym2])
if corr > 0.75:
# Kointegration testen (Engle-Granger-Test)
residuals = data[sym1] - (data[sym2] * corr)
adf_stat = adf_test(residuals) # Stationarität
if adf_stat < 0.05: # stationär
candidates.append((sym1, sym2, corr))
return candidates

Kointegrationsanalyse

Was ist Kointegration?

Zwei nicht-stationäre Zeitreihen sind kointegriert, wenn ihre lineare Kombination stationär ist. Einfach ausgedrückt: Sie bewegen sich gemeinsam über die Zeit, und Abweichungen von dieser Beziehung gleichen sich schließlich aus.

Für BTC und ETH:

Berechnung des Hedge-Verhältnisses

Verwenden Sie die Methode der kleinsten Quadrate, um das optimale Verhältnis zu finden:

Python — Berechnung des Hedge-Verhältnisses
from sklearn.linear_model import LinearRegression
def get_hedge_ratio(price1, price2):
# Regression von price1 auf price2, um Beta (Hedge-Verhältnis) zu finden
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)

Mean-Reversion-Strategien

Verwendung von Z-Scores

Standardisieren Sie den Spread, um Extreme zu erkennen. Wenn der Z-Score > 2 ist, ist der Spread ungewöhnlich weit (Handelsgelegenheit):

Python — Mean-Reversion-Trading
def mean_reversion_signal(spread, lookback=20):
# Gleitenden Mittelwert und Standardabweichung berechnen
mean = spread.rolling(window=lookback).mean()
std = spread.rolling(window=lookback).std()
# Z-Score: Wie viele Standardabweichungen vom Mittelwert
z_score = (spread - mean) / std
# Handelssignale
if z_score[-1] > 2.0:
return "LONG_SPREAD" # Spread zu weit, kaufe Underperformer
elif z_score[-1] < -2.0:
return "SHORT_SPREAD" # Spread zu eng, shorte Underperformer
else:
return "NEUTRAL"

Ausstiegsregeln

Schließen, wenn der Spread zum Mittelwert zurückkehrt (Z-Score → 0) oder Verlustschwelle erreicht (Stopp bei Z-Score-Umkehr):

Python — Ausstiegslogik
def check_exit(entry_z_score, current_z_score, entry_price):
# Gewinnmitnahme: Spread ist zur Hälfte zum Mittelwert zurückgekehrt
if abs(current_z_score) < abs(entry_z_score) * 0.5:
return "EXIT", "profit_target"
# Stop-Loss: Z-Score hat sich in die falsche Richtung um >1 bewegt
if (entry_z_score > 0 and current_z_score < entry_z_score + 1.0):
return "EXIT", "stop_loss"
elif (entry_z_score < 0 and current_z_score > entry_z_score - 1.0):
return "EXIT", "stop_loss"
return "HOLD", None

Backtesting von Stat-Arb-Strategien

Wichtige Kennzahlen für Stat-Arb:

Python — Backtest für Paarstrategie
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)

Erweiterung durch Smart-Money-Intelligenz

Verbessern Sie das Paarhandel durch Filtern von Trades mit Smart-Money-Bestätigung:

Python — Gefilterte Paarstrategie
def smart_money_pairs_strategy(symbol1, symbol2, z_score):
# Überprüfen Sie die Smart-Money-Bestätigung auf Paarebene
sm1 = get_smart_money_signal(symbol1)
sm2 = get_smart_money_signal(symbol2)
# Wenn einer HOCH bullisch und der andere HOCH bärisch ist = starke Divergenz
# Idealer Zeitpunkt, um den Spread zu handeln
divergence_score = abs(sm1["composite"] - sm2["composite"])
if z_score > 2.0 and divergence_score > 0.3 and sm1["confidence"] != "VETO":
return "TRADE" # Signal mit hoher Zuversicht
else:
return "SKIP" # Warten Sie auf Übereinstimmung

Verbessern Sie Stat-Arb mit Smart-Money-Paarsignalen

Filtrieren Sie Mean-Reversion-Trades mit Wal-Konsens und Derivaten-Daten. Unsere API bestätigt die Gültigkeit der Paardivergenz mit einer 62%igen Genauigkeitsverbesserung.

Starten Sie mit dem Handel von Paaren →