The chart appears after two evenings of results.
The bots
Waiting for the first orders to fill.
Kill switch armed: stops trading after a 5% losing day
No holdings yet.
Measured the evening after each order fills: what we paid versus the official opening price.
No fills measured yet.
Waiting for the first orders to fill.
Kill switch armed: stops trading after a 3% losing day
No holdings yet.
Measured the evening after each order fills: what we paid versus the official opening price.
No fills measured yet.
13 strategies tested. 5 beat SPY out of sample.
Every idea ever backtested is listed, including the 3 do-nothing baselines. Beating SPY here 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.
| # | Strategy | Universe | Yearly return, in-sample | Sharpe, in-sample | Yearly return, out-of-sample | Sharpe, out-of-sample | SPY yearly return, out-of-sample |
|---|---|---|---|---|---|---|---|
| #1 | ma_crossover(fast=50, slow=200) | indexes | 10.4% | 0.62 | 11.9% | 0.52 | 18.9% |
| #2 | ma_crossover(fast=50, slow=200) | sectors | 6.6% | 0.45 | 8.3% | 0.40 | 18.9% |
| #3 | momentum(lookback=252, skip=21, top_n=3, positive only) | sectors | 9.7% | 0.50 | 20.2% | 1.00 | 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 | 18.9% |
| #5 | core_overlay(core=80% SPY, rest: no overlay (cash)) | sectors | 11.3% | 0.71 | 16.0% | 0.93 | 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 | 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 | 18.9% |
| #8 | core_overlay(core=60% SPY, rest: no overlay (cash)) | sectors | 8.9% | 0.71 | 13.1% | 0.93 | 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 | 18.9% |
| #10 | core_overlay(core=50% SPY, rest: no overlay (cash)) | sectors | 7.7% | 0.71 | 11.7% | 0.93 | 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 | 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 | 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 | 18.9% |
| #14 | low_volatility(lookback=252, top_n=50, index-membership dated) | sp500 | 10.0% | 0.58 | 8.2% | 0.37 | 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 | 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 | 18.9% |