# Risk Parity / Volatility Targeting Overlay (US S&P 500)

- **Slug**: `risk-parity-us-sp500`
- **Verdict**: marginal (no_edge)
- **Asset class**: equity
- **Categories**: overlay, risk-parity, volatility-targeting
- **Source**: qbuntu-analysis (computed asof 2026-07-29T01:08:35)
- **Reproducibility**: analysis-engine@18193e9, backtest-lib@711b855, grid tier=shallow (python 3.10.11, numpy 2.2.6, pandas 2.3.3)
- **HTML**: https://qbuntu.ai/strategies/risk-parity-us-sp500
- **JSON**: https://qbuntu.ai/v1/strategies/risk-parity-us-sp500
- **License**: CC-BY-4.0

## Hypothesis

Sizing positions inversely proportional to their recent volatility. Applied to S&P 500 constituents.

## Why it didn't work

Across 384 grid combinations, median Sharpe=0.44, best=1.21. Primary failure mode: no_edge.

## Performance summary

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

| Metric | Value |
|---|---|
| Sharpe (median) | 0.438 |
| Max drawdown | -25.1% |
| p-value | 0.27 |
| Backtest period | 2022-04-01 to 2026-06-01 |

Sharpe distribution across 384 grid runs: median 0.44, best 1.21 (best-case — not representative), worst -0.92, p25 -0.36, p75 0.58.

