Statistical Arbitrage sa Crypto — Pairs Trading at Mean Reversion

Sinasamantala ng statistical arbitrage ang mga pansamantalang paglihis mula sa equilibrium prices. Kapag ang dalawang asset na karaniwang sabay na gumagalaw ay naghiwalay, bibilhin ng isang stat arb trader ang underperformer at ishoshort ang outperformer, na tumataya sa convergence. Sa crypto, ito ay partikular na makapangyarihan dahil ang mga asset ay correlated ngunit hindi perpekto, na lumilikha ng mga profitable pockets.

Halimbawa: Ang correlation ng BTC at ETH ay 0.85. Kapag ang ETH ay underperform sa BTC ng 3% sa loob ng 1-oras na panahon (hindi karaniwan), isang stat arb trader ay magshoshort ng BTC at maglolong ng ETH. Sa kasaysayan, nagko-converge sila sa loob ng 4-8 oras, na nakakakuha ng ~1-1.5% na kita.

Mga Batayan ng Pairs Trading

Pagpili ng Pairs

Hindi lahat ng pairs ay gumagana. Kailangan mo ng:

Python — Pagpili ng Pair
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:]:
# Kalkulahin ang correlation
corr, p_value = pearsonr(data[sym1], data[sym2])
if corr > 0.75:
# Subukan ang cointegration (Engle-Granger test)
residuals = data[sym1] - (data[sym2] * corr)
adf_stat = adf_test(residuals) # stationarity
if adf_stat < 0.05: # stationary
candidates.append((sym1, sym2, corr))
return candidates

Pagsusuri ng Cointegration

Ano ang Cointegration?

Ang dalawang non-stationary series ay cointegrated kung ang kanilang linear combination ay stationary. Sa simpleng salita: sabay silang gumagalaw sa paglipas ng panahon, at ang mga paglihis mula sa relasyong iyon ay kalaunan ay bumabalik.

Para sa BTC at ETH:

Paghahanap ng Hedge Ratio

Gamitin ang ordinary least squares regression para mahanap ang optimal ratio:

Python — Pagkalkula ng Hedge ratio
from sklearn.linear_model import LinearRegression
def get_hedge_ratio(price1, price2):
# I-regress ang price1 sa price2 para mahanap ang beta (hedge ratio)
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)

Mga Diskarte sa Mean Reversion

Paggamit ng Z-Scores

I-standardize ang spread para makita ang extremes. Kapag z-score > 2, ang spread ay hindi karaniwang malawak (opportunidad sa trade):

Python — Mean reversion trading
def mean_reversion_signal(spread, lookback=20):
# Kalkulahin ang rolling mean at std
mean = spread.rolling(window=lookback).mean()
std = spread.rolling(window=lookback).std()
# Z-score: ilang std devs mula sa mean
z_score = (spread - mean) / std
# Mga signal sa trading
if z_score[-1] > 2.0:
return "LONG_SPREAD" # spread masyadong malawak, bilhin ang underperformer
elif z_score[-1] < -2.0:
return "SHORT_SPREAD" # spread masyadong masikip, ishort ang underperformer
else:
return "NEUTRAL"

Mga Panuntunan sa Paglabas

Isara kapag ang spread ay bumalik sa mean (z-score → 0) o loss threshold (itigil sa z-score reversal):

Python — Exit logic
def check_exit(entry_z_score, current_z_score, entry_price):
# Kunin ang kita: spread nag-converge halfway pabalik sa mean
if abs(current_z_score) < abs(entry_z_score) * 0.5:
return "EXIT", "profit_target"
# Stop loss: z-score moved in wrong direction by >1
kung (entry_z_score > 0 at current_z_score < entry_z_score + 1.0):
ibalik "EXIT", "stop_loss"
kung hindi (entry_z_score < 0 at current_z_score > entry_z_score - 1.0):
ibalik "EXIT", "stop_loss"
ibalik "HOLD", None

Backtesting Stat Arb Strategies

Mga pangunahing sukatan para sa stat arb:

Python — Backtest pairs strategy
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
para sa i sa range(len(z_score)):
kung position ay None:
kung z_score[i] > 2.0:
position = {"entry": spread[i], "z_entry": z_score[i], "idx": i}
kung hindi:
exit_reason = check_exit(position["z_entry"], z_score[i], spread[i])[1]
kung exit_reason:
pnl = position["entry"] - spread[i]
trades.append({"pnl": pnl, "reason": exit_reason})
position = None
ibalik pd.DataFrame(trades)

Pagdaragdag ng Smart Money Intelligence

Pagandahin ang pairs trading sa pamamagitan ng pagsala ng mga trade gamit ang Smart Money confirmation:

Python — Filtered pairs strategy
def smart_money_pairs_strategy(symbol1, symbol2, z_score):
# Suriin ang pair-level Smart Money confirmation
sm1 = get_smart_money_signal(symbol1)
sm2 = get_smart_money_signal(symbol2)
# Kung ang isa ay HIGH bullish at ang isa ay HIGH bearish = malakas na divergence
# Magandang oras para mag-trade ng spread
divergence_score = abs(sm1["composite"] - sm2["composite"])
kung z_score > 2.0 at divergence_score > 0.3 at sm1["confidence"] != "VETO":
ibalik "TRADE" # Mataas na kumpiyansa signal
kung hindi:
ibalik "SKIP" # Maghintay para sa alignment

Pagpapalakas ng stat arb gamit ang Smart Money pairs signals

Salain ang mean reversion trades gamit ang whale consensus at derivatives data. Ang aming API ay nagpapatunay ng bisa ng pair divergence na may 62% pagpapabuti sa accuracy.

Simulan ang Pagseseguro ng Pairs →