Multi-Factor Screener
The screener, tested on its own history

Does the ranking predict returns?

Before trusting a ranking, ask whether it would have worked. This page tests the screener's weighting, and 27 alternatives from the investing literature, on fifteen years of S&P 500 history rebuilt from the financial statements companies had actually published at each date.

Reading the numbers. A rank correlation runs from −1 to +1: at +1 the ranking would have put every stock's next-month return in exact order, and at 0 it said nothing about them. A t-statistic is a result divided by its own standard error, so the further it is from 0, the less likely chance alone produced the result. A basis point is a hundredth of a percentage point.

How it was tested

Test enough ideas on one history and some look excellent by luck. The test was set up to prevent that:

  1. 1Every idea, its source and its predicted result were written down and published in the project's history before it was run. For seven of them (each category on its own, marked †), the 2020–2026 result had already been computed in an earlier check of the data before they were registered, so for those only the 2012–2019 test is blind.
  2. 2Ideas were compared with the current weighting month by month and judged on months they were never tuned on. Each comparison is paired by month and measured on the stocks the two rankings share, so a difference is a difference in ranking rather than in which companies were ranked. A weighting can only rank what it has enough data to score: over 2020–2026 the current weighting ranked 440 stocks a month on average and the narrowest alternative, Free-cash-flow yield alone (within sector), 348. The narrower screen ranks almost only companies the current weighting also ranks (fewer than one a month is unique to it), so pairing on the overlap holds the current weighting to that smaller set instead of crediting it with the 92 only it can score.
  3. 3The years 2012–2019 were set aside as an untouched test, with the rule for passing it, before any of that data was built.
  4. 4A result counts only if it clears a bar that allows for how many ideas were tried: p < 0.05 / 28 and a t-statistic of at least 3, the threshold Harvey, Liu & Zhu (2016) propose for a new factor. With p from Student's t, that means a t-statistic of at least 3.21 over 2012–2019's 96 months and 3.37 over the 38 held-out months. Every run is kept, including runs a data correction replaced.

Each alternative against the current weighting, 2012–2019

Difference in average monthly rank correlation. The shaded band is the smallest difference the test could reliably detect (80% of the time). The two short marks either side of zero are the pass bar: a difference counts only if it reaches beyond them, a t-statistic of 3.21 over these 96 months, in the same direction as 2020–2026. A dot inside the marks did not pass; it may still be a real difference smaller than the band. Rows marked † had their 2020–2026 result on file before they were registered; this chart is their blind test.

Size alone (within sector)†
+0.027 t +1.8
Growth alone†
+0.014 t +1.2
Ranked across the market, not within sectors
+0.007 t +1.0
Equal weight on every category
+0.006 t +1.3
12-1 month return alone (within sector)
+0.006 t +0.4
Free-cash-flow yield alone (within sector)
+0.004 t +0.4
Without Valuation
+0.004 t +0.4
Momentum alone†
+0.004 t +0.3
Without Risk
+0.003 t +0.7
Overlap removed between categories
+0.002 t +1.3
Without Investment
0.000 t +0.3
Without Momentum
0.000 t 0.0
Without Quality
0.000 t 0.0
Quality alone†
−0.001 t −0.1
Drop revenue growth (within sector)
−0.001 t −0.7
Piotroski F-score alone (within sector)
−0.003 t −0.3
Profitability and value (within sector)
−0.003 t −0.3
Without Growth
−0.004 t −1.1
Value and momentum
−0.004 t −0.6
Without Size
−0.004 t −2.9
Valuation alone†
−0.004 t −0.3
Investment alone†
−0.006 t −0.5
Greenblatt's Magic Formula
−0.008 t −0.7
Nearness to the 52-week high (within sector)
−0.008 t −0.6
Low risk alone†
−0.011 t −0.8
Profitability and low volatility
−0.015 t −1.6
Low volatility alone (within sector)
−0.015 t −1.2
−0.06−0.030+0.03+0.06
difference 95% interval pass bar smallest difference the test could reliably detect

Size alone (within sector)† shows the largest 2012–2019 difference, +0.027 (t +1.83), short of the pass bar. Survivorship could explain it. The test can only include companies that are still in the index today, and among 2012's members the small ones that survived are disproportionately the ones that did well. This data cannot separate that explanation from the passage of time. The share of each month's members the test could include rose steadily, from 57% in 2012 to 97% in 2026 (its correlation with the calendar is 0.998), and within 2012–2019 the Size screen's monthly result moved with that share about as much as the current weighting's did (correlations of −0.124 and −0.135). Rebuilding the departed members from free filings and prices would test it; that rebuild is queued with its prediction written down in advance.

