Edge Lab / Clenow

Clenow Weekly Momentum Rotation

A survivorship-bias-free evaluation on the Nasdaq-100 and S&P 500 — with a random-portfolio baseline and a sizing ablation, on split- and dividend-adjusted prices.

Long only Evaluated Index-like return, half the drawdown

← OverviewDeep Dive

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:

Disclosure-date caveat. This strategy was published in Andreas Clenow’s Trading Evolved (2019); the rules and parameters tested here are taken from that public source. The 2005–2026 backtest predates publication, so we treat it as in-sample and adopt 2021 as the out-of-sample pivot — a deliberately conservative choice one step past the 2019 publication date. Only results from 2021 forward are genuine walk-forward; moving the pivot earlier would only extend that window. Read the full-period figures as an in-sample description of how the published recipe behaved, separate from a forward record.
Where this sits — Edge Lab stage funnel
S1 · Feasibility & signalsdone
S2 · Entry quality vs randomdone
S3 · Cadence & regimedone
S4 · Portfolio P&L vs buy & holddone
S5 · Robustnessdone
S6 · Publicationdone
S7 · Promotionplanned
S8 · Maintenanceplanned
Contents
  1. The system
  2. Setup & data
  3. The system vs. buying the index
  4. A trade, drawn out (sample chart)
  5. The edge is in bear markets (rolling 12-month returns)
  6. Does the stock-picking beat random? (the monkey baseline)
  7. Sizing vs. selection (ablation)
  8. Metrics by lookback
  9. Sizing out-of-sample
  10. Exposure & holding period
  11. What this means for you
  12. Costs, slippage & cash
  13. Constraints
  14. 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

Rank each member by the annualized slope × R² of a 90-day linear regression on log close prices. Take the top 20. Log prices linearise compounding; R² weights the slope by fit.

Filters

A name must be above its 100-day SMA, have a positive regression slope, and show no overnight gap > 15% in the trailing 100 days (gap-prone names are excluded to smooth the equity curve).

Regime gate

New positions are only opened when the index ETF is above its 200-day SMA (QQQ for the Nasdaq-100, SPY for the S&P 500). Existing positions may ride.

Sizing

Inverse-volatility: shares = equity × 0.0015 / ATR(14). Lower-volatility names take larger allocations. Re-sized every other week, only past a 20%-of-position or 2%-of-portfolio threshold.

Cadence

Ranked and rebalanced weekly — calculated Tuesday, intended for Wednesday’s open. (Friday and Monday are avoided for their holiday and data-release proximity.)

Exits

A held name exits at the next weekly review if it falls below its 100-day SMA, its slope turns negative, it gaps > 15%, or it drops out of the top 20.

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)

Both universes exceed 100 names, so individual symbols are not enumerated. The universe is defined by membership, not a fixed list: the SBF ever-member set is ~286 names (Nasdaq-100) and ~959 names (S&P 500), of which 284 and 955 are loaded. Each trading date resolves to the members active on that date.

ItemNasdaq-100S&P 500
SBF members loaded284 / 286955 / 959
Regime ETF (200-day gate)QQQSPY
Window2005-01-03 → 2026-05-15 (21.4y, 5,376 trading days)
Starting capital$100,000
Prices are split- and dividend-adjusted. Every symbol’s open/high/low/close is reconstructed from its adjusted close (ratio method) before any indicator, filter, fill price, or P&L is computed, so a stock split is not mistaken for an overnight gap. The data is an end-of-day, survivorship-bias-free dataset (Norgate-derived) with point-in-time index membership. Commissions and slippage are modeled in §12; the headline runs at 0% on idle cash during regime-off periods, which the reader supplements with their own cash return. Both universes run the identical engine; the only differences are the membership set and the regime ETF.

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.

MetricNasdaq-100 systemBuy & hold QQQS&P 500 systemBuy & hold SPY
CAGR11.43%15.34%9.31%10.88%
Max drawdown−29.81%−53.40%−22.74%−55.19%
Sharpe0.770.770.650.64
Rolling 36m Calmar (median)0.640.900.480.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.

Equity: system vs buy & hold, log scale
Solid = system, dashed = buy & hold the index ($100k start, log scale). Buy-and-hold’s deeper 2008 / 2020 / 2022 dips are the drawdown the system avoided.

System detail, side by side

