The investable universe
Which stocks the model considers at every monthly rebalance — and what that decision implies for the integrity of the results.
Two distinct universes, two distinct purposes
Russell 3000 approximation — top 3,000 US-listed stocks by market cap from NASDAQ + NYSE, refreshed annually. Fed by free SEC EDGAR fundamentals. Used by the monthly rebalance that produces /live.
SimFin point-in-time dataset — ~5,000 US-listed firms covered annually, including delisted, merged, and bankrupt tickers. The only realistic source of bias-free historical fundamentals at this price point.
📈 Live universe — Russell 3000 today
A snapshot of the top 3,000 US-listed common stocks by market cap from NASDAQ + NYSE, intended to approximate the FTSE Russell 3000 Index. Filtered to exclude ETFs, trusts, preferred shares, warrants, units and SPACs. Refreshed annually from public listings.
Top 6 sectors (by ticker count)
📚 Historical backtest universe — is it big enough?
A legitimate concern for any long-horizon backtest is: does the early period (2007-2008) actually contain enough firms to compute rigorous cross-sectional statistics? Or are we ranking only a handful of mega-caps?
The short answer: yes, by a wide margin. Below are the actual firm counts from the SimFin dataset used in the backtest — every firm with a complete annual income statement, balance sheet, and positive revenue ($1M+) at fiscal year-end.
Universe size, year by year
Firms with complete annual fundamentals + positive revenue ($1M+). Dotted lines = comparison benchmarks.
📐 Is 1,362 firms statistically enough?
The QMJ pipeline relies on cross-sectional rank z-scores — ranking firms relative to each other at a given date. The statistical literature considers a sample large enough for the normal approximation from n ≥ 30. Our smallest year-end universe is n = 1,362 — 45 times the minimum threshold.
Sector distribution: is the early period unbalanced?
A natural follow-up question: even if 1,362 firms is enough by count, are they concentrated in a handful of sectors? Below: side-by-side comparison of the earliest year (2007) and the peak year (2020). All 11 sectors are represented in both — the relative proportions stay reasonably stable, which means SimFin's growing coverage isn't biased toward a particular sector.
How does our 2007 universe compare?
A reality check against the standard academic universes:
Even in the smallest year (2007), the universe is 2.7× larger than the S&P 500 and 36% larger than the Russell 1000. From 2017 onward, it matches or exceeds the Russell 3000 itself.
⚠️ Honest caveat: SimFin coverage grew over time
The universe expands from 1,362 firms (2007) to 3,167 firms (2020), a +130% increase. Part of this reflects real market growth (the biotech IPO wave alone took the Healthcare bucket from 206 to 909 firms over the period). Part reflects SimFin's progressive backfill of its database. The sector-balance check above is our primary defense: if the added firms were systematically different (e.g. all tech growth names), the sector proportions would skew dramatically. They don't — all 11 sectors grow roughly proportionally, suggesting the expansion is a function of SimFin's coverage maturity rather than a selection bias.
Survivorship bias
This is the most important methodological caveat. A naive backtest that uses the current Russell 3000 to score past returns will systematically overestimate performance: it ignores all companies that were delisted, went bankrupt, or were acquired during the backtest period. Those exclusions tend to be lower-quality firms with poor stock performance — exactly the ones a quality screen would have avoided. Removing them from the universe gives the strategy an artificial tailwind of +1.5% to +4% per year, according to the literature.
For live forward signals
Using today's Russell 3000 is the correct choice — these are literally the stocks available to invest in right now. No bias is introduced when we screen the present universe to issue forward signals.
For the 2007-2026 backtest
SimFin retains delisted and bankrupt tickers — the universe is rebuilt for each rebalance date using only firms actually listed at that date. No survivorship bias.
Why not extend the backtest to 1996?
A common question: SEC EDGAR contains filings since 1993 — couldn't we backtest 30 years instead of 19? Three obstacles:
- XBRL only mandatory from 2009. EDGAR's machine-readable format (the one our pipeline parses) was phased in starting 2009 for large filers, extended through 2011. Pre-2009 filings are HTML/text only — parseable but bruité, requires significant additional engineering (~2-3 weeks).
- Point-in-time index membership is proprietary. To reconstruct who was in the Russell 3000 on, say, 30 June 2001, we'd need FTSE Russell's historical constituent files (~$10k+/year subscription). Free sources only give the current membership, which would re-introduce survivorship bias.
- Statistical sufficiency. 19 years covers two major crises (GFC, COVID) and three distinct interest-rate regimes — already broader coverage than many published QMJ-family papers. The marginal scientific gain from extending to 30 years doesn't justify the cost of accurate data acquisition for a master's research project.
The professional alternative is CRSP + Compustat via WRDS (Wharton Research Data Services), which provides clean point-in-time data back to 1925. Academic institutional pricing is ~$5-15k/year — worth checking if your university subscribes.
Practical impact on portfolio construction
Across the full 2007-2026 horizon, the funnel at each monthly rebalance looks roughly like:
How to refresh the live universe
From the repo root, once a year:
python algo/universe/refresh.py
This regenerates algo/universe/russell3000.json from the
latest NASDAQ/NYSE listings, filtered and ranked by market cap.