Index‑ETF RSI(2) Dip‑Buy
Status: Adopt candidate (paper‑trade first) · Library entry #2 · Found 2026‑08‑01 Instruments: SPY, QQQ (primary) · DIA, IWM (secondary) · broad index ETFs only Market/timeframe: stocks, 1d · Direction: long only · Frequency: ~8–9 trades/yr/ETF, ~3.5‑day holds
The edge
Buy short, sharp dips inside an uptrend on a broad index ETF, and sell the snap‑back a few days later. Multi‑day panic selling in an index overshoots — the index is diversified, so a dip is (almost always) repricing fear, not a business failing — and mean reversion has been the dominant short‑horizon behaviour of US index ETFs since the 1990s.
Two things make this entry unusually trustworthy for a backtest:
- The parameters are not ours. RSI(2) < 10 above the 200‑day SMA, exit above the 5‑day SMA, is Connors' published (2008) spec, taken verbatim. We fitted nothing — so every year since 2008 is genuine out‑of‑sample evidence, and the pre‑2008 windows are the literature's own.
- The sample is big. 57–77 trades per ETF per window, ~800 trades across the study — no single lucky trade can carry it (and strip‑best‑trade proves that below).
The setup (compilable spec)
Market: stocks, symbol SPY (or QQQ), trading timeframe 1d. Longs only. Entry (daily close):
close > SMA(200)ANDRSI(2) < 10. Exit: close back above the 5‑day SMA (close > SMA(5), condition exit at that day's close). No take‑profit, no stop‑loss (see guardrails — a stop measurably hurts this system). Fees: 0.03%/side (liquid‑ETF spread+slippage; still profitable on SPY/QQQ at 0.1%/side).
Compiled shape: entryConditions = close > sma(200) AND rsi(2) < 10;
exitConditions = close > sma(5); exitStrategy = fixed with takeProfitPct = 0,
stopLossPct = 0 (both disabled — the condition exit does the work); fees on.
Validation evidence
Held to the library vetting bar; run on the same engine the app uses, with the warm‑up run‑in so the SMA(200) is valid from bar one. Costs 0.03%/side. Returns are summed per‑trade percentages (not compounded) and exclude dividends (conservative for a long‑only system that's in the market ~11% of days).
| Test (window) | Trades | Profit factor | Return | Max DD | Survives strip‑best? |
|---|---|---|---|---|---|
| SPY 2010–2018 | 65 | 1.76 | +19.0% | 11.1% | ✅ (+16.3%) |
| SPY 2018–2026 | 76 | 2.17 | +36.4% | 7.8% | ✅ (+33.6%) |
| QQQ 2010–2018 | 77 | 1.74 | +27.7% | 10.5% | ✅ (+24.3%) |
| QQQ 2018–2026 | 71 | 2.18 | +40.0% | 5.2% | ✅ (+37.0%) |
| DIA 2010–2018 | 73 | 1.57 | +16.3% | 11.6% | ✅ |
| DIA 2018–2026 | 77 | 1.37 | +16.1% | 11.3% | ✅ |
| IWM 2010–2018 | 64 | 1.64 | +18.7% | 16.0% | ✅ |
| IWM 2018–2026 | 57 | 1.15 | +6.5% | 20.9% | ✅ (barely, +2.3%) |
| Stress: SPY 2000–2010 (dot‑com + GFC) | 57 | 3.01 | +30.4% | 3.9% | ✅ |
| Stress: QQQ 2000–2010 | 63 | 2.28 | +43.7% | 6.2% | ✅ |
| Stress: SPY 1996–2000 | 48 | 6.52 | +55.4% | 3.3% | ✅ |
- Two windows: ✅ three independent multi‑year windows (2000–2010, 2010–2018, 2018–2026), all positive on all four ETFs — two of them fully post‑publication (out‑of‑sample).
- Strip‑best‑trade: ✅ every cell stays positive without its best trade.
- Cross‑asset: ✅ 4 index ETFs. SPY/QQQ strongest; IWM weakest (see guardrails).
- Drawdown: ✅ 4–12% on SPY/QQQ. The 200‑SMA filter carried it through two crashes (2000–2010) at 4–6% DD.
- Cost stress (0.1%/side): SPY/QQQ stay clearly profitable (PF 1.4–2.3). DIA thins to PF ~1.1–1.2; IWM flips slightly negative — hence majors‑primary below.
Robustness (pre‑registered neighbours — a plateau, not a spike)
Every neighbouring variant tested is also profitable in both main windows on SPY and QQQ:
entry RSI(2) < 5 and < 15, exit RSI(2) > 65 instead of the 5‑SMA, trend filter
SMA(150) and SMA(250) — PF 1.6–3.0 across all of them. The edge does not depend on the
exact numbers 10/200/5.
Two ablations worth knowing:
- The SMA(200) filter is a drawdown device, not a return enhancer. Without it the system makes more (dip‑buying kept working in bear markets) but drawdowns double or triple (SPY 2018–2026: 7.8% → 23.8%; QQQ 2000s: 27.4%). Keep the filter.
- A stop‑loss makes it worse, not safer. A 15% disaster stop raised drawdown (QQQ 2010–2018: 10.5% → 21.7%) — it sells the flash‑crash low and misses the snap‑back that mean reversion depends on. Control risk by position size, not by a stop.
Guardrails (read before trading)
- Broad index ETFs only. The mechanism is "a diversified index overshoots and reverts" — a single stock (or a crypto alt) plunging on RSI(2) < 10 may simply be dying. Untested and untrusted outside index majors.
- SPY/QQQ first. IWM carries 21–22% drawdowns and dies at stressed costs; DIA is thin.
- No stop‑loss means gap risk is real. Worst single trades observed: −10% (SPY, Aug‑2015 flash crash), −13% (IWM). Size the position so that a −13% trade is survivable — e.g. a dedicated sleeve of ≤25% of account equity risks ≤3.3% of the account on the worst observed trade. Max losing streak observed: 5.
- It's an overlay, not a moonshot. ~+2.5–4.5%/yr per ETF on the allocated sleeve (non‑compounded), in the market only ~11% of days. Its value is the quality of the edge (high PF, huge sample, shallow DD), not the raw return.
- Expect ~65–75% winners but average loss ≥ average win — psychologically it wins often and loses bigger; that is the shape of mean reversion. Don't "fix" it mid‑drawdown.
Extension: sectors & international (2026‑08‑06, sweep #3)
The spec above, verbatim, zero knobs, on new instruments (research log). Five of seven pass the full bar; the 2000–2010 stress decade is positive on every sector tested (XLK +25.8% through the dot‑com crash):
| Instrument | W1 2010–2018 | W2 2018–2026 | Stress 2000–2010 | At 0.1%/side | Verdict |
|---|---|---|---|---|---|
| XLK (tech) | +29.0% · PF 2.15 | +40.8% · PF 2.19 | +25.8% · PF 1.81 | robust (PF 1.7–1.9) | ✅ |
| EEM (emerging) | +31.6% · PF 2.30 | +20.9% · PF 1.79 | n/a (2003‑) | robust (PF 1.5–1.9) | ✅ |
| XLF (financials) | +38.1% · PF 2.57 | +11.5% · PF 1.29 | +12.3% | thins (W2 −1% stressed) | ✅ baseline costs |
| XLE (energy) | +21.5% · PF 1.79 | +6.7% · PF 1.11 | +48.5% · PF 2.52 | flips (W2 −1.1%) | ✅ baseline costs |
| EFA (developed intl) | +13.0% · PF 1.71 | +7.0% · PF 1.22 | n/a (2001‑) | flips (W2 −1.6%) | ✅ baseline costs |
| XLV (healthcare) | +34.8% | −0.8% W2 | +13.2% | — | ❌ excluded |
| XLI (industrials) | +20.9% | +11.7%, DD 20.1% | +19.3% | — | ❌ DD bar |
Read: the mechanism generalizes well beyond the index majors — XLK/EEM join SPY/QQQ as first‑rank instruments; XLF/XLE/EFA work at liquid‑ETF costs but thin at stressed costs; XLV and XLI are excluded honestly (one failed a window, one breached the drawdown bar by 0.1).
Fill honesty: what next‑morning entry costs (2026‑08‑06)
The tables in this write‑up fill at the signal bar's close — the engine's default, and
what the early (before‑close) alert lets you approximate. The engine can now also fill at the
next morning's open (fillMode: "next_open"); the same spec re‑run that way stays
profitable everywhere but gives back a real share of the edge:
| Instrument · window | Close fill | Next‑open fill |
|---|---|---|
| SPY W2 | +36.4% · PF 2.17 | +19.4% · PF 1.59 |
| XLK W2 | +40.8% · PF 2.19 | +32.1% · PF 1.97 |
| EEM W2 | +20.9% · PF 1.79 | +7.6% · PF 1.30 |
Translation: entering near the close matters for this system — a third to half of the edge lives in the last hours of the panic day. Use the early signal; if you can only trade next‑open, the edge survives but expect the thinner column.
Trading it in the app
Build it as a Sensei plan (/ai/plan): market stocks, symbol SPY, timeframe 1d, the spec
above. The live entry finder watches a plan's own symbol for stocks too, so signals fire in
the app. Set signalMode: "early" — the daily bar "closes" only after the session, so the
early (before‑close) alert is what lets you enter near the close the backtest assumes; the
confirmed signal lands after the bar completes (entering next open is a slight, untested
deviation from the tested fills). Universe scanning is crypto‑only today, which doesn't matter
here — the symbol is fixed.
How it was found
Pre‑registered as a hypothesis from the mean‑reversion literature (strongest prior available: documented for ~30 years, parameters frozen since 2008), then validated on the app's own engine — not discovered by searching parameter space. The only exploration run was the pre‑registered neighbour/ablation grid above, reported in full: nothing tested is hidden, nothing was tuned. Candidate hypotheses that were not needed (crypto volatility‑squeeze breakout, daily trend‑pullback) were left untested rather than mined for a second entry.
