PAPERTRADER Updated Oct 21, 1:09am ETUsually updated in the evening unless the bots have other ideas.

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.

  • 19strategies tested
  • 5edged past their benchmark
  • 4of those, within noise

Live since Oct 19: Momentum +$978, Mean reversion +$233, SPY +$335 (1 trading days; too early to read). With 19 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 19
  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

Early days Day 1 of 20: until then, the standings are mostly noise.

  1. P1 Momentum Kill switch armed +$978+0.98% GapLeader Today+$978 Worst dip$0
  2. P2 SPYDoing nothing: $100,000 left in the S&P 500 index +$335+0.34% Gap−$642 Today+$335 Worst dip$0
  3. P3 Mean reversion Kill switch armed +$233+0.23% Gap−$745 Today+$233 Worst dip$0
1Momentum2Mean reversion3SPY START $0 +$978+$233+$335
Position on the track is profit or loss since the first orders. Behind the start line means losing money.
Best position todayXLK+$848Momentum
Profit and loss by dayMomentumMean reversionSPY
$0+$250+$500+$750+$1KOct 19Oct 20

Show as a table
DayMomentumMean reversionSPY
Oct 19$0$0$0
Oct 20+$978+$233+$335

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.

+$978+0.98% since Oct 19 through the Oct 20 close · 1 trading day · worst dip $0

Kill switch armed: stops trading after a 5% losing day

What it holds

HoldingSharesAvg costPriceP&LP&L %Today
XLV186$179.50$179.82+$60+0.18%+$60
XLK175$183.14$187.99+$848+2.65%+$848
XLE481$67.82$67.97+$70+0.21%+$70

Cash $1,939. As of the Oct 20 close.

Fills vs official open

On average 13.6 bps better than the official open across 4 fills, better than the 5 bps the backtest assumes. Paper fills are simulated, so this checks only part of real-world slippage.

DaySymbolSideQtyFillOpenbps vs open
Oct 20XLVbuy177$179.60$177.66+109.0
Oct 20XLKbuy175$183.14$184.27-61.1
Oct 20XLEbuy481$67.82$68.45-91.4
Oct 20XLVbuy9$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.

+$233+0.23% since Oct 19 through the Oct 20 close · 1 trading day · worst dip $0

Kill switch armed: stops trading after a 3% losing day

What it holds

HoldingSharesAvg costPriceP&LP&L %Today
BIL970$91.59$91.59$00.00%$0
XLK48$183.14$187.99+$233+2.65%+$233

Cash $2,367. As of the Oct 20 close.

Fills vs official open

On average 30.1 bps better than the official open across 2 fills, better than the 5 bps the backtest assumes. Paper fills are simulated, so this checks only part of real-world slippage.

DaySymbolSideQtyFillOpenbps vs open
Oct 20XLKbuy48$183.14$184.27-61.2
Oct 20BILbuy970$91.59$91.58+1.1

Strategy research

19 strategies tested. 5 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 (1999+) 0.59 lagged 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
  20. #20 Levered momentum sectors (1999+) 0.49 lagged SPY
  21. #21 Risk parity SPY TLT GLD DBC (1999+) 0.57 lagged SPY
  22. #22 Trend following SPY (1999+) 0.52 lagged SPY
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)sectors (1999+)7.3%0.4212.8%0.59SPY14.7%
#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%
#20levered_momentum(lookback=252, skip=21, top_n=3, positive only, vol target=20% over 63d, max 2x)sectors (1999+)8.2%0.4012.4%0.49SPY14.7%
#21risk_parity(inverse vol over 63d, vol target=10%, max 2x)SPY TLT GLD DBC (1999+)6.5%0.539.2%0.57SPY16.1%
#22trend(above SMA200, 2x)SPY (1999+)5.7%0.2913.3%0.52SPY14.7%