Statistical Arbitrage in Crypto — Pairs Trading and Mean Reversion
Arbitrage thống kê khai thác các sai lệch tạm thời so với giá cân bằng. Khi hai tài sản thường di chuyển cùng nhau phân kỳ, một trader stat arb mua tài sản hoạt động kém hơn và bán khống tài sản hoạt động tốt hơn, đặt cược vào sự hội tụ. Trong crypto, điều này đặc biệt mạnh vì các tài sản có tương quan nhưng không hoàn hảo, tạo ra các cơ hội sinh lời.
Ví dụ: Tương quan BTC và ETH là 0.85. Khi ETH hoạt động kém hơn BTC 3% trong 1 giờ (bất thường), một trader stat arb bán khống BTC và mua ETH.
Cơ bản về Giao dịch cặp
Chọn cặp
Không phải cặp nào cũng hiệu quả. Bạn cần:
- Tương quan cao: >0.8 (sử dụng hệ số tương quan Pearson)
- Mối quan hệ kinh tế: Layer 2s với L1, stablecoin với nhau
- Khối lượng đủ: Cả hai cặp phải có thanh khoản
- Đồng liên kết: Cân bằng dài hạn tồn tại (kiểm tra bằng Johansen test)
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
Phân tích Đồng liên kết
Đồng liên kết là gì?
Hai chuỗi không dừng được gọi là đồng liên kết nếu tổ hợp tuyến tính của chúng là dừng. Nói đơn giản: chúng di chuyển cùng nhau theo thời gian, và các sai lệch từ mối quan hệ đó cuối cùng sẽ hồi quy.
Với BTC và ETH:
- Giá BTC: $42,000 (không dừng — xu hướng tăng/giảm)
- Giá ETH: $2,300 (không dừng — xu hướng tăng/giảm)
- Spread: BTC - (18 × ETH) = $40 (dừng — dao động quanh trung bình)
Tìm Tỷ lệ phòng ngừa
Sử dụng hồi quy bình phương nhỏ nhất thông thường để tìm tỷ lệ tối ưu:
from sklearn.linear_model import LinearRegression
def get_hedge_ratio(price1, price2):
X = price2.reshape(-1, 1)
y = price1
model = LinearRegression().fit(X, y)
hedge_ratio = model.coef_[0]
intercept = model.intercept_
return hedge_ratio, intercept
beta, alpha = get_hedge_ratio(btc_prices, eth_prices)
spread = btc - (beta * eth)
Chiến lược Hồi quy trung bình
Sử dụng Z-Scores
Chuẩn hóa spread để phát hiện cực điểm. Khi z-score > 2, spread quá rộng (cơ hội giao dịch):
def mean_reversion_signal(spread, lookback=20):
mean = spread.rolling(window=lookback).mean()
std = spread.rolling(window=lookback).std()
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"
Quy tắc Thoát lệnh
Đóng khi spread trở về trung bình (z-score → 0) hoặc ngưỡng lỗ (dừng khi z-score đảo chiều):
def check_exit(entry_z_score, current_z_score, entry_price):
if abs(current_z_score) < abs(entry_z_score) * 0.5:
return THOÁT, mục_tiêu_lợi_nhuận
nếu (entry_z_score > 0 và current_z_score < entry_z_score + 1.0):
trả về THOÁT, dừng_lỗ
hoặc_nếu (entry_z_score < 0 và current_z_score > entry_z_score - 1.0):
trả về THOÁT, dừng_lỗ
trả về GIỮ, Không
Kiểm tra ngược chiến lược Stat Arb
Các chỉ số chính cho stat arb:
- Tỷ lệ thắng: >55% (bạn đang bắt được sự đảo chiều một cách nhất quán)
- Tỷ lệ thắng/thua trung bình: >1.2 (lợi nhuận vượt qua thua lỗ)
- Chỉ số Sharpe: >0.8 (lợi nhuận trên mỗi đơn vị rủi ro)
- Mức sụt giảm tối đa: <-15% (hệ thống vẫn an toàn)
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 là 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
trả về pd.DataFrame(trades)
Thêm Trí tuệ Smart Money
Nâng cao giao dịch cặp bằng cách lọc các giao dịch với xác nhận Smart Money:
def smart_money_pairs_strategy(symbol1, symbol2, z_score):
sm1 = get_smart_money_signal(symbol1)
sm2 = get_smart_money_signal(symbol2)
divergence_score = abs(sm1["composite"] - sm2["composite"])
if z_score > 2.0 và divergence_score > 0.3 và sm1["confidence"] != "VETO":
trả về "GIAO_DỊCH"
else:
trả về "BỎ QUA"
Tăng cường stat arb với tín hiệu cặp Smart Money
Lọc các giao dịch đảo chiều trung bình với sự đồng thuận của cá voi và dữ liệu phái sinh.
Bắt đầu Giao dịch Cặp →