SRM Statistical Arbitrage Risk Management
The five risks that will kill your stat arb P&L — and how to monitor each one
Learning Objectives
- •Identify the specific risks unique to statistical arbitrage
- •Build a comprehensive risk monitoring framework
- •Implement automated risk checks for production stat arb
Explain Like I'm 5
Stat arb has a specific set of risks that directional trading doesn't. Crowding risk (everyone running the same trade). Correlation breakdown (the relationship stops working). Gap risk (overnight jumps that bypass stops). Margin risk (two positions burning margin). Model risk (your OU or Kalman filter is wrong). Each needs its own monitoring and defense. This lesson builds the complete risk framework.
Think of It This Way
Managing stat arb risk is like running a hospital ICU. Each patient (trade) has multiple vital sign monitors — heart rate (correlation), blood pressure (spread deviation), breathing (liquidity), and brain activity (model confidence). Any single vital sign going critical triggers an alarm. You don't wait for all five to go red simultaneously.
1The Five Stat Arb Risks
2Risk Monitoring Framework
Key Formulas
Max Divergence Stop-Loss
A hard stop-loss on the spread at 4 standard deviations. Beyond this, the probability that the spread reverts within a reasonable timeframe is too low. Cut the loss.
Hands-On Code
Stat Arb Risk Monitor
import numpy as np
def statarb_risk_check(spread, coint_pvalue, margin_used_pct, half_life_current, half_life_baseline):
"""Comprehensive stat arb risk assessment."""
alerts = []
# Spread deviation check
z = (spread[-1] - np.mean(spread[-100:])) / np.std(spread[-100:])
if abs(z) > 4.0:
alerts.append(f"[CRITICAL] Spread z={z:.1f} exceeds 4-sigma stop")
elif abs(z) > 3.0:
alerts.append(f"[WARNING] Spread z={z:.1f} approaching stop zone")
# Cointegration stability
if coint_pvalue > 0.15:
alerts.append(f"[CRITICAL] Cointegration p={coint_pvalue:.3f} (lost)")
elif coint_pvalue > 0.08:
alerts.append(f"[WARNING] Cointegration p={coint_pvalue:.3f} (weakening)")
# Margin check
if margin_used_pct > 0.70:
alerts.append(f"[CRITICAL] Margin utilization {margin_used_pct:.0%}")
elif margin_used_pct > 0.50:
alerts.append(f"[WARNING] Margin utilization {margin_used_pct:.0%}")
# Model stability (half-life drift)
hl_ratio = half_life_current / max(half_life_baseline, 1)
if hl_ratio > 2.5:
alerts.append(f"[CRITICAL] Half-life {hl_ratio:.1f}x baseline (model stale)")
elif hl_ratio > 1.5:
alerts.append(f"[WARNING] Half-life {hl_ratio:.1f}x baseline")
# Summary
criticals = sum(1 for a in alerts if 'CRITICAL' in a)
warnings = sum(1 for a in alerts if 'WARNING' in a)
print(f"=== STAT ARB RISK CHECK ===")
for alert in alerts:
print(f" {alert}")
if not alerts:
print(f" [ALL CLEAR] No risk flags")
print(f"")
print(f"Criticals: {criticals} Warnings: {warnings}")
if criticals >= 2:
print(f" >>> UNWIND ALL POSITIONS <<<")
elif criticals >= 1:
print(f" >>> REDUCE EXPOSURE 50% <<<")
elif warnings >= 2:
print(f" >>> TIGHTEN STOPS <<<")
return criticals, warningsImplements a comprehensive risk check that evaluates cointegration stability, spread deviation, margin utilization, and model health to produce an aggregate risk assessment.
Knowledge Check
Q1.Your pair's cointegration p-value rises from 0.01 to 0.15 over two weeks. What should you do?
Assignment
Build a comprehensive risk monitoring dashboard for a stat arb portfolio. Implement automated alerts for all five risk types. Backtest your risk system against the 2020 COVID crisis to validate it would have protected capital.