Larry Connors and Cesar Alvarez published a short-term mean-reversion rule in 2008: when a market is above its 200-day average and a 2-period RSI reads deeply oversold, buy the close; exit a few days later when it normalises. No stops — that is a rule, not an omission. It is probably the most reproduced retail strategy on the internet.

I rebuilt it from the published rules, ran it on SPY across 8,454 daily bars from January 1993 to August 2026, and put it through the same gates I would run on a client's strategy. The whole battery takes 17 seconds. Every number below names the script that produces it and the exact key it occupies in that script's output, and the full output is published verbatim at the foot of this page — not the figures I chose to quote, but all of them.

Which variant, stated up front, because it governs every number here: the headline figures use the single-day form — a 2-period Wilder RSI below 10 while price is above its 200-day average, exiting on the 5-day average, long only. That is the canonical public restatement, and it was fixed in advance rather than chosen because it performed best. The book's own Chapter 9 table uses a different rule, and is treated separately below.

Three findings need no significance test, because they are not comparisons of noisy estimates. They are arithmetic.

Of 144 parameter variants, zero beat buy-and-hold on CAGR — in any era. Not the best one. None of them.

The shallow drawdown is the seduction, and it is not skill. The strategy is in the market a tenth of the time, so it mechanically avoids most of every crash. Compared against simply holding 10.5% of SPY permanently and never trading, its risk advantage disappears: ulcer index 0.0298 against the do-nothing null's 0.0146. The null is twice as good. Holding less beats timing, again.

The strategy does look worse after 2008. Gross return per trade fell from 0.83% to 0.55%. Sharpe fell from 0.92 to 0.57. Every measure points the same way.

None of it is significant. Two-sample p = 0.066 per trade, 0.163 per bar; the bootstrap interval on the gap spans zero. And then the harness returned something I had not seen before:

That is a stranger and more useful result than "it decayed." A backtest can pose a question that its own data is permanently unable to answer — and nothing in a conventional backtest report tells you when you are in that situation. You get a p-value, you read it as weak evidence, and you assume more data would help. Here it cannot.

My first pass produced a clean, confident, publishable answer. A four-lens adversarial review found ten defects, four of them fatal — every one reproduced. Not a single false alarm. Here is what they did to the numbers I was about to publish.

Every correction moved the result toward less certainty. That is the direction corrections go when the original was written by someone hoping for a finding — which is the honest description of what I was doing.

1/T instead of measuring it. Scored through that floored path, an iid null clears the 0.95 bar 0.44% of the time (21 of 4,800 replications, MC SE 0.10pp) against 4.04% for the corrected variance — a gate firing about a ninth as often as it should, reported as a gate that found nothing. The conclusion happened to survive re-measurement. The reasoning did not, and I have corrected that page.

Connors published real work. The rules are causal, there is no lookahead, and the trades are real. It still returns less than half of doing nothing.

A strategy that sits in cash 90% of the time will always show a beautiful drawdown. That is exposure, not skill, and the control that proves it takes one line.

Not "we need more data" — no achievable amount of data resolves it. Nothing in a standard report tells you when you have hit that wall.

I run this on other people's strategies for a fixed fee. The deliverable is what you just read: the reproduction, the gates, the specific defect, and every number paired with the command that regenerates it — including the ones that make me look bad. The audit, and what it costs →

A claim that numbers are reproducible is worth nothing unless you can check it, so here is the whole apparatus rather than an assurance. Two scripts produce every figure on this page. Both write a single JSON file, and both of those files are published below in full — including the cells that make the strategy look better than my summary does, and the ones I did not quote.

The commands, run from the repository root:

python research/connors_rsi2.py — the full battery, writing

research/connors_rsi2_result.json.

python research/turtle_rerun_null_flooredV.py — 4,800 null replications scored

through both variance paths, writing

research/turtle_rerun_null_flooredV.json.

The raw outputs: connors_rsi2_result.json (208 KB) and turtle_rerun_null_flooredV.json.

One caveat that survives all of the above, from the run's own data fingerprint: the adjusted price series is recomputed by the vendor on every fetch, so these figures reproduce to about three significant figures across fetches, not to the last digit. The raw tape prices are stable. Anyone re-running this later should expect the third decimal to move.