## 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
- Position sizing: volatility_targeted
- 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-risk-parity-us-sp500-0000` | cost_bps=5, target_vol=0.1, base_signal="momentum_60", holding_days=5 | 0.5 | 0.26 | 0.51 | 1.38 |
| `r-risk-parity-us-sp500-0001` | cost_bps=10, target_vol=0.1, base_signal="momentum_60", holding_days=5 | 0.4 | 0.16 | 0.42 | 1.25 |
| `r-risk-parity-us-sp500-0002` | cost_bps=5, target_vol=0.1, base_signal="momentum_120", holding_days=5 | 0.51 | 0.4 | 0.18 | 2.06 |
| `r-risk-parity-us-sp500-0004` | cost_bps=5, target_vol=0.1, base_signal="mean_reversion", holding_days=5 | -0.73 | -0.48 | -1.22 | -0.73 |
| `r-risk-parity-us-sp500-0018` | cost_bps=5, target_vol=0.1, base_signal="momentum_60", holding_days=60 | 0.63 | 1.03 | 0.58 | -1.06 |
| `r-risk-parity-us-sp500-0021` | cost_bps=10, target_vol=0.1, base_signal="momentum_120", holding_days=60 | 1.19 | 1.61 | 1.04 | -0.44 |
| `r-risk-parity-us-sp500-0038` | cost_bps=5, target_vol=0.1, base_signal="momentum_120", holding_days=20 | 0.87 | 1.26 | 0.54 | 0.46 |
| `r-risk-parity-us-sp500-0055` | cost_bps=10, target_vol=0.1, base_signal="momentum_60", holding_days=10 | 0 | 0.74 | -0.43 | -0.53 |
| `r-risk-parity-us-sp500-0072` | cost_bps=5, target_vol=0.1, base_signal="momentum_60", holding_days=5 | 0.48 | 0.32 | 0.34 | 1.43 |
| `r-risk-parity-us-sp500-0073` | cost_bps=10, target_vol=0.1, base_signal="momentum_60", holding_days=5 | 0.38 | 0.23 | 0.26 | 1.32 |
| `r-risk-parity-us-sp500-0077` | cost_bps=10, target_vol=0.1, base_signal="mean_reversion", holding_days=5 | -0.92 | -0.55 | -1.74 | -1.02 |
| `r-risk-parity-us-sp500-0091` | cost_bps=10, target_vol=0.1, base_signal="momentum_60", holding_days=60 | 0.57 | 1 | 0.45 | -1.01 |
| `r-risk-parity-us-sp500-0108` | cost_bps=5, target_vol=0.15, base_signal="momentum_60", holding_days=20 | 0.56 | 1.23 | 0.02 | -0.09 |
| `r-risk-parity-us-sp500-0125` | cost_bps=10, target_vol=0.15, base_signal="mean_reversion", holding_days=5 | -0.9 | -0.6 | -1.62 | -0.88 |
| `r-risk-parity-us-sp500-0142` | cost_bps=5, target_vol=0.15, base_signal="mean_reversion", holding_days=60 | -0.31 | -0.34 | -0.56 | 0.34 |
| `r-risk-parity-us-sp500-0159` | cost_bps=10, target_vol=0.15, base_signal="momentum_120", holding_days=20 | 0.82 | 1.26 | 0.45 | 0.42 |
| `r-risk-parity-us-sp500-0176` | cost_bps=5, target_vol=0.15, base_signal="momentum_120", holding_days=10 | 0.61 | 1.77 | -0.27 | 0.33 |
| `r-risk-parity-us-sp500-0193` | cost_bps=10, target_vol=0.2, base_signal="momentum_60", holding_days=5 | 0.4 | 0.16 | 0.42 | 1.25 |
| `r-risk-parity-us-sp500-0210` | cost_bps=5, target_vol=0.2, base_signal="momentum_60", holding_days=60 | 0.63 | 1.03 | 0.58 | -1.06 |
| `r-risk-parity-us-sp500-0227` | cost_bps=10, target_vol=0.2, base_signal="mean_reversion", holding_days=10 | -0.52 | -1.17 | -0.15 | 0.01 |
| `r-risk-parity-us-sp500-0244` | cost_bps=5, target_vol=0.2, base_signal="mean_reversion", holding_days=5 | -0.72 | -0.39 | -1.46 | -0.74 |
| `r-risk-parity-us-sp500-0261` | cost_bps=10, target_vol=0.2, base_signal="momentum_120", holding_days=60 | 1.13 | 1.58 | 0.98 | -0.66 |
| `r-risk-parity-us-sp500-0278` | cost_bps=5, target_vol=0.2, base_signal="momentum_120", holding_days=20 | 0.86 | 1.29 | 0.5 | 0.47 |
| `r-risk-parity-us-sp500-0288` | cost_bps=5, target_vol=0.3, base_signal="momentum_60", holding_days=5 | 0.5 | 0.26 | 0.51 | 1.37 |
| `r-risk-parity-us-sp500-0296` | cost_bps=5, target_vol=0.3, base_signal="momentum_120", holding_days=10 | 0.69 | 1.68 | -0.18 | 0.47 |
| `r-risk-parity-us-sp500-0308` | cost_bps=5, target_vol=0.3, base_signal="momentum_120", holding_days=60 | 1.21 | 1.63 | 1.06 | -0.38 |
| `r-risk-parity-us-sp500-0314` | cost_bps=5, target_vol=0.3, base_signal="momentum_120", holding_days=5 | 0.52 | 0.43 | 0.19 | 1.81 |
| `r-risk-parity-us-sp500-0331` | cost_bps=10, target_vol=0.3, base_signal="momentum_60", holding_days=60 | 0.56 | 0.95 | 0.51 | -1 |
| `r-risk-parity-us-sp500-0348` | cost_bps=5, target_vol=0.3, base_signal="momentum_60", holding_days=20 | 0.51 | 1.2 | -0.1 | 0.07 |
| `r-risk-parity-us-sp500-0365` | cost_bps=10, target_vol=0.3, base_signal="mean_reversion", holding_days=5 | -0.92 | -0.54 | -1.74 | -1.02 |

## Facts (5)

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

- **Best grid Sharpe ratio is 1.21 (p=0.00023).**
  - Value: 1.21 sharpe_ratio
  - Context: period 2022-04-01–2026-06-01; cost=5bps
  - Supports verdict: `marginal`
  - Cite: https://qbuntu.ai/cite/risk-parity-us-sp500-fact-best-sharpe

- **Median Sharpe across 384 grid runs is 0.44.**
  - Value: 0.44 sharpe_ratio
  - Context: Full grid of 384 parameter combinations.
  - Supports verdict: `marginal`
  - Cite: https://qbuntu.ai/cite/risk-parity-us-sp500-fact-median-sharpe

- **Median Sharpe in DOWN regime is 0.12 across 384 runs.**
  - Value: 0.12 sharpe_ratio
  - Context: Regime=DOWN, N225 SMA20/SMA60 classification.
  - Supports verdict: `marginal`
  - Cite: https://qbuntu.ai/cite/risk-parity-us-sp500-fact-regime-down

- **Median Sharpe in FLAT regime is -0.07 across 384 runs.**
  - Value: -0.07 sharpe_ratio
  - Context: Regime=FLAT, N225 SMA20/SMA60 classification.
  - Supports verdict: `marginal`
  - Cite: https://qbuntu.ai/cite/risk-parity-us-sp500-fact-regime-flat

- **Median Sharpe in UP regime is 0.64 across 384 runs.**
  - Value: 0.64 sharpe_ratio
  - Context: Regime=UP, N225 SMA20/SMA60 classification.
  - Supports verdict: `marginal`
  - Cite: https://qbuntu.ai/cite/risk-parity-us-sp500-fact-regime-up

## Related strategies

- same_strategy: [risk-parity-jp-all](https://qbuntu.ai/strategies/risk-parity-jp-all)
- same_strategy: [risk-parity-jp-growth](https://qbuntu.ai/strategies/risk-parity-jp-growth)

---

Cite as: qbuntu (2026). Risk Parity / Volatility Targeting Overlay (US S&P 500). https://qbuntu.ai/strategies/risk-parity-us-sp500

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