Risk-adjusted 12-1 momentum engine for Roth IRA portfolios
API not configuredNever fetched
Portfolio Value
$0
Set in Settings → Portfolio Size
Top N Holdings
100
Concentration of strategy
Next Rebalance
—
Cadence: Quarterly
Universe / API Budget
0 / 0
API calls today: 0 / 250
Market Regime
—
Median universe 12-1 return
Implied Turnover vs Last Run
—
Names rotated since previous scoring
Largest Sector Tilt
—
After sector cap applied
Momentum Score Distribution (Top N)
Bars = blended score · sorted descending
Target Weights (Top 10)
Sector Allocation
Recent Rebalances
No rebalances logged yet.
1
Universe seeding in progress
0%
Setting up your price cache…
—
✓0 tickers fully cached — strategy is live. Weekly rebalances cost 0 API calls until the cache expires (5 days).
Run the Engine
Fetches 13 mo of daily closes for your universe → computes scores. Cached tickers cost 0 calls.
Starting…
Stock Screener
Ranked universe with risk-adjusted momentum scores.
Rank
Ticker
Sector
12-1 Ret
3-1 Ret
Vol (ann)
Score
Mcap ($B)
Weight
Trade Execution Assistant
Upload current holdings CSV (columns: ticker,shares,price — price optional)
No file loaded.
Rebalance Frequency
Next rebalance: —
Last recorded: —
Trade List
Run "Compute Trades" to see orders.
Ticker
Target Weight
Target $
Current $
Delta $
Price
Shares Δ
Action
Financial Data API
Strategy Parameters
Strategy Engine v2 — Beat-SPMO Configuration
SPMO uses 12-1 momentum / 3yr weekly vol, semi-annual rebal, 100 stocks, score×Mcap weighting, 5% cap. Defaults below diverge on every dimension: blended lookbacks, faster vol, concentrated 50-stock book, pure score weighting, weekly rebal, plus regime & acceleration overlays.
Momentum Blend
Default blends 12-1, 6-1, and 3-1 windows. Weights auto-normalize.
Risk & Filters
Regime check: if universe median 12-1 return < 0, scale all weights by this factor and hold the rest in cash.
Weighting & Caps
Existing holdings keep their slot if still ranked within band × topN. Reduces churn on weekly rebal.
Strategy Notes & Free-Tier Playbook
v2 engine vs SPMO: SPMO scores names on a single 12-1 risk-adjusted return,
rebalances semi-annually, holds 100 names, weights by score × market cap, caps at 5%. v2 (a) blends three
lookbacks (12-1 / 6-1 / 3-1, weights 0.50 / 0.30 / 0.20) to capture both classical and faster momentum;
(b) uses 6-month daily realized vol instead of 3-year weekly vol so the risk denominator reacts to regime
shifts; (c) applies a positive-momentum filter (Asness / Moskowitz) — names with negative 12-1 are excluded;
(d) adds an acceleration boost — names whose 3-1 return is outpacing their 12-1 average get +15% score; (e) uses
pure score weighting (no Mcap dilution — we have no capacity constraint) with a 6% stock cap, 30% sector cap,
and a 0.5% floor; (f) protects existing holdings via a 1.5× turnover band — a name only gets sold if it drops
below rank 1.5×N, which cuts weekly turnover roughly in half; (g) adds a regime overlay (Daniel-Moskowitz
crash hedge) — if the universe median 12-1 return goes negative, exposure is scaled down by 50%.
Why these changes matter for weekly rebal: weekly rebalancing only helps if
your signal is fresh and your turnover is controlled. The 3-1 component and acceleration boost surface
breakouts SPMO misses for ~5 months. The turnover band and pure score weighting offset the noise that
weekly rebal would otherwise introduce. In a Roth IRA, the standard tax cost of high turnover is zero,
so the net effect is upside — provided your broker offers fractional shares and commission-free trades.
Tiingo free tier (recommended): 50 unique tickers/day, 1,000 calls/day, 30+ years of EOD
history. Get a free token at tiingo.com. Each ticker costs 1 call (history only — no
market-cap endpoint on the free tier, so the engine skips that phase and uses the latest close from price
history when sizing trades). Pure score weighting is therefore the only sensible mode here, which is already
v2's default. At universeSize=150 the initial seed takes ~3 days (45/day default budget);
after that, weekly rebal costs 0 calls until the cache expires (5 days).
FMP free tier: 250 calls/day, 500MB/30d. S&P 500 constituents endpoint is premium-only,
so the universe is baked in. Uses /stable/historical-price-eod/light + /stable/quote
(2 calls per ticker). Switch to FMP in Settings if you need market cap data for score×Mcap weighting.