title: "the eight dimensions" slug: "the-eight-dimensions" date: "2026-04-12" updated: null type: "methodology" excerpt: "The scoring engine reduces every ticker to eight numbers. Here is what each of them measures and how it earned its weight." tags: ["scoring", "methodology", "factors"] readTime: 12 draft: false
The scoring engine reduces every ticker in the scan universe to eight numbers between 0 and 100. Those numbers are averaged — unevenly — into a single composite score, which is what determines whether a trade card gets written. This post is a tour of the eight. For each one: what it measures, roughly how it's calculated, and the short story of how it earned its weight in the composite. The numbers cited below are from the current backtest window (last 180 sessions, 3,572 closed trades) and will be linked to the ledger once the site is fully wired up.
— —
The premise of the engine is that no single factor wins on its own. I started with one — a momentum signal — and got about a 3.1 percentage-point edge over random, which is a fine result but not the kind of edge that survives a drawdown with confidence intact. Layering factors with conditional dependencies lifted that number into the low fives, and the current eight-factor composite sits at around 5.4 points above the random baseline on the hold-out set. That is the entire reason the engine is an engine and not a single rule.
01 — regime
Weight: 22%. The biggest single contributor to the composite.
Regime measures where the market currently sits relative to its own recent volatility distribution. It's computed from three inputs — SPY trend (20/50/200 day), QQQ/SPY ratio, and VIX percentile — and produces a number between 0 and 100 where high values mean "risk-on, trend-intact, volatility suppressed" and low values mean "de-risked, broken, paying up for protection."
The regime factor replaced an earlier FRED-based version whose story is told in its own post — short version, the original had zero variance over any reasonable lookback and was effectively a constant in the scoring. Replacing it with the current SPY/QQQ/VIX formulation produced an r-value against forward 5-day returns of 0.439 on the hold-out set, which is the single strongest correlation any of the eight dimensions hits in isolation. That r-value is why it's the heaviest weight.
02 — momentum
Weight: 18%. The second-heaviest, and the easiest to explain.
Momentum here is not "price went up." It's a ratio of the ticker's 20-day return to its 60-day realized volatility, capped and scaled so that low-vol tickers aren't penalized for moving less. The intent is to measure return-per-unit-risk over a horizon long enough to cut noise and short enough to still be actionable.
The factor is boring to look at and persistent in backtests. Over the last four quarters, momentum-scored deciles separate almost perfectly on forward returns, with the top decile beating the bottom by roughly 190 basis points over a 10-day hold. It is the kind of factor that nobody writes interesting posts about because it simply works.
03 — earnings proximity
Weight: 12%.
Measures how close a ticker is to its next reported earnings date, with a binary cliff at 7 days. Inside 7 days, the factor returns 0 regardless of anything else — the strategy does not trade in the immediate earnings window, and the easiest way to enforce that rule is to zero the dimension. Outside 7 days, the factor scales from 100 (fresh report, 60+ days away) down to 0 (approaching the cliff).
The weighting is conservative on purpose. Earnings gaps are the single worst thing that happens to an options spread, and the engine treats proximity to earnings as an aggressive exclusion criterion. In practice, roughly 14% of tickers that otherwise score above 80 get zeroed out by this dimension on any given scan day.
04 — liquidity
Weight: 10%.
Average daily options volume and open interest, both normalized against the ticker's underlying market cap. Liquidity below a hard floor is a kill — the engine will not write trade cards for tickers whose spreads are likely to execute at a disadvantage. Above the floor, liquidity contributes linearly up to a saturation point; there is no additional credit for being more liquid than "deep enough to close a position without slippage."
05 — IV rank
Weight: 10%.
Current implied volatility relative to the trailing 52-week range. This is the dimension that tells the engine whether options are cheap or rich relative to their own history. The strategy prefers moderately high IV rank for credit spreads (selling expensive premium) and moderately low IV rank for long calls (buying cheap optionality). The factor is direction-aware — it asks the trade type before it returns a score, which is the only dimension that's aware of what kind of trade is being considered.
IV rank does less than people expect in backtests. It's useful as a tiebreaker between two otherwise-similar tickers, but its standalone r-value against forward returns is under 0.10. It earned its 10% weight primarily by improving the consistency of the composite, not by driving its raw performance.
06 — catalyst density
Weight: 8%.
A composite of its own — counts the density of upcoming calendar events (earnings, investor days, product announcements, ex-dividend dates, major sector conferences) over the next 21 days and returns a score that rewards moderate density and penalizes both extremes. Zero catalysts means the trade has nothing to react to; too many means unpredictability.
The current implementation leans on a manually curated calendar for anything beyond earnings, which is a known weakness. The weight stays modest until that data source is more robust.
07 — sector strength
Weight: 8%.
Where the ticker's sector sits relative to the broader market over a 20-day window. Computed as the 20-day sector ETF return (XLK, XLF, XLE, etc.) minus the SPY return, normalized and clipped. Positive values mean the sector is pulling ahead; negative values mean the ticker is fighting a headwind at the sector level.
This factor exists to keep the engine from buying the strongest stock in the weakest sector, which turns out to be a frequent setup. Backtests show sector strength is most valuable as a filter: the bottom quintile of sector-strength scores produces trades with roughly 70% of the expected edge of otherwise-identical setups in the top quintile.
08 — narrative freshness
Weight: 7%.
The oddest of the eight, and the one I'm least confident in. It tries to measure whether a ticker has a story right now — a recent earnings beat that hasn't been fully digested, a product launch, a management change, anything that gives directional buyers a reason to show up. Computed from the density of recent filings and news hits normalized against a rolling baseline.
The rationale is that momentum factors capture price movement but not attention, and attention is what sustains the kind of short-term follow-through these trades depend on. In standalone tests, narrative freshness adds about 40 basis points to the top-decile composite return — small, but positive, and directionally sensible.
It stays at 7% and under review. If I can't find a cleaner way to measure "is this ticker in the conversation right now," it may get folded into something else.
— —
why the weights are what they are
The weights were not hand-picked. They come out of a regression of the eight factors against forward 5-day returns on the training window (2023 through mid-2025), constrained to sum to 100% and floored at 5% per factor so no dimension gets killed entirely. I ran the regression quarterly for the last eighteen months and the weights have moved within a narrow band — regime has never been less than 18% or more than 25%, momentum between 15% and 21%. That kind of stability is a sanity check that the factor structure isn't overfit to a single window.
Backtest top-decile over bottom-decile spread on the eight-factor composite is 320 basis points per 10-day hold on the 2024–2026 hold-out window. That's the headline number. It's not extraordinary and it doesn't need to be — the edge compounds through trade sizing and the fact that the engine writes four or five cards a day, not one.
what I'd still like to know
The factor I most want to replace is narrative freshness. The factor I most want to add is something that captures short-interest compression — the effect of a heavily shorted name running into a structural unwind. Neither is in the engine today. Both are on the list of things I'll write about once I have something worth saying.