Every S&P 500 constituent plus 25 core ETFs, scored on the same risk-adjusted momentum formula every trading day. The formula is published below — nothing here is a black box. 385 of 525 names currently pass the 200-day moving-average filter.
| # | Ticker | Score | 12-1 % |
|---|
Score is the average of three lookback returns divided by realised volatility, so a 25%-in-3-months move in a quiet stock outranks the same move in a wild one. A name is only eligible if it closes above its 200-day moving average.
r3 = close[-1]/close[-64] - 1 # 3-month return
r6 = close[-1]/close[-127] - 1 # 6-month return
r12_1= close[-22]/close[-253] - 1 # 12-month return, skipping last month
vol = max(std(daily_returns[-20:]) * sqrt(252), 0.05)
score = ((r3 + r6 + r12_1) / 3) / vol
eligible = close[-1] > mean(close[-200:])
Prices are split/dividend-adjusted daily closes. Ranks shown are among eligible (above-200dma) names only.
These rankings are the screening layer of a paper momentum book that has been running publicly since 2026-08-09 with a fixed, un-overridable ruleset — mechanical 10% stops, mechanical rank exits, no discretion. It is a paper track record and it is young; the live equity curve and the full rules are on the book page. Judge it on the rules, not on two weeks of P&L.
Want the runnable engine instead of the table? The $9 toolkit is the Python screener + backtest harness + the weekly signal file (entries, exits, stop levels) — same code that generates this page.
Get the screener toolkit — $9 one-timeIs this investment advice? No. It is a factor screen. Momentum has long drawdowns and this book is unproven; size accordingly and do your own work.
How often does it update? Recomputed from daily closes; the as-of date is at the top of the page.
Why divide by volatility? Raw 12-1 momentum systematically loads on the most volatile names. Dividing by realised vol equalises risk contribution; the classic 12-1 column is shown so you can compare the two ranks yourself.