Hypothesis
Simple rule-based trading strategies don't beat buy-and-hold once risk is accounted for.
Benchmark: SPY for stocks and ETFs, buy-and-hold BTC for crypto. Tested on liquid ETFs, large-cap stocks and major crypto.
- 16strategies tested
- 6edged past their benchmark
- 5of those, within noise
Live since Oct 19: Momentum $0, Mean reversion $0, SPY $0 (0 trading days; too early to read). With 16 tries, a few edges are expected by chance.
How is “within noise” defined?
A strategy counts as within noise when its out-of-sample Sharpe ratio is less than 0.15 above its benchmark’s. That is a simple fixed threshold, not a formal statistical test, and it was set when this page was built, after these results were known. It is generous: with about three years of out-of-sample data, a Sharpe ratio’s standard error is roughly 0.6, so by a formal test none of these margins would count as significant.
What would disprove it
- Beats its benchmark's Sharpe out of sample by more than noiseTrend following, crypto (#18)1 of 16
- …and does it consistently: ahead in at least two-thirds of full yearsTrend following, crypto (#18): ahead in 2 of 4 full years0 of 1
- …and does it again in live paper tradingNothing has reached this step.No candidate
Status: Not disproved
- P1 Momentum Kill switch armed $00.00% GapLevel Todayn/a Days won0–0
- P2 Mean reversion Kill switch armed $00.00% GapLevel Todayn/a Days won0–0
- P3 SPYDoing nothing: $100,000 left in the S&P 500 index $00.00% GapLevel Todayn/a Days won0–0
The chart appears after two evenings of results.
Holdings and activity
Both bots trade the same 11 S&P 500 sector funds (tech, financials, energy, health care, industrials, consumer, utilities, materials, real estate and communications) and park idle cash in BIL, a Treasury bill fund. Quiet stretches are normal: Momentum only trades once a month, and Mean reversion waits for a dip.
Why sector funds and not individual stocks?
They are stocks, just in baskets: each fund holds dozens of S&P 500 companies (the tech fund is Apple, Microsoft, Nvidia and the rest), and all 11 together are the whole index. Picking single stocks was tested too: momentum, mean reversion, low volatility and breakout on S&P 500 stocks (#12 to #17 below). None beat simply holding SPY once risk was counted, despite a head start: the tests only used companies in the S&P 500 today, so they never held the ones that did badly and were dropped along the way. Momentum and mean reversion both did better on sector funds, and a basket can't be sunk by one bad earnings report.
Momentum
Game plan Bets that winners keep winning. On the first trading day of each month, it buys the 3 sector funds with the best past year (skipping the latest month), and only ones that are up. Any empty slot sits in Treasury bills.
$00.00% since Oct 19 · 0 trading days · days won 0–0
Kill switch armed: stops trading after a 5% losing day
What it holds
No holdings yet.
Cash $100,000. As of the Oct 19 close.
Fills vs official open
On average 11.0 bps better than the official open across 1 fills, better than the 5 bps the backtest assumes. Paper fills are simulated, so this checks only part of real-world slippage.
| Day | Symbol | Side | Qty | Fill | Open | bps vs open |
|---|---|---|---|---|---|---|
| Oct 20 | XLV | buy | 9 | $177.47 | $177.66 | -11.0 |
Mean reversion
Game plan Buys the dip, sells the bounce. When a sector fund in a long-term uptrend has a sharp 2-day drop, it buys; once the price climbs back above its 5-day average, it sells. Most of the time it sits in Treasury bills.
$00.00% since Oct 19 · 0 trading days · days won 0–0
Kill switch armed: stops trading after a 3% losing day
What it holds
No holdings yet.
Cash $100,000. As of the Oct 19 close.
Fills vs official open
Measured the evening after each order fills: what we paid versus the official opening price.
No fills measured yet.
Strategy research
16 strategies tested. 6 beat their benchmark out of sample; 1 by more than noise.
Every idea ever backtested is listed, including the 3 do-nothing baselines. Beating the benchmark (SPY for stocks and ETFs, buy-and-hold BTC for crypto) means a higher risk-adjusted return (Sharpe ratio) on years the strategy never saw while it was being built. Test enough ideas and a few will look brilliant by luck alone, so read any winner next to this count.
Full scoreboard
| # | Strategy | Universe | Yearly return, in-sample | Sharpe, in-sample | Yearly return, out-of-sample | Sharpe, out-of-sample | Benchmark | Benchmark yearly return, out-of-sample |
|---|---|---|---|---|---|---|---|---|
| #1 | ma_crossover(fast=50, slow=200) | indexes | 10.4% | 0.62 | 11.9% | 0.52 | SPY | 18.9% |
| #2 | ma_crossover(fast=50, slow=200) | sectors | 6.6% | 0.45 | 8.3% | 0.40 | SPY | 18.9% |
| #3 | momentum(lookback=252, skip=21, top_n=3, positive only) | sectors | 9.7% | 0.50 | 20.2% | 1.00 | SPY | 18.9% |
| #4 | mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5) | sectors | 2.3% | 0.24 | 7.2% | 0.84 | SPY | 18.9% |
| #5 | core_overlay(core=80% SPY, rest: no overlay (cash)) | sectors | 11.3% | 0.71 | 16.0% | 0.93 | SPY | 18.9% |
| #6 | core_overlay(core=80% SPY, rest: mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5)) | sectors | 11.6% | 0.71 | 16.6% | 0.95 | SPY | 18.9% |
| #7 | core_overlay(core=80% SPY, rest: mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5)) | SPY | 11.5% | 0.70 | 16.8% | 0.96 | SPY | 18.9% |
| #8 | core_overlay(core=60% SPY, rest: no overlay (cash)) | sectors | 8.9% | 0.71 | 13.1% | 0.93 | SPY | 18.9% |
| #9 | core_overlay(core=60% SPY, rest: mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5)) | sectors | 9.3% | 0.70 | 14.2% | 0.98 | SPY | 18.9% |
| #10 | core_overlay(core=50% SPY, rest: no overlay (cash)) | sectors | 7.7% | 0.71 | 11.7% | 0.93 | SPY | 18.9% |
| #11 | core_overlay(core=50% SPY, rest: mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5)) | sectors | 8.2% | 0.69 | 13.1% | 1.00 | SPY | 18.9% |
| #12 | breakout(stop=8%, risk=1%/trade -> 12.5% each, max 8 positions, RS top 30% of 252d, 20d high on 1.5x 50d volume, SPY > SMA200, index-membership dated) | sp500 | 2.1% | 0.13 | 12.8% | 0.45 | SPY | 18.9% |
| #13 | momentum(lookback=252, skip=21, top_n=20, positive only, index-membership dated) | sp500 | 15.5% | 0.62 | 24.5% | 0.67 | SPY | 18.9% |
| #14 | low_volatility(lookback=252, top_n=50, index-membership dated) | sp500 | 10.0% | 0.58 | 8.2% | 0.37 | SPY | 18.9% |
| #15 | mean_reversion_slots(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5, max_positions=10, index-membership dated) | sp500 | 12.6% | 0.71 | 2.4% | -0.03 | SPY | 18.9% |
| #16 | momentum(lookback=252, skip=21, top_n=20, positive only, index-membership dated, cash when SPY < SMA200) | sp500 | 4.3% | 0.24 | 14.8% | 0.45 | SPY | 18.9% |
| #17 | momentum(lookback=252, skip=21, top_n=20, positive only, index-membership dated, cash when SPY < SMA200 (daily check)) | sp500 | 8.3% | 0.45 | 17.8% | 0.53 | SPY | 18.9% |
| #18 | trend(above SMA100) | crypto | 18.2% | 0.53 | -0.2% | 0.04 | BTC/USD | -12.0% |
| #19 | momentum(lookback=90, skip=0, top_n=2, positive only) | crypto | 41.5% | 0.78 | -33.6% | -0.77 | BTC/USD | -12.0% |