Nasdaq-100 CAGR
11.43%
Nasdaq-100 MaxDD
−29.8%
S&P 500 CAGR
9.31%
S&P 500 MaxDD
−22.7%
MetricNasdaq-100S&P 500
N trades1,3561,996
Win rate46.9%48.6%
Profit factor1.421.23
CAGR11.43%9.31%
Max drawdown−29.81%−22.74%
Sharpe0.770.65
Rolling 36m Calmar (median)0.640.48
Return / MaxDD (full-period Calmar)0.380.41
Final equity$1,009,709$669,487
Avg hold (trading days)4734
Avg positions14.114.7
Drawdown curves
Both lines are the system, on each universe. On the Nasdaq-100 the worst drawdown is the 2008 GFC (−29.8%). On the S&P 500 the system passed through 2008 and COVID-2020 shallowly; its worst stretch is the 2022 grind (−22.7%).
Calendar-year returns
Calendar-year returns on each universe.

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)
YearJanFebMarAprMayJunJulAugSepOctNovDecYr%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)
YearJanFebMarAprMayJunJulAugSepOctNovDecYr%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
Rolling 36-month Calmar
Rolling 36-month Calmar (trailing annualized return / |trailing max drawdown|). Dotted lines mark each series’ median (Nasdaq-100 0.64, S&P 500 0.48).

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)
AVGO momentum rotation entries and exits
AVGO over a multi-year window. Each entry sits above the rising 100-day SMA; exits fire at the weekly review when the trend or rank breaks. The long holds through trending stretches are how a momentum rotation captures a winner; the system rides it until the trend ends.

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.

Rolling 12-month return by market regime
Average rolling 12-month return, system (color) vs buy-and-hold (grey), grouped by the index’s own trailing 12-month return. Left = index falling; right = index rising.

Nasdaq-100

Index 12m returnWindowsBuy & hold avgSystem avgEdge (sys−B&H)System win-rate
< −20% (deep bear)295−31.3%−15.8%+15.4 pp100%
−20 to −10%163−14.7%−4.3%+10.4 pp88%
−10 to 0%257−4.0%−0.5%+3.5 pp53%
0 to 10%932+5.3%+4.1%−1.1 pp34%
10 to 20%1,028+15.2%+10.7%−4.6 pp29%
20 to 30%1,235+25.0%+16.7%−8.3 pp22%
> 30% (strong bull)1,214+40.7%+24.8%−15.9 pp14%

S&P 500

Index 12m returnWindowsBuy & hold avgSystem avgEdge (sys−B&H)System win-rate
< −20% (deep bear)217−34.7%−5.6%+29.0 pp100%
−20 to −10%212−14.4%−5.5%+9.0 pp98%
−10 to 0%417−4.8%−2.9%+1.8 pp58%
0 to 10%1,003+5.6%+0.7%−4.9 pp22%
10 to 20%1,882+15.3%+12.0%−3.3 pp33%
20 to 30%955+24.2%+15.9%−8.3 pp25%
> 30% (strong bull)438+38.5%+28.9%−9.7 pp40%

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

UniverseBaselineCAGR pctileSkill excessSharpe pctileCalmar pctileMaxDD pctile
Nasdaq-100gatedp98.5+3.45 pp/yrp90.0p99.5p13.5 (deeper)
Nasdaq-100un-gatedp97.5+2.58 pp/yrp90.0p98.5p68.5
S&P 500gatedp99.0+3.50 pp/yrp50.5p58.0p5.0 (deeper)
S&P 500un-gatedp99.5+4.30 pp/yrp85.5p75.0p77.0
Nasdaq-100 monkey distributions
Nasdaq-100 universe: the real system (red) vs 200 random-pick monkeys (grey), four metrics. CAGR, Sharpe and Calmar sit right of the monkey median; MaxDD sits left — the ranking adds return and carries a deeper drawdown.
S&P 500 monkey distributions
S&P 500 universe: the CAGR edge is at the 99th percentile; Sharpe and Calmar sit near the monkey median, and the drawdown is deeper (p5).

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 / weightingCAGRMaxDDSharpeCalmar36
Nasdaq-100 — ATR+11.43%−29.81%0.770.64
Nasdaq-100 — equal+12.07%−31.99%0.750.63
S&P 500 — ATR+9.31%−22.74%0.650.48
S&P 500 — equal+11.04%−30.43%0.670.48

Real percentile within the matching monkey distribution (gated):

UniverseWeightingCAGRSharpeCalmar36MaxDD
Nasdaq-100ATRp98.5p90.0p99.5p13.5
Nasdaq-100equalp99.5p82.0p100.0p8.0
S&P 500ATRp99.0p50.5p58.0p5.0
S&P 500equalp100.0p52.0p49.5p0.0
Nasdaq-100 ablation
Nasdaq-100 universe, gated. Under both weightings the real MaxDD (red) is a low-percentile outlier.
S&P 500 ablation
S&P 500 universe, gated. Equal weight lifts the ranking’s CAGR to the top of the distribution and the drawdown becomes the single worst in it (p0).

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

WindowTradesWin rateAvg win (R)Avg loss (R)Expectancy (R)SharpeCalmar
Trailing 12m12267.2%+3.99−0.77+2.431.643.40
Trailing 24m23950.0%+3.07−0.86+1.100.931.28
Trailing 36m35650.0%+2.41−0.86+0.780.941.20
Full (21y)1,35646.9%+1.48−0.97+0.180.770.38

