Screen Lab — test any screen against the record

Screen Lab

Test any screen against the record — then see the stocks that match today

Set any filters. You get the record (what happened to every company that met the rule on the day it filed its annual report, held for the period you choose, since 2009), today's list (the stocks that meet the rule now), and the market state today.

Grades. Robust = 150+ entries, very unlikely to be luck, most entries won, worked in both halves of the period, and worked in calm markets too. Probable = unlikely to be luck and worked in both halves. One era only = flipped sign between halves. Otherwise could be luck. Companies with ten-plus years of prices (survivors, so compare screens with each other, not with zero); no costs.
Leave a box empty to ignore it. The link updates so you can share a screen.
Market state today: Calm — the S&P 500 closed 3.1% below its 1-year high (as of 2026-09-16). Our rule, the same one used to split every backtest on this site: sell-off = 10% or more below the 1-year high, borderline from 5%, calm otherwise. A further 7.2% fall from here would put us in a sell-off. Since 2006 the market has been in a sell-off 16.6% of the time, across 13 episodes (red bands).
2007200920112013201520172019202120232025
S&P 500 (SPY, adjusted) distance from its trailing 1-year high, weekly. Amber band: borderline (−5% to −10%). Red band: sell-off (below −10%). The dot is today. History to 2026-08-19 from the research database; today from the live feed.
Backtest · point in time · 8,702 entries in the study

Your screen, tested

Screen tested: P/B ≤ 0.6 · non-financials · bought the day of the annual report, held 12 months
Robust Buy every company that met this screen on the day it filed its annual report, hold 12 months: on average it beat the S&P 500 by +32.7 pts (328 entries, 123 companies, very unlikely to be luck). 59% of entries beat the S&P; 34% beat it by 30 points or more; 25% trailed it by 20 points or more. Owning everything instead averaged +1.7 pts, so the screen's edge is +31.0 pts.
+32.7 ptsvs S&P, average
59%beat the S&P
34%up 30+ pts vs S&P
25%down 20+ pts vs S&P
+32.4 ptsvs small caps, 12 mo
−23.3 pts 2019worst year to buy ?
5.2luck check ?
Does the holding period matter?3 mo: +7.6 pts 53% beat6 mo: +11.2 pts 54% beat12 mo: +32.7 pts 59% beat24 mo: +50.3 pts 58% beat3 yr, per yr: +10.6 pts 49% beat
Market state at entryCompany-yearsvs S&P 12 movs small caps
Calm ◀ today269+20.7 pts t 4.2+22.0 pts
Sell-off (S&P ≥10% off high)59+87.4 pts t 3.3+79.7 pts
Sector (SEC group)nvs S&P 12 mo3 yrs / yr
Industrials & manufacturing91+39.1 pts t 3.8+8.4 pts
Tech hardware & semis39+15.2 pts t 0.9+2.3 pts
Other38+6.1 pts t 0.7+11.8 pts
Energy36+30.1 pts t 1.7+8.6 pts

Holds up out of sample? Before 2018: +21.1 pts (n 148, t 5.6). From 2018: +42.3 pts (n 180, t 3.8). Same sign in both halves.

Year2010201120122013201420152016201720182019202020212022202320242025
vs S&P+14 pts+8 pts+22 pts+17 pts+20 pts+7 pts+41 pts+25 pts+6 pts−23 pts+141 pts+19 pts+30 pts−9 pts+6 pts+57 pts
n5133522162025121119411120282327

Test your own combination in the Screen Lab →

Every filter is applied point-in-time at each annual-report date. Point-in-time: each entry is one company bought at the first close after its 10-K filing date, using only filings available that day, held 12 months; result = total return minus SPY over the same months (vs IWM for 12 months; 3-yr annualised). Survivorship-tilted universe; no costs; read spreads, not levels. Educational, hypothetical, before costs.

Live · today · 6,990 stocks indexed

Stocks that match this screen today (446)

The backtest above is history: what past companies did after meeting these filters at their annual-report date. This list is the same rule applied to today's filings and prices — the names a follower of this screen would be looking at now. Common stock only; secondary listings, warrants and units are removed.

No stock in our coverage meets all of these filters today.

Entry. One company, bought the day it filed its annual report, held for the chosen period. A company that qualified in five different years is five entries.
vs S&P. The entry's return minus the S&P 500's return over the same months, in percentage points.
Beat the S&P / up 30+ / down 20+. The share of entries that did better than the S&P; that beat it by 30 points or more; that trailed it by 20 points or more.
Holding period. Tested, not assumed. The row under each result shows the same screen held 3, 6, 12, 24 and 36 months. A screen that only works at one length is a coincidence of the length.
Calm / sell-off. The market on the day of purchase. Sell-off = S&P 500 10% or more below its 1-year high.
Out of sample. The years are cut in half. "Screens that work" were found on the first half only and then checked on the second half, which the search never saw.

