The system, and what it returns
A weekly momentum rotation that holds the ~20 strongest-trending large-cap names, sizes them by volatility, and stands aside when the index is below its 200-day trend. Over 21 years of survivorship-bias-free history (2005–2026), on split- and dividend-adjusted prices, here is the measured profile against the benchmark that matters for a long-only equity system — buying and holding the index:
- It compounded at 11.4%/yr on the Nasdaq-100 and 9.3%/yr on the S&P 500 ($100k → $1.01M and $669k), against buy-and-hold’s 15.3% (QQQ) and 10.9% (SPY). It captured most of the index’s return.
- It did so at roughly half the worst-case drawdown — −29.8% vs QQQ −53.4% on the Nasdaq-100, and −22.7% vs SPY −55.2% on the S&P 500 — with Sharpe equal to buy-and-hold on the Nasdaq-100 (0.77) and slightly above it on the S&P 500 (0.65 vs 0.64).
- The stock-picking beats a random portfolio. Against 200 random portfolios run through the identical rules, the momentum ranking lands at the 98th–99th percentile on return (a +3.5 pp/yr increment over the random median) on both universes.
- The return is shaped defensively. In every rolling 12-month window where the index fell more than 20%, the system returned more than buy-and-hold — by ~15 points (Nasdaq-100) to ~29 points (S&P 500). It gives back some of that edge in strong bull markets (§5).
- Who it is for: an investor who wants broad large-cap equity exposure with a materially shallower worst case. It earned near-index returns at half the drawdown over this window; a pure growth mandate that can tolerate a −55% drawdown still compounded faster in the index itself. The full numbers are below.
| S1 · Feasibility & signals | done |
| S2 · Entry quality vs random | done |
| S3 · Cadence & regime | done |
| S4 · Portfolio P&L vs buy & hold | done |
| S5 · Robustness | done |
| S6 · Publication | done |
| S7 · Promotion | planned |
| S8 · Maintenance | planned |
- The system
- Setup & data
- The system vs. buying the index
- A trade, drawn out (sample chart)
- The edge is in bear markets (rolling 12-month returns)
- Does the stock-picking beat random? (the monkey baseline)
- Sizing vs. selection (ablation)
- Metrics by lookback
- Sizing out-of-sample
- Exposure & holding period
- What this means for you
- Costs, slippage & cash
- Constraints
- Code, data & artifacts
1. The system
A weekly momentum rotation popularized by Andreas Clenow (Stocks on the Move, 2015; Trading Evolved, 2019). The idea: stay invested in the strongest-trending names of a large-cap index, rank them by a smoothed momentum measure, size by volatility, and stand aside when the index itself is below trend. This test implements the weekly variant of that recipe.
Selection
Filters
Regime gate
Sizing
Cadence
Exits
2. Setup & data
Both universes use point-in-time, survivorship-bias-free (SBF) index membership: each historical date resolves to the names that were index members on that date, including those later delisted, acquired, or removed. The full ever-member set is reconstructed for every date in the window.
Universe (index membership — partial list)
| Item | Nasdaq-100 | S&P 500 |
|---|---|---|
| SBF members loaded | 284 / 286 | 955 / 959 |
| Regime ETF (200-day gate) | QQQ | SPY |
| Window | 2005-01-03 → 2026-05-15 (21.4y, 5,376 trading days) | |
| Starting capital | $100,000 | |
3. The system vs. buying the index
Finding
Over 21 years the system captured most of the index’s return at roughly half the worst-case drawdown. Buy-and-hold compounded faster in absolute terms; the system matched or exceeded it on Sharpe and cut the maximum drawdown by 25–32 points. The benchmark below is $100k in the index ETF (QQQ / SPY), total return, over the identical window.
| Metric | Nasdaq-100 system | Buy & hold QQQ | S&P 500 system | Buy & hold SPY |
|---|---|---|---|---|
| CAGR | 11.43% | 15.34% | 9.31% | 10.88% |
| Max drawdown | −29.81% | −53.40% | −22.74% | −55.19% |
| Sharpe | 0.77 | 0.77 | 0.65 | 0.64 |
| Rolling 36m Calmar (median) | 0.64 | 0.90 | 0.48 | 0.62 |
| Final equity ($100k start) | $1,009,709 | $2,109,756 | $669,487 | $908,276 |
Buy-and-hold delivered the higher terminal wealth — about 2.1× (Nasdaq-100) and 1.4× (S&P 500) the system’s — through deeper declines. The system’s maximum drawdown was 24–32 points shallower, its Sharpe matched buy-and-hold on the Nasdaq-100 and edged it on the S&P 500, and its worst 12-month stretch was −26.1% / −15.8% against buy-and-hold’s −48.0% / −47.4%.
The system earns 0% on idle cash during regime-off periods (no money-market yield modeled). It is invested ~85–86% of the time on average (§10), so the cash drag is small; a cash yield would lift its return and Sharpe modestly. See constraints.
System detail, side by side
| Metric | Nasdaq-100 | S&P 500 |
|---|---|---|
| N trades | 1,356 | 1,996 |
| Win rate | 46.9% | 48.6% |
| Profit factor | 1.42 | 1.23 |
| CAGR | 11.43% | 9.31% |
| Max drawdown | −29.81% | −22.74% |
| Sharpe | 0.77 | 0.65 |
| Rolling 36m Calmar (median) | 0.64 | 0.48 |
| Return / MaxDD (full-period Calmar) | 0.38 | 0.41 |
| Final equity | $1,009,709 | $669,487 |
| Avg hold (trading days) | 47 | 34 |
| Avg positions | 14.1 | 14.7 |
Year by year — monthly returns
System monthly returns on each universe — green positive, red negative, color intensity scaled to size. Yr% is the system’s full-year return; the right-hand column is buy-and-hold the index for context. 2026 is year-to-date through May.
Nasdaq-100 system — Yr% is the system; QQQ is buy & hold for context.
View the full monthly-returns grid (2005–2026)
| Year | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Yr% | QQQ |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2005 | -2.5 | +0.1 | +2.3 | -3.6 | +3.3 | +0.4 | +3.5 | -0.9 | +3.5 | +1.9 | +7.9 | -1.2 | +15.2 | +2.6 |
| 2006 | +7.2 | +0.6 | +8.9 | +0.4 | -4.8 | -2.1 | -1.7 | -0.5 | +0.9 | +4.1 | +3.4 | -1.4 | +15.1 | +4.8 |
| 2007 | +3.1 | -3.7 | -0.2 | +3.4 | +1.4 | +1.9 | -1.5 | +1.6 | +5.1 | +1.6 | -3.6 | +1.7 | +10.9 | +18.8 |
| 2008 | -6.8 | -1.4 | -0.1 | +0.6 | +1.9 | -9.1 | -1.9 | -3.8 | -1.8 | -2.8 | +0.0 | +0.0 | -22.9 | -40.8 |
| 2009 | +0.0 | +0.0 | +0.0 | +0.0 | +1.7 | +0.8 | +7.4 | +4.0 | +5.5 | -5.8 | +5.4 | +5.7 | +26.7 | +48.3 |
| 2010 | -7.4 | +5.6 | +5.5 | +0.4 | -5.5 | -4.8 | +4.1 | -1.9 | +8.7 | +3.4 | -2.2 | +3.2 | +7.8 | +18.4 |
| 2011 | -1.8 | +4.7 | -0.4 | +3.3 | -1.9 | -0.9 | -2.9 | -7.2 | -1.8 | +2.7 | -2.9 | +0.4 | -8.9 | +1.9 |
| 2012 | +2.6 | +2.1 | +2.9 | +0.2 | -5.2 | +3.9 | -1.8 | +0.8 | +3.4 | -0.2 | +0.2 | +3.3 | +12.5 | +15.9 |
| 2013 | +5.0 | +3.1 | +6.9 | +4.3 | +3.1 | -0.6 | +2.9 | -4.5 | +6.4 | +1.2 | +3.8 | +5.3 | +42.9 | +32.4 |
| 2014 | +1.1 | +5.5 | -4.5 | -3.6 | +3.8 | +2.9 | -2.6 | +5.9 | -1.7 | +1.1 | +5.5 | +1.6 | +15.1 | +20.1 |
| 2015 | +0.4 | +7.4 | +0.2 | -1.7 | +4.3 | -2.2 | +4.9 | -7.3 | -0.1 | +2.1 | +0.5 | -0.9 | +7.2 | +9.8 |
| 2016 | -8.7 | -2.4 | +0.6 | -1.4 | +6.0 | -1.1 | +5.3 | +1.7 | +4.4 | -4.3 | +5.5 | +1.0 | +5.9 | +9.4 |
| 2017 | +10.0 | +1.7 | +3.0 | +2.9 | +5.8 | -2.5 | +4.8 | -0.8 | -1.1 | +3.3 | +1.1 | +1.4 | +33.3 | +31.5 |
| 2018 | +6.6 | -3.2 | -3.1 | -1.4 | +5.8 | -0.5 | +0.9 | +5.9 | -1.1 | -6.9 | +1.7 | -3.5 | +0.1 | -1.8 |
| 2019 | +2.5 | +2.5 | +2.1 | +2.6 | -8.6 | +5.4 | +2.1 | +0.7 | -3.6 | +4.0 | +1.9 | +6.6 | +18.7 | +38.4 |
| 2020 | -1.5 | -1.0 | -7.2 | +0.6 | +5.6 | +6.0 | +7.1 | +6.0 | -2.4 | -0.8 | +9.2 | +4.2 | +27.7 | +46.2 |
| 2021 | +0.5 | +5.2 | -0.7 | +1.8 | -0.1 | +0.2 | +5.9 | +3.0 | -4.5 | +9.7 | +3.1 | +1.6 | +28.0 | +29.2 |
| 2022 | -9.6 | -2.6 | +0.5 | -0.8 | -2.8 | -1.8 | +0.0 | +0.0 | +0.0 | +0.0 | +0.0 | +0.0 | -16.2 | -33.2 |
| 2023 | +0.0 | -0.5 | +4.0 | -3.8 | +6.7 | +3.2 | +0.7 | -3.4 | -2.9 | -2.5 | +7.0 | +1.9 | +10.3 | +55.9 |
| 2024 | +0.2 | +3.2 | -0.0 | -3.5 | +4.4 | +0.5 | -3.7 | +0.4 | -0.2 | +1.7 | +3.6 | -1.6 | +4.9 | +27.7 |
| 2025 | +2.7 | -3.3 | -4.7 | -1.8 | +0.5 | +1.6 | +0.6 | -2.0 | +7.2 | +7.0 | +1.8 | +1.3 | +10.7 | +21.0 |
| 2026* | +8.4 | +2.6 | -3.8 | +10.9 | +3.3 | · | · | · | · | · | · | · | +22.5 | +15.8 |
S&P 500 system — Yr% is the system; SPY is buy & hold for context.
View the full monthly-returns grid (2005–2026)
| Year | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Yr% | SPY |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2005 | +1.3 | +6.9 | -3.4 | -1.5 | +2.2 | +3.8 | +5.0 | -2.1 | +3.8 | -6.3 | +4.3 | +1.0 | +15.2 | +5.3 |
| 2006 | +10.0 | -0.7 | +5.6 | +1.6 | -6.0 | -4.5 | -2.4 | +1.8 | -1.6 | +0.4 | +1.3 | +2.4 | +7.1 | +13.8 |
| 2007 | +2.0 | +1.1 | +0.7 | +2.7 | +5.2 | -1.4 | +2.4 | +2.2 | +5.5 | +1.1 | -7.0 | +3.0 | +18.4 | +5.3 |
| 2008 | -7.4 | +1.6 | -0.4 | +1.2 | -0.2 | -1.2 | -2.6 | -0.2 | +0.0 | +0.0 | +0.0 | +0.0 | -9.2 | -36.2 |
| 2009 | +0.0 | +0.0 | +0.0 | +0.0 | +0.0 | -3.9 | +7.0 | +2.8 | +3.2 | -4.1 | +3.5 | +4.2 | +12.9 | +22.7 |
| 2010 | -6.5 | +5.0 | +9.2 | +4.7 | -4.3 | -6.9 | -0.2 | -3.2 | +2.9 | +4.1 | +1.4 | +5.2 | +10.4 | +13.1 |
| 2011 | +0.8 | +7.0 | +0.8 | -1.5 | -2.8 | -2.6 | -1.5 | -4.7 | -0.9 | -0.1 | -1.1 | -0.9 | -7.7 | +0.9 |
| 2012 | +5.1 | +3.2 | +3.1 | -2.0 | -6.0 | +1.4 | -0.9 | +1.1 | +4.5 | +1.2 | +2.5 | +2.9 | +16.8 | +14.2 |
| 2013 | +6.1 | +1.8 | +7.9 | -5.3 | +2.0 | -0.4 | +5.6 | -3.6 | +5.1 | +5.6 | +0.8 | +0.1 | +28.0 | +29.0 |
| 2014 | +0.6 | +4.5 | -2.2 | -2.3 | +0.0 | +4.3 | -2.6 | +5.8 | -2.8 | +3.6 | +5.3 | +0.1 | +14.7 | +14.6 |
| 2015 | -0.9 | +4.2 | +0.7 | -5.1 | +0.3 | -1.5 | +2.3 | -6.6 | +0.2 | +0.7 | +1.8 | +0.6 | -3.7 | +1.3 |
| 2016 | -7.5 | +0.6 | +2.3 | +0.2 | -1.5 | +0.9 | +3.9 | +1.2 | +2.7 | -3.1 | +13.7 | +4.4 | +17.7 | +13.6 |
| 2017 | +1.1 | +1.6 | +0.9 | +0.8 | +4.0 | -2.0 | +3.0 | +0.9 | +0.8 | +4.9 | +1.4 | +1.5 | +20.2 | +20.8 |
| 2018 | +5.3 | -4.2 | -3.1 | -1.8 | +3.1 | +1.4 | -2.4 | +6.6 | +0.4 | -7.2 | +0.0 | -3.6 | -6.1 | -5.2 |
| 2019 | +1.0 | +1.3 | +4.4 | -0.3 | -5.8 | +5.4 | +2.0 | +0.2 | -3.8 | +1.9 | +1.2 | +6.2 | +14.0 | +31.1 |
| 2020 | -2.5 | -5.5 | -9.3 | +0.0 | +2.9 | +3.0 | +6.4 | +6.4 | +0.3 | +0.4 | +8.8 | +4.1 | +14.4 | +17.2 |
| 2021 | +1.4 | +10.9 | +0.2 | +1.3 | +2.7 | -3.1 | +3.7 | +5.1 | -5.1 | +6.9 | -4.9 | +2.1 | +22.0 | +30.5 |
| 2022 | -6.8 | +1.3 | +3.1 | -1.7 | +4.9 | -4.1 | -0.4 | -5.2 | -2.2 | +1.7 | -0.1 | -0.3 | -10.0 | -18.6 |
| 2023 | +2.3 | -2.0 | +1.9 | -2.0 | +2.1 | +4.9 | +0.2 | -3.4 | -5.2 | -2.2 | +5.9 | +0.0 | +1.9 | +26.7 |
| 2024 | +2.3 | +3.4 | +1.3 | -7.0 | +4.5 | -4.4 | -3.2 | +2.6 | +0.4 | -0.4 | +8.1 | -4.8 | +1.5 | +25.6 |
| 2025 | +6.2 | -4.5 | -4.8 | -4.7 | +3.0 | +3.1 | +5.4 | -2.8 | +7.5 | +4.4 | +2.0 | +1.8 | +16.8 | +18.0 |
| 2026* | +9.8 | +2.9 | -6.0 | +6.7 | +1.9 | · | · | · | · | · | · | · | +15.5 | +8.5 |
4. A trade, drawn out
One symbol from the Nasdaq-100 run, with the system’s levels and decisions on real (split-adjusted) price: the 100-day SMA the trend filter uses, entry marks (green) where the name entered the top 20 above trend, and exit marks colored by the reason it left — dropping out of the rank, falling below the SMA, or a real >15% gap. Connecting lines trace each holding period.
Annotated sample — AVGO (Nasdaq-100)
5. The edge is in bear markets — rolling 12-month returns by regime
Finding
Sorting every rolling 12-month window by how the index itself did, the system returned more than buy-and-hold in 100% of the windows where the index fell more than 20% — by ~15 points on the Nasdaq-100 and ~29 points on the S&P 500, where it held its loss to single digits (−5.6%) through years the index lost a third of its value. In strong bull markets it captured most of the index’s gain. This is a convex, defensive profile: the edge is largest precisely when the index is losing.
Nasdaq-100
| Index 12m return | Windows | Buy & hold avg | System avg | Edge (sys−B&H) | System win-rate |
|---|---|---|---|---|---|
| < −20% (deep bear) | 295 | −31.3% | −15.8% | +15.4 pp | 100% |
| −20 to −10% | 163 | −14.7% | −4.3% | +10.4 pp | 88% |
| −10 to 0% | 257 | −4.0% | −0.5% | +3.5 pp | 53% |
| 0 to 10% | 932 | +5.3% | +4.1% | −1.1 pp | 34% |
| 10 to 20% | 1,028 | +15.2% | +10.7% | −4.6 pp | 29% |
| 20 to 30% | 1,235 | +25.0% | +16.7% | −8.3 pp | 22% |
| > 30% (strong bull) | 1,214 | +40.7% | +24.8% | −15.9 pp | 14% |
S&P 500
| Index 12m return | Windows | Buy & hold avg | System avg | Edge (sys−B&H) | System win-rate |
|---|---|---|---|---|---|
| < −20% (deep bear) | 217 | −34.7% | −5.6% | +29.0 pp | 100% |
| −20 to −10% | 212 | −14.4% | −5.5% | +9.0 pp | 98% |
| −10 to 0% | 417 | −4.8% | −2.9% | +1.8 pp | 58% |
| 0 to 10% | 1,003 | +5.6% | +0.7% | −4.9 pp | 22% |
| 10 to 20% | 1,882 | +15.3% | +12.0% | −3.3 pp | 33% |
| 20 to 30% | 955 | +24.2% | +15.9% | −8.3 pp | 25% |
| > 30% (strong bull) | 438 | +38.5% | +28.9% | −9.7 pp | 40% |
The worst 12-month stretch was roughly half as deep for the system — Nasdaq-100 −26.1% vs buy-and-hold −48.0%; S&P 500 −15.8% vs −47.4%.
Rolling 12-month windows overlap (they share days), so the counts measure exposure, not independent trials; read the buckets as a conditional profile, not a significance test. Buckets are cut on the index’s own trailing 12-month total return.
6. Does the stock-picking beat random? (the monkey baseline)
The monkey baseline is a random-entry control — the proverbial monkey throwing darts to pick names — run through the system’s exact rules (regime gate, filters, volatility sizing, weekly cadence, exits), with only the slope×R² ranking replaced by a random pick from the same eligible names. 200 monkey portfolios per universe form the control, and the ranking’s value is where the real system lands in that distribution. What is a monkey baseline? →
Finding
The momentum ranking beats the random portfolio on return: it lands at the 98th (Nasdaq-100) and 99th (S&P 500) percentile of the 200-monkey CAGR distribution, a +3.5 pp/yr increment over the random median. On risk-adjusted measures it sits above the monkey median on the Nasdaq-100 (Sharpe p90, Calmar p99.5) and near the median on the S&P 500 (Sharpe p50, Calmar p58). The deeper drawdown the ranking carries (MaxDD p5–p13.5, i.e. deeper than ~87–95% of random books) is the cost: momentum concentrates into names that trend together and fall together.
Evidence
| Universe | Baseline | CAGR pctile | Skill excess | Sharpe pctile | Calmar pctile | MaxDD pctile |
|---|---|---|---|---|---|---|
| Nasdaq-100 | gated | p98.5 | +3.45 pp/yr | p90.0 | p99.5 | p13.5 (deeper) |
| Nasdaq-100 | un-gated | p97.5 | +2.58 pp/yr | p90.0 | p98.5 | p68.5 |
| S&P 500 | gated | p99.0 | +3.50 pp/yr | p50.5 | p58.0 | p5.0 (deeper) |
| S&P 500 | un-gated | p99.5 | +4.30 pp/yr | p85.5 | p75.0 | p77.0 |
How it’s measured
Each universe is run two ways: gated (regime filter on — isolates the ranking against an otherwise-identical random book) and un-gated (always invested — the whole system against an always-invested random book). A metric’s percentile is the fraction of the 200 monkeys below the real value; for MaxDD a low percentile means a deeper-than-typical drawdown. “Skill excess” is the real CAGR minus the monkey-median CAGR.
7. Sizing vs. selection (ablation)
Finding
Holding the selection fixed and swapping the volatility sizing for equal weight lifts the return and deepens the drawdown on both universes. The volatility sizing trades return for a shallower drawdown: it down-weights the high-volatility names, which are often the momentum winners. Under both weightings the ranked book’s drawdown is a low-percentile outlier, so the deep drawdown follows the selection (concentrating into names that fall together), not the sizing.
Evidence
Real system, both weightings:
| Universe / weighting | CAGR | MaxDD | Sharpe | Calmar36 |
|---|---|---|---|---|
| Nasdaq-100 — ATR | +11.43% | −29.81% | 0.77 | 0.64 |
| Nasdaq-100 — equal | +12.07% | −31.99% | 0.75 | 0.63 |
| S&P 500 — ATR | +9.31% | −22.74% | 0.65 | 0.48 |
| S&P 500 — equal | +11.04% | −30.43% | 0.67 | 0.48 |
Real percentile within the matching monkey distribution (gated):
| Universe | Weighting | CAGR | Sharpe | Calmar36 | MaxDD |
|---|---|---|---|---|---|
| Nasdaq-100 | ATR | p98.5 | p90.0 | p99.5 | p13.5 |
| Nasdaq-100 | equal | p99.5 | p82.0 | p100.0 | p8.0 |
| S&P 500 | ATR | p99.0 | p50.5 | p58.0 | p5.0 |
| S&P 500 | equal | p100.0 | p52.0 | p49.5 | p0.0 |
How it’s measured
An ablation: a 2×2 of ranking {real, random} × weighting {ATR inverse-volatility, equal (1/20 of equity per name)}, regime gate on throughout, 200 monkeys each. Comparing the real book to its matching monkey at each weighting isolates whether the drawdown follows the sizing or the selection.
8. Metrics by lookback
The same trade-level and risk-adjusted metrics over trailing 12 / 24 / 36 months and the full period, to show whether the profile is steady across lookbacks or carried by one window. Trade metrics are from the trade list; Sharpe and Calmar from the daily equity curve. 1R = the 3×ATR(14) risk box on the entry day (the Edge Lab Stage-2 risk unit); per-trade R is winsorized at ±10R.
Nasdaq-100
| Window | Trades | Win rate | Avg win (R) | Avg loss (R) | Expectancy (R) | Sharpe | Calmar |
|---|---|---|---|---|---|---|---|
| Trailing 12m | 122 | 67.2% | +3.99 | −0.77 | +2.43 | 1.64 | 3.40 |
| Trailing 24m | 239 | 50.0% | +3.07 | −0.86 | +1.10 | 0.93 | 1.28 |
| Trailing 36m | 356 | 50.0% | +2.41 | −0.86 | +0.78 | 0.94 | 1.20 |
| Full (21y) | 1,356 | 46.9% | +1.48 | −0.97 | +0.18 | 0.77 | 0.38 |
S&P 500
| Window | Trades | Win rate | Avg win (R) | Avg loss (R) | Expectancy (R) | Sharpe | Calmar |
|---|---|---|---|---|---|---|---|
| Trailing 12m | — | 54.8% | +1.90 | −0.77 | +0.69 | 1.95 | 4.94 |
| Trailing 24m | — | 46.4% | +1.65 | −0.95 | +0.26 | 0.85 | 0.84 |
| Trailing 36m | — | 44.6% | +1.54 | −0.89 | +0.20 | 0.75 | 0.67 |
| Full (21y) | 1,996 | 48.6% | +1.24 | −0.83 | +0.18 | 0.65 | 0.41 |
The trailing-12m figures reflect the strong 2025–2026 momentum tape and are not representative of the full-period average; the full row is the long-run number.
9. Sizing out-of-sample
Finding
The position-sizing fraction is itself a fitted choice, so it gets its own out-of-sample test, on the same 2021 pivot as the ruleset. Fitting the platform Bandy safe-f (the drawdown-constrained fraction, −20% target) on the pre-2021 trades and re-fitting on the post-2021 trades, the fraction is stable across the pivot and its drawdown-95 stays within the −20% target out-of-sample — the in-sample sizing is not overfit.
| Universe | Window | safe-f | per slot (of 20) | CAR25 | DD-95 at safe-f |
|---|---|---|---|---|---|
| Nasdaq-100 | sizing in-sample (≤2020) | 1.75× | 8.8% | +8.5% | −19.9% |
| Nasdaq-100 | sizing out-of-sample (2021+) | 1.75× | 8.8% | +20.0% | −19.7% |
| S&P 500 | sizing in-sample (≤2020) | 1.75× | 8.8% | +8.5% | −17.8% |
| S&P 500 | sizing out-of-sample (2021+) | 1.25× | 6.3% | +15.7% | −16.6% |
safe-f is the portfolio-aware Bandy fraction on the per-trade return stream, sized as safe-f ÷ 20 per slot (the system holds up to 20 concurrent names). A fraction above 1.0 indicates the drawdown profile would permit modest leverage at the −20% target; the system as tested is un-levered. CAR25 is the 25th-percentile annualized return at the fitted fraction and excludes cash interest.
10. Exposure & holding period
The book holds a position on essentially every trading day (time in market ≈ 100%), so its exposure-adjusted return equals its CAGR — there is no material cash drag to correct for, unlike a part-time strategy. Within that, average dollar deployment is ~86% (Nasdaq-100) and ~85% (S&P 500), cut to ~38% in 2008 and ~50% in 2022 as names fail their trend filters and the regime gate blocks re-entry.
| Nasdaq-100 | S&P 500 | Buy & hold | |
|---|---|---|---|
| Time in market (days holding ≥1 position) | ~100% | ~100% | 100% |
| Average dollar deployment | 86.3% | 85.0% | 100% |
| Dollar deployment, 2008 | 38% | 37% | 100% |
| Dollar deployment, 2022 | 52% | 49% | 100% |
| Average holding period (trading days) | 47 (median 38) | 34 (median 29) | — |
| CAGR | 11.43% | 9.31% | 15.34% / 10.88% |
| Exposure-adjusted return | 11.4% | 9.3% | = CAGR |
Recent trade blotter — Nasdaq-100, most recent closed positions
| Symbol | Entry | Exit | Entry $ | Exit $ | Profit % | Profit $ | Equity at exit | Exit reason |
|---|---|---|---|---|---|---|---|---|
| INTC | 2026-04-21 | 2026-05-05 | 66.26 | 108.15 | +63.2% | $18,725 | $996,784 | rank_drop |
| ASML | 2025-11-11 | 2026-05-12 | 1022.42 | 1520.94 | +48.8% | $13,460 | $1,009,151 | rank_drop |
| MU | 2025-08-05 | 2026-05-15 | 109.06 | 724.66 | +564.5% | $20,930 | $1,009,709 | eod_close |
| LRCX | 2025-09-02 | 2026-05-15 | 97.03 | 284.72 | +193.4% | $21,772 | $1,009,709 | eod_close |
| KLAC | 2025-10-14 | 2026-05-15 | 1025.71 | 1804.32 | +75.9% | $14,015 | $1,009,709 | eod_close |
| AMAT | 2025-11-18 | 2026-05-15 | 225.12 | 436.62 | +93.9% | $16,497 | $1,009,709 | eod_close |
| WDC | 2025-12-23 | 2026-05-15 | 178.25 | 482.02 | +170.4% | $16,404 | $1,009,709 | eod_close |
| STX | 2025-12-23 | 2026-05-15 | 282.80 | 795.47 | +181.3% | $19,481 | $1,009,709 | eod_close |
| ROST | 2026-01-06 | 2026-05-15 | 187.53 | 212.75 | +13.4% | $8,348 | $1,009,709 | eod_close |
| ADI | 2026-02-03 | 2026-05-15 | 311.29 | 417.49 | +34.1% | $16,673 | $1,009,709 | eod_close |
| ODFL | 2026-02-17 | 2026-05-15 | 193.32 | 203.12 | +5.1% | $1,842 | $1,009,709 | eod_close |
| BKR | 2026-03-10 | 2026-05-15 | 59.34 | 64.12 | +8.1% | $3,676 | $1,009,709 | eod_close |
| FANG | 2026-04-14 | 2026-05-15 | 186.51 | 203.56 | +9.1% | $3,478 | $1,009,709 | eod_close |
| LIN | 2026-04-14 | 2026-05-15 | 499.65 | 506.11 | +1.3% | $872 | $1,009,709 | eod_close |
| ARM | 2026-05-05 | 2026-05-15 | 208.84 | 209.16 | +0.2% | $36 | $1,009,709 | eod_close |
| MRVL | 2026-05-12 | 2026-05-15 | 164.50 | 176.89 | +7.5% | $2,106 | $1,009,709 | eod_close |
11. What this means for you
| Question | Answer from 21 years of data |
|---|---|
| Does it beat buying the index? | It captured most of the return (11.4% vs 15.3% Nasdaq-100; 9.3% vs 10.9% S&P 500) at half the drawdown, with equal-or-better Sharpe. |
| Does it reduce risk? | Yes — worst-case drawdown 24–32 points shallower; worst 12-month stretch roughly half as deep. |
| When does it help most? | In bear markets — it beat buy-and-hold in 100% of 12-month windows where the index fell >20%, by 15–29 points. |
| How is it invested? | Holding something on ~100% of days; ~85–86% of capital on average, cut to ~38–50% in 2008 and 2022. |
| Does the stock-picking add value? | Yes — the ranking lands at the 98th–99th percentile vs random selection (+3.5 pp/yr), carrying a deeper drawdown. |
| What kind of tool is it? | A defensive, convex large-cap equity allocation — near-index return at materially lower drawdown. |
For an investor who wants large-cap equity exposure with a shallower worst case, the measured profile is near-index return at half the drawdown, with the ranking and the regime gate both contributing. A pure growth mandate that can tolerate a −55% index drawdown compounded faster in the index itself over this window. The natural next steps for the system:
- A faster or layered regime filter (vol-target, 50/200-day crossover, or a portfolio-level drawdown brake) — the drawdown reduction is a measured strength worth sharpening.
- A cash yield on idle cash during regime-off periods, currently earning 0%.
- A lookback × cadence sweep {60, 90, 125, 200} × {weekly, monthly}, and a mid-cap universe where within-index momentum has historically been stronger.
12. Costs, slippage & cash
Finding. Commissions and slippage are both small for this system — it trades a handful of liquid large caps at modest turnover — and the book is near-fully invested, so there is little idle cash to account for. The numbers below sit on top of the Tuesday-close fill model (§1).
Commissions — modeled, negligible
We modeled Interactive Brokers Pro (tiered) US-stock pricing — $0.0035/share, a $0.35 order minimum, a 1%-of-trade cap, plus the SEC Section 31 fee and FINRA TAF on sells — applied to every round trip (1,356 on the Nasdaq-100, 1,996 on the S&P 500) at three account sizes:
| Account | Nasdaq-100 (CAGR 11.43%) | S&P 500 (CAGR 9.31%) |
|---|---|---|
| $100,000 | ~$150/yr · ~15 bps/yr → 11.28% | ~$210/yr · ~21 bps/yr → 9.10% |
| $500,000 | ~$700/yr · ~14 bps/yr → 11.29% | ~$980/yr · ~20 bps/yr → 9.11% |
| $1,000,000 | ~$1,390/yr · ~14 bps/yr → 11.29% | ~$1,950/yr · ~20 bps/yr → 9.11% |
High-priced large caps make IB’s per-share fee a fraction of a basis point per order; the $0.35 minimum only nicks the $100K book, and the S&P 500 variant costs a touch more because it trades more often. We modelled IBKR Pro commissions; they lower CAGR by under ~21 bps/yr at every size — covered, and immaterial.
Slippage — modest; the system is tolerant
The book turns over ~4.5× (Nasdaq-100) to ~6.7× (S&P 500) a year, in names whose daily volume dwarfs any position at these sizes, so market impact is immaterial and the cost is spread-crossing. Sensitivity:
| Slippage / side | Round trip | Nasdaq-100 → CAGR | S&P 500 → CAGR |
|---|---|---|---|
| 0 bps | 0 bps | 11.43% | 9.31% |
| 2.5 bps | 5 bps | −23 bps → ~11.20% | −33 bps → ~8.98% |
| 5 bps | 10 bps | −45 bps → ~10.98% | −67 bps → ~8.64% |
| 10 bps | 20 bps | −91 bps → ~10.52% | −134 bps → ~7.97% |
Even at a pessimistic 10 bps/side the system keeps the bulk of its return (~0.9–1.3 pp/yr of drag). One caveat specific to this recipe: the test enters a position and holds it to exit; a literal weekly rebalancing of position weights (the canonical Clenow method) adds many small resize fills, which would raise the slippage line above. The figures here bound the enter-and-hold implementation as published.
Cash — add your own rate
The book is near-fully invested (~85% of capital on average, cut to ~38–50% only in the worst regime-off stretches), so its exposure-adjusted return equals its CAGR (§10) and there is little cash drag. The idle balance during regime-off periods is modeled at 0%; we do not credit a historical cash yield. For a complete picture, add the true cash return you would earn on the idle balance at your own rate over the period — a modest addition here given the high average deployment, larger in the de-risked windows.
13. Constraints
- The simulation fills at the Tuesday close; the recipe intends the next morning’s open. Not corrected.
- Costs, slippage and cash are modeled in §12. Commissions and slippage are both small (the system is liquid and low-turnover); idle cash during regime-off periods is modeled at 0%, which the reader supplies at their own rate.
- Sharpe computed from daily equity returns, risk-free = 0, 252-day annualization.
- Single point estimate at the recipe’s stated parameters — no parameter sweep.
- Prices are split- and dividend-adjusted (ratio reconstruction from adjusted close); a real overnight gap > 15% still triggers the gap filter, a stock split does not.
14. Code, data & artifacts
Everything needed to read or reproduce the result. The data loader and the survivorship-bias-free dataset are internal to the research platform and not redistributed here; the engine and analysis code below are complete.
| run_date | 2026-06-06 |
| data_as_of | 2026-05-15 (last bar) |
| test window | 2005-01-03 → 2026-05-15; OOS pivot 2021-01-01 (ruleset & sizing) |
| universe | survivorship-free point-in-time membership, resolved per trading date (Nasdaq-100 ~286 ever-members; S&P 500 ~959) |
| prices | EOD, split- & dividend-adjusted (ratio reconstruction from adjusted close) |
| engine | prototype.py (weekly rotation); monkey + ablation at K=200; refinements.py (R2/R5/R6/R8/R10) |
| rerun mode | Re-fit — prices corrected to split-adjusted |
| source | Andreas Clenow, Trading Evolved (2019) / Stocks on the Move (2015) |
Code
- prototype.py engine: data prep (adjusted), weekly rotation, ATR/equal sizing, regime gate
- monkey_baseline.py K=200 in-harness random-portfolio baseline (gated + un-gated)
- ablation_weight.py 2×2 ranking × weighting ablation
- refinements.py sample chart, blotter, metrics-by-lookback, sizing OOS, exposure
Data (CSV)
- Nasdaq-100 equity curve daily equity, positions, cash
- S&P 500 equity curve daily equity, positions, cash
- Nasdaq-100 trades 1,356 closed trades
- S&P 500 trades 1,996 closed trades
- Metrics by lookback win rate, R distribution, Sharpe, Calmar (per universe)
- Buy & hold equity (QQQ / SPY) benchmark daily equity
- Rolling 12m by regime system vs B&H per index-return bucket
- Monthly returns (heatmap data) both universes
- Monkey distributions (CSV) per-seed CAGR / MaxDD / Sharpe / Calmar — one file per cell
Full report
Reproduce
# Head-to-head (split-adjusted)
python prototype.py --index QQQ_Nasdaq-100 --regime-etf QQQ --start 2005-01-01 --end 2026-05-15
python prototype.py --index SPY_SandP_500 --regime-etf SPY --start 2005-01-01 --end 2026-05-15
# Monkey baseline (gated + un-gated, K=200)
python monkey_baseline.py --index QQQ_Nasdaq-100 --regime-etf QQQ --k 200
python monkey_baseline.py --index SPY_SandP_500 --regime-etf SPY --k 200
# Equal-weight vs ATR-weight ablation (2x2, K=200)
python ablation_weight.py --index QQQ_Nasdaq-100 --regime-etf QQQ --k 200
python ablation_weight.py --index SPY_SandP_500 --regime-etf SPY --k 200
# Refinement artifacts (sample chart, blotter, lookback metrics, sizing OOS, exposure)
python refinements.py