PAPERTRADER Updated Oct 20, 8:24am ET

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

  1. Beats its benchmark's Sharpe out of sample by more than noiseTrend following, crypto (#18)1 of 16
  2. …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
  3. …and does it again in live paper tradingNothing has reached this step.No candidate

Status: Not disproved

  1. P1 Momentum Kill switch armed $00.00% GapLevel Todayn/a Days won0–0
  2. P2 Mean reversion Kill switch armed $00.00% GapLevel Todayn/a Days won0–0
  3. P3 SPYDoing nothing: $100,000 left in the S&P 500 index $00.00% GapLevel Todayn/a Days won0–0
1Momentum2Mean reversion3SPY START $0 $0$0$0
Position on the track is profit or loss since the first orders. Behind the start line means losing money.
Profit and loss by day

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?

Because the stock versions lost. Momentum, mean reversion, low volatility and breakout were each backtested on S&P 500 stocks (#12 to #17 below), and none beat simply holding SPY once risk was counted, even though those tests flatter stocks: they only include companies still in the index today. Momentum and mean reversion both did better on sector funds. A fund also holds dozens of companies, so one bad earnings report can't sink a bot.

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

Measured the evening after each order fills: what we paid versus the official opening price.

No fills measured yet.

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.

Sharpe ratio, out-of-sample · the dark tick on each bar is that strategy's benchmark (SPY, or BTC for crypto)

  1. #1 MA crossover indexes 0.52 lagged SPY
  2. #2 MA crossover sectors 0.40 lagged SPY
  3. #3 Momentum sectors 1.00 beat SPY
  4. #4 Mean reversion sectors 0.84 lagged SPY
  5. #5 SPY + overlay sectors 0.93 baseline
  6. #6 SPY + overlay sectors 0.95 beat SPY
  7. #7 SPY + overlay SPY 0.96 beat SPY
  8. #8 SPY + overlay sectors 0.93 baseline
  9. #9 SPY + overlay sectors 0.98 beat SPY
  10. #10 SPY + overlay sectors 0.93 baseline
  11. #11 SPY + overlay sectors 1.00 beat SPY
  12. #12 Breakout sp500 0.45 lagged SPY
  13. #13 Momentum sp500 0.67 lagged SPY
  14. #14 Low volatility sp500 0.37 lagged SPY
  15. #15 Mean reversion (slots) sp500 -0.03 lagged SPY
  16. #16 Momentum sp500 0.45 lagged SPY
  17. #17 Momentum sp500 0.53 lagged SPY
  18. #18 Trend following crypto 0.04 beat BTC
  19. #19 Momentum crypto -0.77 lagged BTC
Full scoreboard
#StrategyUniverseYearly return, in-sampleSharpe, in-sampleYearly return, out-of-sampleSharpe, out-of-sampleBenchmarkBenchmark yearly return, out-of-sample
#1ma_crossover(fast=50, slow=200)indexes10.4%0.6211.9%0.52SPY18.9%
#2ma_crossover(fast=50, slow=200)sectors6.6%0.458.3%0.40SPY18.9%
#3momentum(lookback=252, skip=21, top_n=3, positive only)sectors9.7%0.5020.2%1.00SPY18.9%
#4mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5)sectors2.3%0.247.2%0.84SPY18.9%
#5core_overlay(core=80% SPY, rest: no overlay (cash))sectors11.3%0.7116.0%0.93SPY18.9%
#6core_overlay(core=80% SPY, rest: mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5))sectors11.6%0.7116.6%0.95SPY18.9%
#7core_overlay(core=80% SPY, rest: mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5))SPY11.5%0.7016.8%0.96SPY18.9%
#8core_overlay(core=60% SPY, rest: no overlay (cash))sectors8.9%0.7113.1%0.93SPY18.9%
#9core_overlay(core=60% SPY, rest: mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5))sectors9.3%0.7014.2%0.98SPY18.9%
#10core_overlay(core=50% SPY, rest: no overlay (cash))sectors7.7%0.7111.7%0.93SPY18.9%
#11core_overlay(core=50% SPY, rest: mean_reversion(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5))sectors8.2%0.6913.1%1.00SPY18.9%
#12breakout(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)sp5002.1%0.1312.8%0.45SPY18.9%
#13momentum(lookback=252, skip=21, top_n=20, positive only, index-membership dated)sp50015.5%0.6224.5%0.67SPY18.9%
#14low_volatility(lookback=252, top_n=50, index-membership dated)sp50010.0%0.588.2%0.37SPY18.9%
#15mean_reversion_slots(rsi_period=2, entry_rsi=10, trend=200, exit_sma=5, max_positions=10, index-membership dated)sp50012.6%0.712.4%-0.03SPY18.9%
#16momentum(lookback=252, skip=21, top_n=20, positive only, index-membership dated, cash when SPY < SMA200)sp5004.3%0.2414.8%0.45SPY18.9%
#17momentum(lookback=252, skip=21, top_n=20, positive only, index-membership dated, cash when SPY < SMA200 (daily check))sp5008.3%0.4517.8%0.53SPY18.9%
#18trend(above SMA100)crypto18.2%0.53-0.2%0.04BTC/USD-12.0%
#19momentum(lookback=90, skip=0, top_n=2, positive only)crypto41.5%0.78-33.6%-0.77BTC/USD-12.0%