# Pairs Trading / Statistical Arbitrage (US S&P 500)

- **Slug**: `pair-trading-us-sp500`
- **Verdict**: promising
- **Asset class**: equity
- **Categories**: mean-reversion, pairs-trading, statistical-arbitrage
- **Source**: qbuntu-analysis (computed asof 2026-09-24T02:22:18)
- **Reproducibility**: analysis-engine@1455e77, backtest-lib@17a7674, grid tier=shallow (python 3.12.10, numpy 2.4.2, pandas 3.0.0)
- **HTML**: https://qbuntu.ai/strategies/pair-trading-us-sp500
- **JSON**: https://qbuntu.ai/v1/strategies/pair-trading-us-sp500
- **License**: CC-BY-4.0

## Hypothesis

Engle-Granger cointegration: identify stock pairs with mean-reverting spreads. Applied to S&P 500 constituents.

## Performance summary

Headline figures are the **median across the parameter grid**, not the best run.

| Metric | Value |
|---|---|
| Sharpe (median) | 1.6707 |
| Max drawdown | -1.5% |
| p-value | 0 |
| Backtest period | 2022-03-09 to 2026-09-17 |

Sharpe distribution across 288 grid runs: median 1.67, best 3.11 (best-case — not representative), worst 0.41, p25 0.97, p75 2.15.

## Methodology

- Notes: {"walk_forward_definition": {"type": "single_pass", "description": "Full period backtest without walk-forward split", "verdict_basis": "full_period"}}
- Slippage model: open-on-open + variable bps fixed (4x per round-trip: 2 legs)
- Position sizing: equal_weight
- Regime definition: GSPC SMA20/SMA60 three-class: UP (close>SMA20 AND SMA20>SMA60), DOWN (close<SMA20 AND SMA20<SMA60), FLAT (else)
- Transaction cost bps: 5

## Target universe

S&P 500 constituents, ~503 stocks

## Runs (30)

| run_id | params | sharpe | UP | FLAT | DOWN |
|---|---|---:|---:|---:|---:|
| `r-pair-trading-us-sp500-0000` | cost_bps=5, lookback=60, max_pairs=5, exit_zscore=0 | 1.21 | 0.81 | 1.86 | 2.09 |
| `r-pair-trading-us-sp500-0001` | cost_bps=10, lookback=60, max_pairs=5, exit_zscore=0 | 1.15 | 0.77 | 1.78 | 2.01 |
| `r-pair-trading-us-sp500-0002` | cost_bps=5, lookback=60, max_pairs=10, exit_zscore=0 | 0.68 | 1.11 | 0.69 | 2.38 |
| `r-pair-trading-us-sp500-0004` | cost_bps=5, lookback=60, max_pairs=20, exit_zscore=0 | 0.58 | 1.4 | 0.67 | 2.26 |
| `r-pair-trading-us-sp500-0012` | cost_bps=5, lookback=250, max_pairs=5, exit_zscore=0 | 3.11 | 3.94 | 2.55 | 5 |
| `r-pair-trading-us-sp500-0016` | cost_bps=5, lookback=250, max_pairs=20, exit_zscore=0 | 2.5 | 2.26 | 2.93 | 3.81 |
| `r-pair-trading-us-sp500-0028` | cost_bps=5, lookback=120, max_pairs=20, exit_zscore=0.25 | 2.16 | 2.26 | 2.03 | 3.01 |
| `r-pair-trading-us-sp500-0040` | cost_bps=5, lookback=60, max_pairs=20, exit_zscore=0.5 | 0.57 | 1.77 | 0.66 | 1.65 |
| `r-pair-trading-us-sp500-0052` | cost_bps=5, lookback=250, max_pairs=20, exit_zscore=0.5 | 2.61 | 3.25 | 2.32 | 5.21 |
| `r-pair-trading-us-sp500-0054` | cost_bps=5, lookback=60, max_pairs=5, exit_zscore=1 | 1.22 | 1.27 | 1.05 | 2.23 |
| `r-pair-trading-us-sp500-0065` | cost_bps=10, lookback=120, max_pairs=20, exit_zscore=1 | 0.94 | 0.94 | 2.45 | 3.65 |
| `r-pair-trading-us-sp500-0077` | cost_bps=10, lookback=60, max_pairs=20, exit_zscore=0 | 0.57 | 1.34 | 0.67 | 2.18 |
| `r-pair-trading-us-sp500-0089` | cost_bps=10, lookback=250, max_pairs=20, exit_zscore=0 | 2.47 | 2.23 | 2.9 | 3.76 |
| `r-pair-trading-us-sp500-0101` | cost_bps=10, lookback=120, max_pairs=20, exit_zscore=0.25 | 2.11 | 2.2 | 1.98 | 2.96 |
| `r-pair-trading-us-sp500-0113` | cost_bps=10, lookback=60, max_pairs=20, exit_zscore=0.5 | 0.54 | 1.64 | 0.64 | 1.5 |
| `r-pair-trading-us-sp500-0125` | cost_bps=10, lookback=250, max_pairs=20, exit_zscore=0.5 | 2.58 | 3.21 | 2.29 | 5.18 |
| `r-pair-trading-us-sp500-0137` | cost_bps=10, lookback=120, max_pairs=20, exit_zscore=1 | 0.94 | 0.94 | 2.45 | 3.65 |
| `r-pair-trading-us-sp500-0149` | cost_bps=10, lookback=60, max_pairs=20, exit_zscore=0 | 0.57 | 1.34 | 0.67 | 2.18 |
| `r-pair-trading-us-sp500-0161` | cost_bps=10, lookback=250, max_pairs=20, exit_zscore=0 | 2.47 | 2.23 | 2.9 | 3.76 |
| `r-pair-trading-us-sp500-0173` | cost_bps=10, lookback=120, max_pairs=20, exit_zscore=0.25 | 2.11 | 2.2 | 1.98 | 2.96 |
| `r-pair-trading-us-sp500-0185` | cost_bps=10, lookback=60, max_pairs=20, exit_zscore=0.5 | 0.54 | 1.64 | 0.64 | 1.5 |
| `r-pair-trading-us-sp500-0197` | cost_bps=10, lookback=250, max_pairs=20, exit_zscore=0.5 | 2.58 | 3.21 | 2.29 | 5.18 |
| `r-pair-trading-us-sp500-0209` | cost_bps=10, lookback=120, max_pairs=20, exit_zscore=1 | 0.94 | 0.94 | 2.45 | 3.65 |
| `r-pair-trading-us-sp500-0216` | cost_bps=5, lookback=60, max_pairs=5, exit_zscore=0 | 1.26 | 0.89 | 1.86 | 2.19 |
| `r-pair-trading-us-sp500-0222` | cost_bps=5, lookback=120, max_pairs=5, exit_zscore=0 | 2.01 | 2.17 | 1.81 | 1.86 |
| `r-pair-trading-us-sp500-0234` | cost_bps=5, lookback=60, max_pairs=5, exit_zscore=0.25 | 2.09 | 2.24 | 2.3 | 1.28 |
| `r-pair-trading-us-sp500-0246` | cost_bps=5, lookback=250, max_pairs=5, exit_zscore=0.25 | 2.14 | 1.76 | 5.3 | 8.88 |
| `r-pair-trading-us-sp500-0255` | cost_bps=10, lookback=60, max_pairs=10, exit_zscore=0.5 | 0.41 | 1.59 | 0.55 | 1.16 |
| `r-pair-trading-us-sp500-0259` | cost_bps=10, lookback=120, max_pairs=5, exit_zscore=0.5 | 1.59 | 1.3 | 1.85 | 1.95 |
| `r-pair-trading-us-sp500-0271` | cost_bps=10, lookback=60, max_pairs=5, exit_zscore=1 | 1.18 | 1.17 | 0.97 | 2.18 |

