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.
- Not measurably. In plain terms: the companies it ranked higher did not go on to do measurably better the next month than the companies it ranked lower — not in either period, and not over the whole record. No edge has been shown. The ranking's average monthly rank correlation with the next month's return was −0.002 over 2012–2019 (95% interval −0.022 to +0.018) and 0.000 over 2020–2026 (95% interval −0.028 to +0.027). Pooled over all 176 months it was −0.001 (95% interval −0.018 to +0.015). Every interval includes zero. The pooled record could reliably detect an average of about 0.032 at a t-statistic of 3, and no smaller.
The ranking’s average monthly rank correlation with the next month’s return, and its 95% interval. The scale runs from −1 to +1; 0, the vertical line, is no relation at all. The ranking2012–2019−0.002−0.022 to +0.0182020–20260.000−0.028 to +0.027All months, pooled176 months−0.001−0.018 to +0.015The check: can this test see an edge at all?A ranking that cheatsgiven today’s filings for every past month; its lead over the real one+0.051−0.06−0.030+0.03+0.06average 95% interval the cheating ranking’s lead smallest the test could reliably detect no relation - No alternative did better. None of the 27 alternative weightings cleared the bar set before the test, in either period.
- The test can see a signal when there is one. Fed the filings as they stand today for every past month — information nobody had at the time — the same test puts that ranking +0.051 of rank correlation a month ahead of the real one over 80 months (t +5.6), against the +0.037 it could reliably detect. So the flat results above are a finding about the ranking, not a test that cannot see anything.
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:
- 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.
- 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.
- 3The years 2012–2019 were set aside as an untouched test, with the rule for passing it, before any of that data was built.
- 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)† 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
| Alternative | Mid-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.
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.
| Period | Return a month | Against the average scored stock | Worst month | Deepest fall | Turnover 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.
research/experiments/registry.yaml, with the reading of the paper in research/2026-10-22-stop-loss-on-the-bots-rule.md.| Period | Return a month | Against the average scored stock | Worst month | Deepest fall | Turnover 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?
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.