← stefan ruffinibandolier / live run
paper · liveas of 2026-07-15Jun 2021Jul 2026benchmark SPYλ 1 · mutation off
LIVEforward paper track · frozen 2026-05-30 · 30 sessionsbook +0.8% · SPY -0.6%

Twelve strategy sleeves, each with its own mandate and risk budget. A bandit moves the money toward whatever is earning it and benches the rest. The trade this cast makes: give up some raw return, take a drawdown 10 points shallower than SPY.

Return vs SPY
+21.2pp
▲ beating
median 113% vs 92%; 19/20 seeds beat SPY
Sharpe
1.27 / 0.84
▲ beating
median of 20 seeds; worst seed 1.04
Max drawdown
-14.5% / -24.5%
▲ beating
median of 20 seeds; worst seed -17.0%
> growth of $1

Against the index, over five years

Left of the mint line is a simulated backtest (backfill): the frozen rules replayed on 2021 to launch, no real exposure. Right of it is live forward paper trading from the freeze date: same rules, real daily prices, growing every weekday, no money down. The gold line is the median across 20 random seeds; the shaded band is where the middle 80% of seeds land; gray dashed is SPY.

Bandolier (median of 20)seed range (10-90th pct)SPYlive since 2026-05-30
> capital allocation

Where the money actually sat

Each band is a sleeve's share of the book at that rebalance, stacked from capital-preservation at the bottom to aggressive up top. The 2022 bear is the tell: the defensive sleeves (Drawdown Guard, Real Assets, Dividend Income, Quality Low-Vol) carried about 78% of the book through it. That is where the drawdown edge comes from.

Index Core(preservation)Drawdown Guard(preservation)Real Assets(defensive)Dividend Income(defensive)Quality Low-Vol(defensive)Trend Regime(balanced)Mean Reversion(balanced)Sector Rotation(balanced)Momentum(aggressive)
> the experiment · evolving population

The strategies breed, mutate, and get culled

The archived experiment: same engine, mutation cranked up. A new agent is born roughly every month: re-dial a winner's risk, sweep its parameters, or blend two independent signals firing on one name. 53 births over five years. Each ribbon is an agent at its risk level, thickening with its share of the book; the triangles are births, colored by operator. It is a great thing to watch the population fan out across the spectrum, then concentrate back into the survivors. It is also why mutation stays off in the live system. The honesty check below is the receipt.