## Facts (5)

Each fact has a permanent citation URL. AI agents quoting qbuntu should use these.

- **Best grid Sharpe ratio is 3.11 (p=9e-08).**
  - Value: 3.11 sharpe_ratio
  - Context: period 2022-03-09–2026-09-17; cost=5bps
  - Supports verdict: `promising`
  - Cite: https://qbuntu.ai/cite/pair-trading-us-sp500-fact-best-sharpe

- **Median Sharpe across 288 grid runs is 1.67.**
  - Value: 1.67 sharpe_ratio
  - Context: Full grid of 288 parameter combinations.
  - Supports verdict: `promising`
  - Cite: https://qbuntu.ai/cite/pair-trading-us-sp500-fact-median-sharpe

- **Median Sharpe in DOWN regime is 2.96 across 288 runs.**
  - Value: 2.96 sharpe_ratio
  - Context: Regime=DOWN, N225 SMA20/SMA60 classification.
  - Supports verdict: `promising`
  - Cite: https://qbuntu.ai/cite/pair-trading-us-sp500-fact-regime-down

- **Median Sharpe in FLAT regime is 2.18 across 288 runs.**
  - Value: 2.18 sharpe_ratio
  - Context: Regime=FLAT, N225 SMA20/SMA60 classification.
  - Supports verdict: `promising`
  - Cite: https://qbuntu.ai/cite/pair-trading-us-sp500-fact-regime-flat

- **Median Sharpe in UP regime is 1.66 across 288 runs.**
  - Value: 1.66 sharpe_ratio
  - Context: Regime=UP, N225 SMA20/SMA60 classification.
  - Supports verdict: `promising`
  - Cite: https://qbuntu.ai/cite/pair-trading-us-sp500-fact-regime-up

## Related strategies

- same_strategy: [pair-trading-jp-growth](https://qbuntu.ai/strategies/pair-trading-jp-growth)

---

Cite as: qbuntu (2026). Pairs Trading / Statistical Arbitrage (US S&P 500). https://qbuntu.ai/strategies/pair-trading-us-sp500

Visit qbuntu.ai — the honest scorecard for quant strategies (live, promising, marginal, rejected).