Every alternative, both periods
AlternativeMid-2023–2026 (t)2012–2019 (t)
12-1 month return alone (within sector)
Jegadeesh & Titman (1993)
How it is built here: Ranked within sector, as the engine ranks every metric (factor_engine.compute_sector_percentiles): a stock's 12-1 month return against its sector peers, which removes the industry component of momentum (Moskowitz & Grinblatt 1999). Jegadeesh & Titman (1993) rank across the whole market.
+0.021 (+0.8)+0.006 (+0.4)
Drop revenue growth (within sector)
Hou, Xue & Zhang (2015), Review of Financial Studies 28(3), 650-705, doi:10.1093/rfs/hhu068
How it is built here: Two differences from the cited papers and one from the live screener, all stated rather than assumed. (1) Both papers test the Lakonishok-Shleifer-Vishny FIVE-YEAR weighted rank of sales growth; this metric is one year - the latest quarter against the same quarter a year earlier (changelog 2026-10-09). The established null is therefore about the longer-horizon construction, and this experiment is what tests the one-year one here. (2) Both papers rank across the market; the engine ranks every metric within the stock's GICS sector (factor_engine.compute_sector_percentiles), so the screen is relative to sector peers. (3) In this configuration forward_eps_growth has no free history and carries no weight, so Growth is revenue_growth 25 / revenue_cagr_3yr 15 / sustainable_growth 15 and this leg is 5.91 composite points rather than the live 3.25; the engine renormalises the two that remain, so the category keeps its 13 points and its role as the composite's counterweight (research/2026-10-12-growth-category.md section 10). This is deliberately NOT drop-growth, which removes the counterweight itself and was already run (-0.003, t -0.49).
−0.007 (−2.4)−0.001 (−0.7)
Equal weight on every category
DeMiguel, Garlappi & Uppal (2009), Review of Financial Studies 22(5)
−0.008 (−1.6)+0.006 (+1.3)
Free-cash-flow yield alone (within sector)
Valuation's own construction (45% of Valuation)
How it is built here: Ranked within sector, as the engine ranks every metric (factor_engine.compute_sector_percentiles): free-cash-flow yield against sector peers, which is how the screener's Valuation category uses it.
−0.009 (−0.5)+0.004 (+0.4)
Greenblatt's Magic Formula
Greenblatt (2006), The Little Book That Beats the Market
−0.005 (−0.3)−0.008 (−0.7)
Growth alone†
research/2026-10-12-growth-category.md
+0.001 (+0.1)+0.014 (+1.2)
Investment alone†
Cooper, Gulen & Schill (2008)
−0.009 (−0.3)−0.006 (−0.5)
Low risk alone†
Ang, Hodrick, Xing & Zhang (2006)
−0.022 (−0.9)−0.011 (−0.8)
Low volatility alone (within sector)
Ang et al. (2006)
How it is built here: Ranked within sector, as the engine ranks every metric (factor_engine.compute_sector_percentiles): volatility against sector peers. Ang et al. (2006) and Frazzini & Pedersen (2014) sort across the whole market.
−0.025 (−1.1)−0.015 (−1.2)
Momentum alone†
Jegadeesh & Titman (1993)
+0.020 (+0.8)+0.004 (+0.3)
Nearness to the 52-week high (within sector)
George & Hwang (2004), The 52-Week High and Momentum Investing, Journal of Finance 59(5)
How it is built here: Ranked within sector, as the engine ranks every metric (factor_engine.compute_sector_percentiles): nearness to the 52-week high against sector peers. George & Hwang (2004) rank across the whole market.
+0.012 (+0.6)−0.008 (−0.6)
Overlap removed between categories
config.yaml factor_neutralization (built, switched off)
+0.004 (+2.3)+0.002 (+1.3)
Piotroski F-score alone (within sector)
Piotroski (2000), Journal of Accounting Research 38
How it is built here: Ranked within sector, as the engine ranks every metric (factor_engine.compute_sector_percentiles): the F-score is compared with sector peers. Piotroski (2000) applies it across the market, among high book-to-market firms.
+0.002 (+0.2)−0.003 (−0.3)
Profitability and low volatility
Novy-Marx (2016), Understanding Defensive Equity, NBER w20591
−0.021 (−1.3)−0.015 (−1.6)
Profitability and value (within sector)
Novy-Marx (2013), JFE 108
How it is built here: Ranked within sector, as the engine ranks every metric (factor_engine.compute_sector_percentiles). The value half is earnings yield, where Novy-Marx (2013) uses book-to-market; his hedge comes from profitability's negative correlation with book-to-market. Here earnings yield and gross profit to assets have an average monthly within-sector rank correlation of +0.045 over 176 months (research/measurements/2026-10-16-stocks-ranked-per-config.json), so the screen does not carry that hedge.
+0.006 (+0.3)−0.003 (−0.3)
Quality alone†
Novy-Marx (2013)
−0.007 (−0.7)−0.001 (−0.1)
Ranked across the market, not within sectors
Asness, Porter & Stevens (2000), "Predicting stock returns using industry-relative firm characteristics"
+0.009 (+0.9)+0.007 (+1.0)
Size alone (within sector)†
Fama & French (1992)
How it is built here: Ranked within sector, as the engine ranks every metric (factor_engine.compute_sector_percentiles): the screen favours companies that are small for their sector. Fama & French (1992) sort the whole market by size.
−0.015 (−0.5)+0.027 (+1.8)
Valuation alone†
Fama & French (1992)
+0.004 (+0.1)−0.004 (−0.3)
Value and momentum
Asness, Moskowitz & Pedersen (2013), Value and Momentum Everywhere, Journal of Finance 68(3)
+0.022 (+1.5)−0.004 (−0.6)
Without Growth
Leave-one-out ablation
−0.003 (−0.5)−0.004 (−1.1)
Without Investment
Leave-one-out ablation
+0.002 (+0.8)0.000 (+0.3)
Without Momentum
Leave-one-out ablation
−0.011 (−1.0)0.000 (0.0)
Without Quality
Leave-one-out ablation
+0.004 (+0.6)0.000 (0.0)
Without Risk
Leave-one-out ablation
+0.007 (+0.7)+0.003 (+0.7)
Without Size
Leave-one-out ablation
+0.003 (+1.3)−0.004 (−2.9)
Without Valuation
Leave-one-out ablation
+0.001 (+0.1)+0.004 (+0.4)