> hover a stream to inspect an agent
53 birthsredialsweepblend
ALL-INAGGRESSIVEBALANCEDDEFENSIVEPRESERVATIONRISK ▲SPY Hold · preservation (risk 0.03)Insider Clusters @r0.05 · preservation (risk 0.05)Insider Clusters @r0.10 · preservation (risk 0.10)SMA Crossover @r0.13 · preservation (risk 0.13)Regime Defensive · preservation (risk 0.14)Momentum @r0.15 · preservation (risk 0.15)Mean Reversion @r0.15 · preservation (risk 0.15)Insider Clusters @r0.16 · preservation (risk 0.16)Momentum ~swept#23@r0.20 · preservation (risk 0.20)Momentum ~swept · preservation (risk 0.20)SMA Crossover @r0.28 · defensive (risk 0.28)Mean Reversion · defensive (risk 0.36)Insider Clusters @r0.40 · defensive (risk 0.40)Insider Clusters @r0.41 · defensive (risk 0.41)Mean Reversion @r0.41 · defensive (risk 0.41)SMA Crossover @r0.44 · defensive (risk 0.44)SMA Crossover · balanced (risk 0.46)SMA Crossover ~swept · balanced (risk 0.46)SMA Crossover ~swept · balanced (risk 0.46)SMA Crossover ~swept · balanced (risk 0.46)SMA Crossover ~swept · balanced (risk 0.46)SMA Crossover ~swept · balanced (risk 0.46)SMA Crossover ~swept · balanced (risk 0.46)SMA Crossover ~swept · balanced (risk 0.46)Blend · balanced (risk 0.50)Insider Clusters @r0.53 · balanced (risk 0.53)Insider Clusters · balanced (risk 0.56)Momentum ~swept#23@r0.58 · balanced (risk 0.58)Momentum @r0.69 · balanced (risk 0.69)SMA Crossover @r0.70 · balanced (risk 0.70)Insider Clusters @r0.72 · aggressive (risk 0.72)Momentum · aggressive (risk 0.74)Momentum ~swept · aggressive (risk 0.74)Insider Clusters @r0.86 · aggressive (risk 0.86)SMA Crossover @r0.90 · all-in (risk 0.90)SMA Crossover @r0.92 · all-in (risk 0.92)born: Insider Clusters @r0.05 (redial)born: Insider Clusters @r0.10 (redial)born: SMA Crossover @r0.13 (redial)born: Momentum @r0.15 (redial)born: Mean Reversion @r0.15 (redial)born: Insider Clusters @r0.16 (redial)born: Momentum ~swept#23@r0.20 (redial)born: Momentum ~swept (sweep)born: SMA Crossover @r0.28 (redial)born: Insider Clusters @r0.40 (redial)born: Insider Clusters @r0.41 (redial)born: Mean Reversion @r0.41 (redial)born: SMA Crossover @r0.44 (redial)born: SMA Crossover ~swept (sweep)born: SMA Crossover ~swept (sweep)born: SMA Crossover ~swept (sweep)born: SMA Crossover ~swept (sweep)born: SMA Crossover ~swept (sweep)born: SMA Crossover ~swept (sweep)born: SMA Crossover ~swept (sweep)born: Insider Clusters @r0.47 (redial)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Blend (blend)born: Insider Clusters @r0.53 (redial)born: Momentum ~swept#23@r0.58 (redial)born: Momentum @r0.69 (redial)born: SMA Crossover @r0.70 (redial)born: Insider Clusters @r0.72 (redial)born: Momentum ~swept (sweep)born: Momentum ~swept (sweep)born: Insider Clusters @r0.86 (redial)born: SMA Crossover @r0.90 (redial)born: Blend#6 @r0.91 (redial)born: SMA Crossover @r0.92 (redial)20222023202420252026
> the honesty check · does evolution survive out of sample?
vs SPYin-sample (5y)out of sample (18mo)
static
the shipped config: in and out of sample match
+25.8pp
+24.3pp
contained evolution
mutation stays off: generalizes, adds nothing
+1.3pp
+4.7pp

This gate is published on purpose. The shipped static cast does +25.8pp vs SPY in sample and +24.3pp on a held-out 18 months it never saw (Sharpe 1.89, 10 of 10 seeds). Nearly equal, and that match is the whole point: no holdout cliff, no in-sample mirage. Contained evolution, where offspring are locked inside the parent's mandate, generalizes fine but adds almost no excess, so mutation ships off. The old uncontained mutation is why the gate exists: children escaped their mandates, looked unbeatable in sample, and gave it all back out of sample. That escape hatch was the overfit engine. It stays welded shut.