S&P 500

WindowTradesWin rateAvg win (R)Avg loss (R)Expectancy (R)SharpeCalmar
Trailing 12m54.8%+1.90−0.77+0.691.954.94
Trailing 24m46.4%+1.65−0.95+0.260.850.84
Trailing 36m44.6%+1.54−0.89+0.200.750.67
Full (21y)1,99648.6%+1.24−0.83+0.180.650.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.

UniverseWindowsafe-fper slot (of 20)CAR25DD-95 at safe-f
Nasdaq-100sizing in-sample (≤2020)1.75×8.8%+8.5%−19.9%
Nasdaq-100sizing out-of-sample (2021+)1.75×8.8%+20.0%−19.7%
S&P 500sizing in-sample (≤2020)1.75×8.8%+8.5%−17.8%
S&P 500sizing 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-100S&P 500Buy & hold
Time in market (days holding ≥1 position)~100%~100%100%
Average dollar deployment86.3%85.0%100%
Dollar deployment, 200838%37%100%
Dollar deployment, 202252%49%100%
Average holding period (trading days)47 (median 38)34 (median 29)
CAGR11.43%9.31%15.34% / 10.88%
Exposure-adjusted return11.4%9.3%= CAGR
Capital invested over time
Dollar capital deployed over time (dotted = average). Near-fully invested most of the time, with sharp de-risking in 2008, 2018, 2020 and 2022 — the dynamic exposure behind the defensive profile.
Recent trade blotter — Nasdaq-100, most recent closed positions
SymbolEntryExitEntry $Exit $Profit %Profit $Equity at exitExit reason
INTC2026-04-212026-05-0566.26108.15+63.2%$18,725$996,784rank_drop
ASML2025-11-112026-05-121022.421520.94+48.8%$13,460$1,009,151rank_drop
MU2025-08-052026-05-15109.06724.66+564.5%$20,930$1,009,709eod_close
LRCX2025-09-022026-05-1597.03284.72+193.4%$21,772$1,009,709eod_close
KLAC2025-10-142026-05-151025.711804.32+75.9%$14,015$1,009,709eod_close
AMAT2025-11-182026-05-15225.12436.62+93.9%$16,497$1,009,709eod_close
WDC2025-12-232026-05-15178.25482.02+170.4%$16,404$1,009,709eod_close
STX2025-12-232026-05-15282.80795.47+181.3%$19,481$1,009,709eod_close
ROST2026-01-062026-05-15187.53212.75+13.4%$8,348$1,009,709eod_close
ADI2026-02-032026-05-15311.29417.49+34.1%$16,673$1,009,709eod_close
ODFL2026-02-172026-05-15193.32203.12+5.1%$1,842$1,009,709eod_close
BKR2026-03-102026-05-1559.3464.12+8.1%$3,676$1,009,709eod_close
FANG2026-04-142026-05-15186.51203.56+9.1%$3,478$1,009,709eod_close
LIN2026-04-142026-05-15499.65506.11+1.3%$872$1,009,709eod_close
ARM2026-05-052026-05-15208.84209.16+0.2%$36$1,009,709eod_close
MRVL2026-05-122026-05-15164.50176.89+7.5%$2,106$1,009,709eod_close

The last 15 of the most-recent-25 closed positions; names still open at the data’s end close at the final bar (eod_close). Full trade lists for both universes are in the data artifacts below. Prices are split-adjusted, so a name like MU rides as one long position across its run rather than being clipped at a split.

11. What this means for you

QuestionAnswer 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:

  1. 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.
  2. A cash yield on idle cash during regime-off periods, currently earning 0%.
  3. 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:

AccountNasdaq-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 / sideRound tripNasdaq-100 → CAGRS&P 500 → CAGR
0 bps0 bps11.43%9.31%
2.5 bps5 bps−23 bps → ~11.20%−33 bps → ~8.98%
5 bps10 bps−45 bps → ~10.98%−67 bps → ~8.64%
10 bps20 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

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 Manifest.
run_date2026-06-06
data_as_of2026-05-15 (last bar)
test window2005-01-03 → 2026-05-15; OOS pivot 2021-01-01 (ruleset & sizing)
universesurvivorship-free point-in-time membership, resolved per trading date (Nasdaq-100 ~286 ever-members; S&P 500 ~959)
pricesEOD, split- & dividend-adjusted (ratio reconstruction from adjusted close)
engineprototype.py (weekly rotation); monkey + ablation at K=200; refinements.py (R2/R5/R6/R8/R10)
rerun modeRe-fit — prices corrected to split-adjusted
sourceAndreas Clenow, Trading Evolved (2019) / Stocks on the Move (2015)

Code

Data (CSV)

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