Three lists, one yardstick

1 · Screens that work Found by a pre-declared search on filings before 2017, then confirmed on filings from 2017 onward that the search never saw. The numbers shown are the confirmation half only — the honest ones.
2 · The graveyard Screens that passed the same search in the first half and failed the confirmation. Almost always the same lesson: a positive average carried by a few winners while the typical case lost.
3 · The screens we publish Our named screens read over the whole period, both halves together, with the gates. That is why "P/B ≤ 0.6" shows more cases and a different average here than in list 1: it is the full record, not the confirmation half.

1 · Screens that work — found by search, confirmed out of sample

How this list is made (monthly, run 2026-09-11). We declared a grid of 518,320 screens in advance — every combination of price-to-book cap, dividend-yield floor, NCAV floor, owner-earnings IRR floor and yield cap, quality and insider filters, size band and sector. 249 of them had at least 120 company-years in both halves of the period. Each was tested on filings before 2017 only; 50 passed there (very unlikely to be luck, most entries won, and a 5% false-discovery rate across all 249 — the correction for having looked at so many). Those were then checked on filings from 2017 onward, which the search never saw: 11 confirmed (positive average, most entries won, positive in calm markets, and still positive when held 6 or 24 months instead of 12), 39 did not. Simpler screens are listed first. This is the difference between a screen that worked and a screen that was found.
ScreenRulesDiscovery (before 2017)Confirmation (from 2017)
navgtnavg vs S&P, 12 mobeat S&P · up 30+ · down 20+held 6 mo · 24 movs small capscalm / sell-off
P/B ≤ 0.6 · non-financials1136+20.85.5192+41.2 t 3.954% · 36% · 34%+9.9 · +63.3+41.3+20.7 / +92.1
P/B ≤ 0.8 · non-financials1243+16.45.5365+28.5 t 4.654% · 32% · 32%+8.6 · +40.1+30.0+14.2 / +80.8
P/B ≤ 0.8 · under $2B · non-financials2194+19.65.6293+35.8 t 4.857% · 35% · 32%+11.7 · +54.1+36.8+19.5 / +91.9
P/B ≤ 0.8 · F-score ≥ 5 · non-financials2133+12.43.5174+31.1 t 3.755% · 34% · 32%+10.7 · +41.1+31.2+22.1 / +56.8
P/B ≤ 1 · yield ≥ 2% · non-financials2134+9.53.6185+14.4 t 2.952% · 26% · 29%+3.5 · +17.4+17.3+11.6 / +22.5
yield ≥ 4% · F-score ≥ 5 · non-financials2191+7.53.4302+5.0 t 1.751% · 18% · 25%+1.1 · +4.7+7.5+4.8 / +6.2
P/B ≤ 1 · F-score ≥ 5 · under $2B · non-financials3151+14.74.0233+23.7 t 3.650% · 32% · 35%+9.5 · +49.7+25.8+18.8 / +38.6
P/B ≤ 1.5 · yield ≥ 3% · under $2B · non-financials3123+9.73.6157+12.8 t 2.352% · 25% · 29%+2.4 · +16.4+14.5+7.9 / +27.6
P/B ≤ 1.5 · yield ≥ 2% · under $2B · non-financials3167+9.63.9230+11.7 t 2.853% · 28% · 29%+2.3 · +13.5+13.5+7.4 / +24.4
P/B ≤ 1.5 · yield ≥ 2% · F-score ≥ 5 · non-financials3204+6.23.2274+8.7 t 2.756% · 24% · 27%+1.5 · +6.8+9.7+7.8 / +12.0
P/B ≤ 1.5 · yield ≥ 3% · F-score ≥ 5 · non-financials3140+8.13.9201+7.8 t 1.955% · 21% · 28%+0.5 · +5.2+8.1+7.3 / +9.5

2 · The graveyard — looked great before 2017, failed after

These passed every in-sample gate. Out of sample they did not, and the reason is the lesson. Load one to see its full record and what it would hold today — and why you would not want to.