> evolution log
  • >2021-06redialMomentum @r0.15← from Momentumpreservation
  • >2021-07sweepSMA Crossover ~swept← from SMA Crossover
  • >2021-08blendBlend← from Sma Crossover + regime Defensive
  • >2021-09redialSMA Crossover @r0.28← from SMA Crossoverdefensive
  • >2021-10sweepSMA Crossover ~swept← from SMA Crossover
  • >2021-11blendBlend← from Momentum + sma Crossover
  • >2021-12redialMomentum @r0.69← from Momentumbalanced
  • >2022-01sweepSMA Crossover ~swept← from SMA Crossover
  • >2022-02blendBlend← from Sma Crossover + insider Cluster
  • >2022-03redialSMA Crossover @r0.90← from SMA Crossoverall-in
  • >2022-04sweepSMA Crossover ~swept← from SMA Crossover
  • >2022-04blendBlend← from Sma Crossover + insider Cluster
  • >2022-05redialSMA Crossover @r0.13← from SMA Crossoverpreservation
  • >2022-06sweepSMA Crossover ~swept← from SMA Crossover
  • >2022-07blendBlend← from Sma Crossover + insider Cluster
  • >2022-08redialSMA Crossover @r0.44← from SMA Crossoverdefensive
  • >2022-09sweepSMA Crossover ~swept← from SMA Crossover
  • >2022-10blendBlend← from Sma Crossover + insider Cluster
  • >2022-11redialSMA Crossover @r0.70← from SMA Crossoverbalanced
  • >2022-12sweepSMA Crossover ~swept← from SMA Crossover
  • >2023-01blendBlend← from Sma Crossover + insider Cluster
  • >2023-02redialSMA Crossover @r0.92← from SMA Crossoverall-in
  • >2023-03sweepMomentum ~swept← from Momentum
  • >2023-03blendBlend← from Momentum ~swept#23 + insider_cluster
  • >2023-04redialMomentum ~swept#23@r0.20← from Momentum ~sweptpreservation
  • >2023-04retireSMA Crossover ~sweptretired
  • >2023-05sweepMomentum ~swept← from Momentum ~swept#23@r0.20preservation
  • >2023-05retireSMA Crossover @r0.92retired
  • >2023-06blendBlend← from Momentum ~swept#23 + insider_cluster
  • >2023-06retireMomentum @r0.69retired
  • >2023-07redialMomentum ~swept#23@r0.58← from Momentum ~sweptbalanced
  • >2023-07retireSMA Crossover ~sweptretired
  • >2023-09blendBlend← from Insider Cluster + blend
  • >2023-09retireMomentum ~sweptretired
  • >2023-10redialInsider Clusters @r0.86← from Insider Clustersaggressive
  • >2023-10retireMomentum ~swept#23@r0.58retired
  • >2023-12blendBlend← from Insider Cluster + blend
  • >2023-12retireMomentum ~sweptretired
  • >2024-01redialInsider Clusters @r0.53← from Insider Clustersbalanced
  • >2024-01retireMomentum ~swept#23@r0.20retired
  • >2024-03blendBlend← from Insider Cluster + blend
  • >2024-03retireSMA Crossover ~sweptretired
  • >2024-03redialInsider Clusters @r0.05← from Insider Clusterspreservation
  • >2024-03retireSMA Crossover @r0.13retired
  • >2024-05blendBlend← from Insider Cluster + blend
  • >2024-05retireSMA Crossover ~sweptretired
  • >2024-06redialInsider Clusters @r0.16← from Insider Clusterspreservation
  • >2024-06retireSMA Crossover ~sweptretired
  • >2024-08blendBlend← from Insider Cluster + blend
  • >2024-08retireMomentum @r0.15retired
  • >2024-09redialMean Reversion @r0.15← from Mean Reversionpreservation
  • >2024-09retireSMA Crossover ~sweptretired
  • >2024-11blendBlend← from Insider Cluster + blend
  • >2024-11retireBlendretired
  • >2024-12redialInsider Clusters @r0.40← from Insider Clustersdefensive
  • >2024-12retireSMA Crossover ~sweptretired
  • >2025-01blendBlend← from Insider Cluster + blend
  • >2025-01retireMean Reversion @r0.15retired
  • >2025-02redialInsider Clusters @r0.10← from Insider Clusterspreservation
  • >2025-02retireSMA Crossover @r0.90retired
  • >2025-04blendBlend← from Insider Cluster + blend
  • >2025-04retireSMA Crossover @r0.70retired
  • >2025-05redialInsider Clusters @r0.72← from Insider Clustersaggressive
  • >2025-05retireSMA Crossover @r0.44retired
  • >2025-07blendBlend← from Insider Cluster + blend
  • >2025-07retireSMA Crossover @r0.28retired
  • >2025-08redialInsider Clusters @r0.47← from Insider Clustersbalanced
  • >2025-08retireBlendretired
  • >2025-10blendBlend← from Mean Reversion + insider Cluster
  • >2025-10retireInsider Clusters @r0.47retired
  • >2025-11redialMean Reversion @r0.41← from Mean Reversiondefensive
  • >2025-11retireBlendretired
  • >2026-01blendBlend← from Insider Cluster + blend
  • >2026-01retireMean Reversion @r0.41retired
  • >2026-01redialInsider Clusters @r0.41← from Insider Clustersdefensive
  • >2026-01retireBlendretired
  • >2026-03blendBlend← from Blend#6 + momentum
  • >2026-03retireInsider Clusters @r0.86retired
  • >2026-04redialBlend#6 @r0.91← from Blendall-in
  • >2026-04retireInsider Clusters @r0.72retired
  • >2026-05sweepMomentum ~swept← from Momentum
  • >2026-05retireInsider Clusters @r0.53retired
