Strategy #12 — SPY VWAP Deviation Reversal (mean-reversion)

Fade ±2σ VWAP extremes on a failed second test + 5m RSI extreme + 1m volume. Phase-1 backtest on SPY underlying (R-multiples), real Alpaca data, strictly causal. 1 year: 2025-05-01 → 2026-05-01.
as-spec: 5 trades expectancy −0.41R PF 0.36 win 20% VERDICT: no durable edge
Bottom line: the strategy as specified barely triggers (5×/yr — RSI≤28/≥72 right at the ±2σ band is rare) and loses (PF 0.36). Loosening the filters to get a real sample keeps expectancy negative; the one config that prints positive (k1.5, +2.7R) is a top-5 mirage (ex-top-5 = −12.7R). Fading VWAP extremes bleeds in the trending 2025–26 regime. First mean-reversion idea tested — edgeless like the continuation family (#7–#11). Phase-2 options mapping is moot: there's no underlying edge to wrap.

Sensitivity sweep (spec §26)

configtradeswin%expectancyPF total Rex-top5+months
AS-SPEC (2σ, RSI 28/72, vol 1.5×)520.0%−0.41R0.36−2.0R1/4
loose (2σ, RSI 30/70, vol 1.25×)1435.7%−0.12R0.80−1.6R−8.2R2/10
loosest (2σ, RSI 35/65, vol 1.0×)6137.7%−0.03R0.94−2.0R−16.8R6/12
k1.5 (1.5σ, RSI 35/65, vol 1.0×)12643.7%+0.02R1.04+2.7R−12.7R7/12
ex-top5 = total after dropping the 5 best trades (mirage check). Every positive cell collapses without its top 5.

As-spec analysis charts (2σ, RSI 28/72, vol 1.5×)

as-spec equity / drawdown / per-trade / distribution
5 trades over the year: 1 winner, 4 losers; equity bleeds to −2R. Too sparse to be a strategy.

Larger-sample view — k1.5 sweep config (1.5σ, RSI 35/65, vol 1.0×)

k1.5 equity / drawdown / per-trade / distribution
126 trades — the only "positive" config (+2.7R, PF 1.04). Underwater for ~100 of 126 trades (drawdown to −12R), rescued by a late cluster of winners = the top-5 mirage in visual form.

As-spec trade log (5 trades)

#dateentry tsideentryR ($)RSI(5m) vol×exit reasonresult
12025-06-2714:26long$613.230.50221.85×STOP-1.00R
22025-06-3015:59short$618.590.63771.73×EOD+1.13R
32025-07-0712:26long$620.241.00241.68×TIME-0.15R
42025-10-3015:49long$680.740.55271.66×STOP-1.00R
52026-04-0112:12short$657.560.54742.16×STOP-1.00R
Bug-fix note (2026-06-16): caught while plotting — v1 (1) didn't apply the synthetic- invalidation floor on EOD/time exits, so a degenerate $0.07-stop setup produced a spurious −3.57R loss, and (2) had no minimum-stop filter, so rejection candles whose high ≈ the setup extreme created near-zero-R "trades" with wild R-multiples. Fixes: clamp any pre-TP1 loss to −1R (the invalidation IS the stop) and require stop ≥ 0.08% of price (~$0.50 on SPY). Trade counts roughly halved; the no-edge verdict is unchanged.
Engine strategy12_vwap_reversal.py · spec strategy12_spec.md · Backtest/research only — not financial advice. Reproduce: python strategy12_vwap_reversal.py 2025-05-01 2026-05-01 _1yr