SMA-200 Trend Timing
Status: Adopt candidate (paper‑trade first) · Library entry #3 · Found 2026‑08‑06 Instruments: SPY, QQQ (primary) · US index majors only — EFA fails Market/timeframe: stocks, 1d · Direction: long only · Frequency: ~3 trades/yr, ~2‑month avg holds, ~80% time in market
The edge
Own the index while it trends, stand aside while it doesn't. Enter when the daily close crosses above the 200‑day SMA, exit when it crosses back below. That's the whole system — Faber's published (2007) timing model with the 10‑month SMA expressed as its daily twin, taken as-is. It is the complement to the RSI(2) dip‑buy: mean reversion earns in chop and pays in trends; trend timing earns in trends and pays in chop.
What it buys you is not more return than holding — it's the trend's return without the crashes: the system was out of the market for most of 2008, the 2020 collapse, and the 2022 bear. The honest cost: whipsaw losses every time the index saws across its 200‑day line.
- The parameters are not ours. One line, published 2007, frozen since — both validation windows below are genuinely out‑of‑sample.
- Execution‑robust. Unlike the dip‑buy (which needs fills near the close), this system is indifferent-to-slightly-better at next‑morning fills — see the fills table.
The setup (compilable spec)
Market: stocks, symbol SPY (or QQQ), trading timeframe 1d. Longs only. Entry (daily close):
close crosses_above SMA(200). Exit (daily close):close crosses_below SMA(200)(condition exit — no stop, no target). Fees: 0.03%/side (liquid‑ETF spread+slippage; robust at 0.1%/side).
Compiled shape: entryConditions = close crosses_above sma(200);
exitConditions = close crosses_below sma(200); exitStrategy = fixed with both levels 0.
Validation evidence
Run on the same engine the app uses, warm‑up run‑in included, 0.03%/side. Returns are summed per‑trade percentages (not compounded), dividends excluded. Max DD is sum‑points; DD‑from‑peak (account basis, fixed notional) in parentheses. MC p95 = 95th‑percentile max drawdown across 1,000 order‑shuffles of the same trades.
| Test (window) | Trades | Profit factor | Return | Max DD (peak) | MC p95 | Strip‑best? |
|---|---|---|---|---|---|---|
| SPY 2010–2018 | 21 | 3.32 | +64.4% | 10.7% (9.9%) | 20.4 | ✅ (+27.5%) |
| SPY 2018–2026 | 29 | 2.99 | +76.5% | 15.1% (11.6%) | 23.9 | ✅ (+32.7%) |
| QQQ 2010–2018 | 30 | 3.25 | +84.6% | 10.8% (9.9%) | 25.9 | ✅ (+40.8%) |
| QQQ 2018–2026 | 17 | 6.98 | +160.0% | 13.1% (9.2%) | 20.7 | ✅ (+79.7%) |
| Stress: SPY 2000–2010 | 44 | 1.42 | +20.0% | 21.9% | 33.6 | ❌ (−3.6%) |
| Stress: QQQ 2000–2010 | 39 | 1.32 | +22.9% | 46.8% | 53.3 | ❌ (−10.7%) |
- Two windows: ✅ both independent 8‑year windows, both instruments, decisively positive.
- Strip‑best‑trade: ✅ in all four main cells — no single trade carries it.
- Cross‑asset: ✅ SPY + QQQ. EFA fails (−4.3% in W1) — international trend timing did not work; this ships US‑majors‑only.
- Cost stress (0.1%/side): ✅ barely dented (PF 2.8–6.5) — ~3 trades/yr can't be fee‑killed.
- Fills: ✅ next‑morning‑open fills are equal or better (SPY W2: PF 2.99 → 3.42; QQQ W2: 6.98 → 9.88) — no close‑fill flattery in these numbers.
The honest weakness: whipsaw decades
The 2000–2010 stress rows are the system's true face in a sideways decade: still net positive, but failing strip‑best (remove the one great crash‑avoidance trade and the decade goes slightly negative) with deep sum‑point drawdowns from stacked whipsaws (QQQ: 46.8). That is the known, literature‑documented cost of trend following — many small losses buying every false cross, repaid by rare large saves. If the next decade is a 2000s‑style chop, expect to grind sideways-to-down and to hate this system. The two modern windows passing cleanly is the evidence; the stress decade is the disclosure.
vs. just holding
Same windows, same engine benchmark: SPY 2018–2026 buy‑and‑hold made +178% with a −34% drawdown, 100% invested; this system made +76.5% with a −11.6% peak drawdown, ~77% invested. Holding wins raw return in a great bull decade — the pitch here is the drawdown column (a third of holding's) and the crash years spent in cash. It stacks naturally with the dip‑buy (entry #2): different regimes pay them.
Null test (2026‑09‑18) — and why it is the wrong test for this entry
The vetting bar gained a sixth check on 2026‑09‑18: beat a random‑entry null. Keep the window, the instrument, the exit and the fees; throw the signal away; enter on the same number of random days; repeat 400 times. This entry does not clear it:
| Window | Real trades (exposure) | Null trades (exposure) | Real return | Null median | Null p95 | Percentile |
|---|---|---|---|---|---|---|
| 2010–2018 | 21 (80.6%) | 9 (58.5%) | +64.4% | +46.2% | +71.0% | 89th |
| 2018–2026 | 29 (77.0%) | 12 (60.3%) | +76.5% | +59.9% | +93.9% | 77.3rd |
Read it precisely, because the honest version is neither "this was debunked" nor "ignore it":
- The null measures return, and this entry never claimed return. The section above says it plainly — buy‑and‑hold beat it on raw return in both windows, and the pitch is the drawdown column: 9.9–11.6% against holding's 19–34%. That claim is unaffected by this table.
- What the table does say is that the +64.4% and +76.5% are not distinguishable from being long ~60–80% of a rising market with a 200‑day exit. The crash avoidance is real; the return is roughly what the exposure bought.
- The comparison flatters this entry, not the other way round. The null realises far fewer trades and much less exposure (58.5% against 80.6%), because a random signal firing while a position is open is ignored. An exposure‑matched null would score it lower, not higher.
What to do with that: treat this as a drawdown‑reduction overlay on an index position, which is what Faber proposed it as, and not as a source of excess return. If your reason for running it is "it makes more than holding", this table says that reason is not supported.
Guardrails (read before trading)
- US index majors only. EFA failed; nothing else was tested. Untested ≠ works.
- ~3 signals a year. This is a patience instrument, not an activity feed. Do not "improve" it with extra filters mid‑drawdown — the whipsaw losses ARE the strategy working as designed.
- Whipsaw clusters are certain. 3–5 consecutive small losses around a flat 200‑day line are normal (2000s: 44 trades, most of them losers). Size so a 20‑sum‑point stretch is boring.
- Low sample per window (17–30 trades). Two windows × two instruments × a 19‑year-old frozen parameter is the case; treat singles-window readings as noise.
- Set
signalMode: "early"in the app so the before‑close alert lets you act near the close the backtest assumes — though the fills table shows next‑open entry is fine too.
How it was found
Pre‑registered in sweep #3 (research log) as a literature transplant with frozen parameters — tested against the hypothesis alongside a crypto trend‑pullback (killed: window‑unstable) and the RSI(2) sector extension (passed; see entry #2's extension section). Nothing was tuned; EFA's failure and the 2000s strip‑best failure are reported, not hidden.