> methodology · honest caveats

What this proves, and what it does not

> backfill vs live

Be clear which is which. Everything up to the freeze date is a backtest: the rules replayed on history, no real exposure. That is backfill. From the freeze date forward it is live paper trading, the same frozen rules on real daily prices, updated every weekday, no money at risk yet. The badge up top and the mint line on the chart mark the seam.

> how it was tested

Five years, 20 random seeds, long only, weekly rebalance, real transaction costs baked in. Twelve sleeves, each one a strategy plus a risk budget plus a mandate it cannot leave. A Thompson-sampling bandit moves capital toward whatever is earning on a risk-adjusted basis, with a hard drawdown circuit breaker underneath. Nine price-based sleeves make the live track; the three alt-data sleeves (Insider Flow, Activist Stakes, Merger Arb) are backtest-only for now.

> where it earns trust

Across 20 seeds, 20 of 20 beat SPY: median +25.8pp (110% vs 84%), Sharpe 1.29 vs the index 0.80, worst seed still 1.13. And the headline flip: max drawdown -14.5% vs SPY -24.5%, ten points shallower, worst seed -17.5%. The old build had more raw return and a drawdown worse than the index. I traded roughly 40 points of raw return to fix that. Worth it. On a held-out 18 months the config did +24.3pp at Sharpe 1.89, 10 of 10 seeds, the strongest walk-forward this project has recorded.

> the sub-period record

Sliced into twelve-month windows, the book beats SPY on raw excess in only 2 of 5. It lags in choppy mid-cycle bull years because the defensive sleeves refuse to chase. But it beats SPY on drawdown in 5 of 5. That is the trade in one line: give up some of the ride up, skip most of the ride down. Anyone quoting the headline should be quoting this too.

> the universe is not innocent

The 25 single names in the universe were hand-picked in 2026, knowing how things turned out. That is soft survivorship, and it flatters the stock-selection part of the results. Two things keep it honest: the measured edge comes from regime allocation, not picking, and SPY holds the same winners, so the benchmark drinks from the same well. Still, treat the raw stock alpha with suspicion. I do.

> the alt-data sleeves

With the alt-data sleeves on, the backtest gets better: median +44.7pp, Sharpe 1.31, 20 of 20. Insider Flow alone (insider buy clusters confirmed by activist 13D filings, five years of real EDGAR data) improves every risk-adjusted number: +42.6pp isolated, worst-seed Sharpe 1.22, drawdown -11.9%. It still rides the bench. Scraped filings revise, and until that pipeline is point-in-time clean it stays out of the live headline. The live track is the price-based core, the part I reproduce exactly.

> the tax question

Weekly rebalancing means almost every gain is short-term, taxed as ordinary income. Buy-and-hold SPY defers everything and eventually pays the long-term rate. Run it at the top federal bracket in a taxable account: the price-only book lands near +58% after tax over five years, the full cast near +66%, SPY held then sold near +64%. So after tax, taxable account, this roughly ties the index. What survives taxes is the drawdown insurance. What fixes the math: tax-advantaged accounts, a bigger validated edge, or at product scale an ETF wrapper. Once real money trades, the broker reports actual realized gains, so the live track will publish real tax drag instead of modeled guesses.

> what I am not claiming

This is a young live track, not a proven edge. Raw excess beats SPY in only 2 of 5 sub-windows, and the universe carries hindsight. Mutation stays off (checked three times now): contained evolution generalizes but adds no excess, and the uncontained version was an overfit machine. No margin, no options, no promises.