If you had kept the best backtest

A common way to choose a strategy is to backtest many and keep the winner. That rewards luck as well as skill. Bailey, Borwein, López de Prado & Zhu (2017) measure how much: split the history into equal blocks of months, and for every way of picking half of them (12,870 ways here, from 16 blocks), take the weighting that did best on that half and see where it ranks on the other half. The probability of backtest overfitting (PBO) is the share of those trials in which the winner lands in the bottom half. Luck alone gives about 0.5; a weighting that is genuinely better pushes it toward 0. This uses the current weighting and the 27 alternatives above, each scored month by month against the current one on the stocks both ranked, and reruns nothing.

0.20
chance the best-looking weighting landed in the bottom half, 2012–2026
0.73
the same over 2020–2026 alone
0.60
every year, with Size alone dropped from the set

Over 2012–2026 the PBO was 0.20, better than luck alone would give, and the winner beat the current weighting on the other half in 80% of trials. But one weighting did most of the winning: Size alone, in 68% of trials. Its lead over the current weighting was +0.027 over 2012–2019 and −0.015 over the held-out months, where it fell behind. That is the Size result above, which survivorship could explain.

Over 2020–2026 alone the PBO was 0.73, worse than a coin toss, and the winner beat the current weighting out of sample in 34% of trials. Drop Size alone from the set and the PBO over every year is 0.60, worse than a coin toss.

So a low reading over the whole history did not survive either check. Keeping the best of many backtests would mostly have picked whatever the history happened to reward, which is why the screener's weights come from published research and every test here is registered before it runs.

What a simple trading rule on the ranking would have done

A rule that holds the top 25, keeps each until it falls past rank 40, skip names flagged as value or growth traps, at most 6 in a sector, 5 basis points of cost a side, rebalanced monthly. It is compared with the equal-weighted average return of the stocks the test could score each month. Those are the members still listed today: 57% of each month's members in 2012, rising to 97% in 2026, so the average leans toward the companies that survived.