ScreenBefore 2017: avgAfter: avgAfter: beat S&PWhy it failed
P/B ≤ 1 · under $2B · non-financials+17.8+22.549%after the split most entries lost; a few winners carried the average
P/B ≤ 1.5 · insider buying · under $2B · non-financials+16.2+19.849%after the split most entries lost; a few winners carried the average
P/B ≤ 2 · insider buying · under $2B · non-financials+14.1+16.746%after the split most entries lost; a few winners carried the average
P/B ≤ 1 · non-financials+14.1+17.048%after the split most entries lost; a few winners carried the average
P/B ≤ 2 · OE-IRR ≥ 12% · under $2B · non-financials+13.1+9.148%after the split most entries lost; a few winners carried the average
P/B ≤ 1.5 · under $2B · non-financials+12.0+13.646%after the split most entries lost; a few winners carried the average
P/B ≤ 1.5 · under $2B · Industrials & manufacturing · non-financials+11.8+11.146%after the split most entries lost; a few winners carried the average
P/B ≤ 1.5 · insider buying · non-financials+11.2+13.847%after the split most entries lost; a few winners carried the average
P/B ≤ 1.5 · F-score ≥ 7 · under $2B · non-financials+11.0+12.147%after the split most entries lost; a few winners carried the average
P/B ≤ 1 · F-score ≥ 5 · non-financials+10.8+17.849%after the split most entries lost; a few winners carried the average
P/B ≤ 1.5 · Industrials & manufacturing · non-financials+10.7+8.045%after the split most entries lost; a few winners carried the average
insider buying · under $2B · non-financials+10.6+14.643%after the split most entries lost; a few winners carried the average

Grid declared in advance (518320 screens with at least one factor filter; 249 had ≥120 company-years in both halves). Discovery on filings before 2017: t ≥ 3, median > 0, and a Benjamini–Hochberg false-discovery rate of 5% across all 249 evaluated screens. Confirmation on filings from 2017 onward, which the search never saw: mean > 0, t ≥ 1.5, median > 0, positive in calm markets. Simpler screens listed first. Outcome = 12-month total return minus the S&P 500; confirmed screens must also be positive held 6 and 24 months (the holding period is tested, not assumed).

3 · The screens we publish, on one yardstick

Whole period (both halves), sorted by average. Load any row to see its full record and today's matching stocks; where a screen has its own page (owner earnings, dividends) that page is linked too.

ScreenCompany-yearsAvg vs S&PMedianvs small capsBeat S&PtCalmSell-offBefore / from splitGate
Deep value: P/B ≤ 0.6328+32.7+11.2+32.459%5.2+20.7+87.4+21.1 / +42.3Robust
Net-nets: NCAV ≥ 1× price93+30.5+6.4+31.853%2.0+10.8+176.8+13.2 / +48.9Too few cases
Small-cap value: P/B ≤ 1, under $2B758+20.7+3.2+21.552%6.2+14.0+60.5+18.2 / +22.5Robust
Value: P/B ≤ 1, all sizes988+15.8+2.1+17.051%6.0+10.4+50.6+14.2 / +17.2Robust
Quality value: P/B ≤ 1 with F-score ≥ 6319+13.3+2.5+14.153%3.5+10.2+32.2+10.0 / +16.3Robust
Dividend yield ≥ 8% (the "too good" bucket)193+12.9+2.4+15.153%2.6+10.9+28.3+16.4 / +9.6Probable page →
Cheap with insiders buying: P/B ≤ 1.5 + opportunistic buy in prior 6 months603+12.7+1.0+13.351%4.2+6.3+59.3+11.7 / +13.6Robust
Cheap and paying: P/B ≤ 1.5 with yield ≥ 3%541+6.6+2.3+7.953%3.3+5.6+12.6+8.7 / +4.8Robust
Owner-earnings deep band (IRR 10–30 over Treasuries, yield ≤ 25%)823+2.9−2.3+6.047%1.8+1.9+7.9+5.1 / +1.7Could be luck page →
Owner-earnings: IRR ≥ 12%, yield 6–20%950+2.8−2.3+5.947%1.9+2.0+6.8+7.1 / +0.3Could be luck page →
Dividend yield 3–8%1,271+0.8−0.8+2.648%0.9+1.5−4.2+3.6 / −1.5Could be luck page →
Expensive on book: P/B ≥ 5 (the control)1,815−3.9−7.6+0.140%-3.1−4.9+4.5−4.4 / −3.5No edge
Large-cap value: P/B ≤ 1.5, over $10B187−4.2−7.0−2.340%-2.0−3.5−13.5−4.7 / −3.6No edge

The two owner-earnings rows use the live Treasury yield to set their bands, so their numbers move a little with rates. "Insider buying" rows use Form 4 filing dates (what was public by the annual-report date), never trade dates.