PeriodReturn a monthAgainst the average scored stockWorst monthDeepest fallTurnover a year
2012–19+1.24%−0.09% (t −0.67)
95%: −0.36% to +0.18%
−7.98%−14.54%142%
2020–mid-23+0.54%−0.71% (t −2.56)
95%: −1.26% to −0.15%
−17.47%−19.29%170%
mid-23–26+0.91%−0.22% (t −0.55)
95%: −1.05% to +0.60%
−5.30%−7.52%135%

In 2012–2019 it returned 0.09% a month below that average (t −0.67), a gap within the noise. In 2020 – mid-2023 it returned 0.71% a month below that average (t −2.56), a gap larger than chance readily produces. In mid-2023 – 2026 it returned 0.22% a month below that average (t −0.55), a gap within the noise. Read any live record of the ranking next to an equal-weight fund.

The same rule with a 10% stop-loss

One pre-registered variant of the rule above: a holding whose adjusted close ends a day 10% or more below its price at the start of the month is closed out at that close, and its slot stays in cash until the next monthly rebalance. The construction is Han, Zhou & Zhu (2016), Taming Momentum Crashes: A Simple Stop-Loss Strategy (SSRN 2407199) — the one stop-loss rule with published support behind it. It was registered with its prediction before it ran: a less negative worst month and a shallower deepest fall in all three periods, the gap against the average scored stock about unchanged or slightly lower, and turnover higher.

Four differences from the paper are recorded with the rule, each because it changes when the stop fires. The paper triggers on the day’s lowest price where this reads the close, because the daily record carries no intraday range. The paper waits a day and exits at a limit a further 5% down, where this exits at the triggering close. The paper earns Treasury-bill interest on the proceeds, where cash here earns nothing. And the paper’s portfolio is a long-short momentum sort of every listed stock, where this is the long side of a 25-name screen. The registered text is in research/experiments/registry.yaml, with the reading of the paper in research/2026-10-22-stop-loss-on-the-bots-rule.md.
PeriodReturn a monthAgainst the average scored stockWorst monthDeepest fallTurnover a year
2012–19+1.12%−0.21% (t −1.53)
95%: −0.48% to +0.06%
−8.43%−15.19%201%
2020–mid-23+0.59%−0.66% (t −2.23)
95%: −1.25% to −0.06%
−13.95%−18.63%304%
mid-23–26+0.71%−0.42% (t −0.95)
95%: −1.32% to +0.48%
−8.34%−14.05%240%

The prediction half failed. The stop cut both the worst month and the deepest fall in 2020 – mid-2023, and made at least one of them worse in 2012–2019 and mid-2023 – 2026. Turnover rose as predicted, to 1.4x / 1.8x / 1.8x the unstopped rule's. The stop closed 470 positions across the periods shown. A stop exits into a fall and holds cash until the next monthly rebalance, so it trades the falls it escapes for the rebounds it misses, and the periods above disagree about whether that is a good trade. One stop level was tested, 10%, fixed before the test ran and never searched over — a level chosen by what this history happened to reward would tell you nothing.

How long would it take to prove an edge?

48
months of record to show a monthly correlation of 0.05 at the usual 5% level
90
months for the same with a t-statistic of 3
249
months to show 0.03 with a t-statistic of 3

The ranking's monthly correlation swings by about 0.12 from one month to the next, so any monthly ranking of large companies needs years of record before a realistic edge can be told apart from luck. That applies to this screener's live track record too. Here, the smallest difference the test could reliably see was about 0.037 over 2012–2019 and 0.062 over the held-out months.

What this means

Supported

Every factor the screener uses has a published source, and the Factor Lab reruns the studies behind its categories on public data. Every score on the dashboard can be rebuilt from its inputs. The testing is pre-registered and every run is kept.

Not supported

That the ranking beats the market, or that its top names will do better than the rest. On public data it has not been shown to predict returns, and the factor premiums it draws on were mostly weaker after their papers were published and weaker again among large companies.

So the screener is a structured, checkable way to look at a company across eight dimensions. It is not a forecast.

Limits of the test

  • It cannot include the analyst-based inputs (estimate revisions and forward earnings growth, about a sixth of the live weighting): no free history of them exists.
  • Companies that have since left the index are missing, which matters most in the earliest years.
  • Large companies only, rebalanced monthly, with costs approximated and no taxes.