QuanterLab produced this study: it wasn’t written up afterwards. Registered hypothesis and search record in Appendix A2.
As seen on Quantocracy
All research
QuanterLab · Research

Does the Piotroski F-score have anything to find among large caps? The score and each of its signals tested alone on the S&P 500

Universe · S&P 500 (point-in-time constituents)
Method · Comparative: High score, 8 or 9 vs Every scored member
Manipulated variable ·
Two arms open each first of July with the same point-in-time S&P 500 membership, every member scored on the last two annual statements the SEC had accepted on or before the anchor with Piotroski's nine signals (return on assets positive, operating cash flow positive, return on assets up, cash flow a… (full sealed statement)Two arms open each first of July with the same point-in-time S&P 500 membership, every member scored on the last two annual statements the SEC had accepted on or before the anchor with Piotroski's nine signals (return on assets positive, operating cash flow positive, return on assets up, cash flow above earnings, leverage down, current ratio up, no net share issuance, gross margin up, asset turnover up; a signal with missing inputs scores 0). Arm B holds every scored member. Arm A holds only the names scoring 8 or 9 of the nine signals. So the arms differ in one registered field, the book. Every name is bought equal weight at the anchor close and held to the end of the one-year window, dividends reinvested on the ex-date bar from the payment record, 10 basis points paid one way at entry and at exit; a name that stops trading marks flat at its last close and is sold there; fewer than ten names in a book excludes the window.
Step size · 1 year per forward window
In-sample · 2 years before each anchor
Out-of-sample span · 2000-07-03 → 2026-07-01
Compiled · September 12, 2026
Search family · declared family (N = 16, every member reported)
Abstract

Piotroski's F-score is the screen every value investor has run: nine yes-or-no questions on the last two annual statements, a point for each yes, buy the eights and nines. Piotroski (2000) built it for the cheapest fifth of the market by book-to-market, where a positive return on assets was information and the high scorers earned 7.5 percentage points a year more than the group between 1976 and 1996, with the gain in small firms nobody followed. Screeners run it on the S&P 500 today, whose names are large, followed and rarely cheap.

The checks people post run it on today's copy of the statements, restatements included. A buyer on a given day had only the reports the SEC had accepted by then, so that is what the score is built from; for a late filer that is last year's pair.

The S&P 500 is the opposite of Piotroski's sample on both counts that mattered to him, cheapness and the absence of anyone watching, so I expected the score to weaken. What I wanted to see was where it went: whether the whole score goes flat, or some of its nine questions still separate names once the rest have stopped.

I scored every member of the S&P 500 on each first of July from 2000 to 2025 and registered sixteen walks of 26 one-year windows, each a book against every scored member: the high scorers (8 or 9), the low scorers (0 to 3), the perfect nines, each signal's passers alone, and the high and low books again with financials out and again inside the cheapest fifth, Piotroski's own setting. Each window holds the book a year, equal weight, ten basis points each way. Beside the walks sit a census of the score and, as no fund tracks the F-score, three quality funds.

The high scorers did not beat the index they were drawn from. They trailed every scored member over the 26 windows, and in the decade from 2010, where the statements cover almost the whole index, they were ahead in one July of ten with one tied. Inside the cheapest fifth, the fifth beat the whole index while the high scorers inside it did not beat their own fifth. The value half of the recipe shows up in the S&P 500 and the score half does not. The low scorers appear to lead, and the lead is two windows wide: without July 2020 and July 2025 the two books finish level. Of the nine signals one is clear of noise and it points the wrong way. Names whose current ratio rose trailed every scored member, with about one chance in a hundred of having been the better book.

The census says why the rest are noise: the four level signals pass for 75 to 97 percent of S&P 500 names, so a score is decided by five change signals that pass about half the time and do not carry over; a nine this July averages 6.3 the next.

From 2016 the two large-cap quality funds kept pace with SPY and the high book trailed them; none of their screens uses the current ratio. The score was built to find survivors among cheap small firms; on an index of large ones its questions are already answered, and what is left is a year's change.

The nine signals and the books

Piotroski's score asks nine questions of a company's last two annual statements, a point for each yes. Four are about the level of this year's numbers: is the return on assets positive, is the cash flow from operations positive, is that cash flow above the earnings (so the earnings are not made of accruals), and did the company avoid issuing shares. Five are about change on the year before: did the return on assets rise, did the debt ratio fall, did the current ratio rise, did the gross margin rise, did the asset turnover rise. Nine yes answers is the best score; Piotroski called 8 and 9 high and 0 and 1 low. Table 1 lists the nine with how often each passes in the S&P 500.

The signals are computed as he defined them, with one deviation named. He counted any share issuance against a firm; a large company issues a small amount to employees every year, so here the signal fails only when the cash raised from stock issued exceeds the cash spent buying it back, from the cash-flow statement. The debt ratio is long-term debt over average assets and must fall; equal counts as no. A signal whose inputs the vendor's statements do not carry scores zero and is counted: 246 of 10,973 name-years on the current ratio and 28 on the gross margin, banks and insurers. Most financials carry the vendor's current assets and liabilities and are scored on all nine, which is one reason the financials-out walks exist: a bank's current ratio and gross margin are the vendor's constructions, not the company's.

Point in time. The score at each first of July uses the latest annual statement the SEC had accepted on or before that day and the annual statement before it, from the vendor's acceptance dates (the filing date when acceptance is missing, the period end plus 45 days when both are). A statement older than 550 days at the anchor is not used, so a company whose report is late is scored on last year's pair or not at all. This is the score a buyer could have computed that morning, with restatements excluded because they did not exist yet.

The books. High is 8 or 9. Low is 0 to 3, widened from Piotroski's 0 and 1 because the S&P 500 holds almost no zeros and ones: 25 name-years scored 0 or 1 in 26 years against 398 scoring 2 or 3. The perfect nines are 9 exactly, and each signal has a book of its passers. Every book is set against the same reference in the same window, every scored member of the index bought the same way, so each walk asks whether the book did better than buying all of them. Piotroski's own numbers, 7.5 points a year over the cheapest fifth and 23 percent a year long-short, come from a different test, a spread inside that fifth with the low scorers sold short; this paper's test is each book against every scored member of a large-cap index, long only, so the two sets of numbers are not set against each other. Two more cuts run the high and low books again: with Financial Services and Real Estate out of both arms, and inside the cheapest fifth of the scored members by book-to-market at the statement's fiscal year end, the setting the score was published for, with the window floor lowered to five names because that fifth holds 10 high scorers a year on average.

How a window is traded. Buy every name of the book equal weight at the anchor close, hold to the same day a year on, reinvest each dividend into the paying name on its ex-date from the payment record, pay ten basis points on every name at entry and at exit. A name that stops trading marks flat at its last close and is sold there. A window with fewer than ten names in the book (five in the cheapest-fifth walks) is excluded and counted, never filled. The benchmark drawn on the platform's figures is SPY with its distributions reinvested; the reference the paper argues against is every scored member, which is equal weight, and the two differ: equal weight returned 12.05 percent a year against 9.45 for SPY over the 26 windows, most of it from 2000 to 2009.

Table 1. The nine signals as scored here, and how often each passes in the S&P 500, by era

signalmeasurepasses whenas Piotroski wrote it2000 to 2009, %2010 to 2019, %2020 to 2025, %all years, %
1 return on assets positivenet income opening assetsabove zerosame90.192.892.691.7
2 cash flow positivecash from operations assetsabove zerosame94.897.897.496.5
3 return on assets upreturn on assetsabove the year beforesame51.751.549.451.1
4 cash flow above earningscash from operations vs net incomecash flow the largersame87.089.786.287.9
5 debt ratio downlong-term debt average assetsbelow the year beforesame51.550.554.351.8
6 current ratio upcurrent assets current liabilitiesabove the year beforesame48.746.746.547.5
7 no net share issuancestock issued minus repurchasednot positiveany issuance fails67.179.283.075.1
8 gross margin upgross profit revenueabove the year beforesame46.551.950.949.7
9 asset turnover uprevenue opening assetsabove the year beforesame50.147.551.649.3

1  Methodology

Universe. The S&P 500's membership on each first of July from 2000 to 2025, rebuilt from the index's change log, 13,046 member-years. I built the tables twice. The first build guarded against reused tickers by each name's listing date at the vendor, which threw out every company that had gone through bankruptcy and relisted, Peabody, Chesapeake and Diamond Offshore among them, so the second build uses the engine's own rule instead: a ticker the vendor has since reassigned to another company is refused before its reuse, 39 member-years, and no name is scored on another company's statements.

Statements. The vendor's annual income statement, balance sheet and cash-flow statement per company, merged by fiscal period end into one record a year; a record's acceptance date is the latest of its three statements' acceptances, so all three are public before the score is. The score at an anchor needs a current record accepted by the anchor and not older than 550 days, and a prior record 270 to 460 days before it; a third record before that supplies the year-before return on assets and turnover when it exists. The tables were built once on the production engine and frozen; the two study nodes read them and never the network.

Coverage. At each anchor the membership splits into the scored, the names with statements at the vendor but no accepted pair by the anchor, and the names with no statements at the vendor at all. Over the 26 anchors: 10,973 member-years scored of 13,046, 861 with statements but no accepted pair, 1,173 with no statements. Figure 2 and Table 2 carry it by year.

The census. For every scored name-year: the nine bits and the score; the pass rate of each signal by year and by era (Table 1); the mean score, the share scoring 8 or 9 and the share scoring 0 to 3 by year (Table 2) and by the vendor's sector for 2010 on (Table 3); and persistence, the score of the same name a year later, for every name scored in two consecutive Julys (Table 4).

The walks. Sixteen registered studies, one per book, each of 26 one-year windows anchored on the first of July from 2000 to 2025, 416 windows in all, 56 of them excluded for a book under its floor and counted. Two arms in every window: arm A the book, arm B every scored member of the same cut, both bought equal weight at the anchor close and held a year with dividends reinvested, ten basis points one way on every name at entry and at exit. The platform pairs the two arms date by date inside each window and tests the difference: a seeded circular block bootstrap of the mean daily difference, blocks of ten bars, 2,000 paths, 6,524 pairs over the 26 windows of a whole-index walk, gives the probability that A beats B; the paired Sharpe is that mean difference over its standard deviation, annualised. One pre-registered contrast per walk, so no deflation is applied. Two bases appear in the paper and are kept apart: window returns and CAGRs are the run reports' own, from the anchor close; windows led are counted on the platform's paired rows (Table 10), which pair the arms from the bar after the anchor and print returns to a tenth, so a window whose arms differ by under a tenth of a percent is a tie. The sixteen walks are declared as one family on the host, the high book against every scored member, and Figure 1 draws every one of them.

The two cuts. Financials out: the vendor's Financial Services and Real Estate sectors, as labelled today, leave both arms. The cheapest fifth: at each anchor the scored members are ranked by the inverse of the vendor's price-to-book at the scoring statement's fiscal year end, positive book only, and the top fifth is kept for both arms; it holds 55 names in 2000 and 94 in 2025, with the high book inside it at 7 and 14.

The funds, a measurement without a registration record. No fund tracks the F-score. Three funds screen on statement strength: QUAL (MSCI USA Sector Neutral Quality: return on equity, debt to equity, earnings variability, from 2013), SPHQ (S&P 500 Quality: return on equity, accruals ratio, debt ratio; the ticker carried a Value Line timeliness fund until 2010 and S&P's earnings-and-dividend quality rankings until 2016, so its record here starts in 2016) and QVAL (Alpha Architect's Quantitative Value: the cheapest names by operating earnings over enterprise value, screened on a financial-strength score built on Piotroski's signals, financials left out as in this paper's own cut, from 2014). Each is taken as total return with its distributions reinvested at the ex-date close from the payment record, on the walks' own windows from its first full July, beside the high book, every scored member and SPY from the run reports; Figure 3 chains the windows from July 2016, the first all three funds ran the screens they run today.

2  Results

2.1  Headline

High score, 8 or 9, Sharpe
0.58
own daily series, stitched across the windows
Every scored member, Sharpe
0.63
own daily series, stitched across the windows
The statistic this paper stands on
Scored on the two annual statements the SEC had accepted by each first of July, the S&P 500 names with 8 or 9 of Piotroski's nine signals returned 10.86 percent a year against 12.05 for every scored member, ahead in 11 of 26 windows with one tied, and in one of the ten from 2010 to 2019. A nine in July averages 6.3 the next July. The one signal clear of noise, a rising current ratio, points the wrong way: about one chance in a hundred of being the better book.

This paper answers for a declared family of 16 sealed studies. 16 member walks are drawn as 32 lines (a comparative walk contributes one line per arm), each chained across its own out-of-sample windows, on one calendar axis, all rebased to 1× on the first session they share. 6 of them are shown to start, the ones the paper reads by; the others are switched off until their name is clicked. The paper’s own walk is the heavy line; the dashed grey line is the study’s own benchmark.

Every member walk chained across its out-of-sample windows, growth of 10.00x5.76x11.51x200120042007201020132016201920222025low score, 0 to 3 · Low score, 0 to 3signal 6, current ratio up · Signal 6, current ratio upsignal 9, asset turnover up · Signal 9, asset turnover upthe perfect nines · The perfect ninesplatform reference (SPY)high score, 8 or 9 · High score, 8 or 9high score, 8 or 9 · Every scored member
Figure 1. The declared family: 32 lines, one per walk and one per arm of a comparative walk, 6 shown to start; the dashed grey line is the study’s own benchmark, platform reference (SPY), on the paper’s own windows (+678.1%). Growth of 1 on the left axis, every line rebased to 1× on 2004-07-01, the first session all of them share; a line that ran earlier shows those windows to the left of that base. A flat stretch in a line is a window that walk refused (too few names for its floor): the chain carries nothing across it, so the line holds its level until the walk resumed. The family table prints each walk over its own windows. Click a name to show or hide its line.
Each July's S&P 500 membership split into the names the vendor's statements score (two accepted annual statements by the anchor), the names with statements but no accepted pair, and the names with no statements at the vendor, which left the index. Above each bar, the counts at 8 or 9 and at 0 to 3.
Figure 2. Each July's S&P 500 membership split into the names the vendor's statements score (two accepted annual statements by the anchor), the names with statements but no accepted pair, and the names with no statements at the vendor, which left the index. Above each bar, the counts at 8 or 9 and at 0 to 3.
Growth of 1 from July 2016 on the walks' own windows: the high book and every scored member net of costs, SPY, and three quality funds as total return, distributions reinvested. No fund tracks the F-score; these screen on return on equity, accruals, debt and, at QVAL, a Piotroski-type score.
Figure 3. Growth of 1 from July 2016 on the walks' own windows: the high book and every scored member net of costs, SPY, and three quality funds as total return, distributions reinvested. No fund tracks the F-score; these screen on return on equity, accruals, debt and, at QVAL, a Piotroski-type score.

Table 2. Coverage: how much of each July's S&P 500 the vendor's statements can score (every other year; Figure 2 has all)

Julymembersscoredscored, %statements, no pairno statementsmean scorescoring 8 or 9scoring 0 to 3all nine
200049628156.7821306.0344125
200249630160.7841085.1811271
200449733266.864986.20571815
200650035571.056866.06611412
200850138977.641685.7742306
201050141783.235475.7450259
201250143586.829366.1966912
201450145190.021286.157288
201650647794.315135.7651286
201850649197.0786.22771019
202050649898.4716.0078156
202250550399.6206.591351126
202450550299.4306.341221125
202550550399.6206.251091320

Table 3. The score by sector, 2010 to 2025, name-years pooled (the vendor's sector as of today)

sectorname-yearsmean scorescoring 8 or 9, %scoring 0 to 3, %
Financial Services10706.0714.33.1
Technology9896.2320.42.6
Industrials9886.2417.71.5
Consumer Cyclical9106.1820.04.1
Healthcare9016.1615.81.7
Consumer Defensive5746.2418.81.4
Energy4655.7815.99.5
Utilities4415.574.83.2
Real Estate4125.9210.01.5
Basic Materials3716.0819.94.0
Communication Services2966.1417.63.4
unknown1715.898.85.8

Table 4. Where a score goes the next July: name-years scored in two consecutive Julys

score this Julyname-yearsmean score next Julynext July 8 or 9, %next July 4 to 7, %next July 0 to 3, %
1194.11
2745.12
32765.46
49525.76
522425.91
627416.05
723246.16
812656.24
92736.33
the high book, 8 or 9153819.877.82.4
the middle, 4 to 7825914.582.03.5
the low book, 0 to 337010.075.114.9

Table 5. The score books walked: one registered one-year window each July, 2000 to 2025, mean window return net of costs

bookevery scored member ofwindows countednames a yearbook, %every scored member, %windows book led, paired rowsbook CAGR, %every member CAGR, %p book beats, %paired Sharpe
high score, 8 or 9whole index26 of 266210.8612.0511 (1 tied)9.7910.8615.3-0.19
high, financials outfinancials out26 of 265411.0712.411210.0111.3214.1-0.21
high, cheapest fifthcheapest fifth19 of 26109.209.9486.427.1139.0-0.06
low score, 0 to 3whole index19 of 261716.7213.87913.4612.6183.80.21
low, financials outfinancials out13 of 261619.2016.76714.6615.1769.50.14
low, cheapest fifthcheapest fifth11 of 26818.1817.17514.8614.3683.70.25
the perfect nineswhole index12 of 261611.039.2859.948.6277.90.22

Table 6. The nine signals walked one at a time: the passers against every scored member, 26 windows each, net of costs

signalpassers a yearpassers, %every scored member, %windows passers led, paired rowspassers CAGR, %every member CAGR, %gap, pp a yearp passers beat, %paired Sharpe
1, return on assets positive36811.7512.051110.6010.86-0.309.3-0.27
2, cash flow positive38712.0312.0513 (2 tied)10.8710.860.0036.5-0.06
3, return on assets up20311.4712.051110.3810.86-0.5012.4-0.20
4, cash flow above earnings35112.2012.0515 (1 tied)11.0710.860.2082.50.16
5, debt ratio down20812.0812.0512 (1 tied)10.8210.86-0.0050.5-0.00
6, current ratio up18811.2312.0511 (2 tied)10.0310.86-0.801.3-0.42
7, no net share issuance30612.2312.0516 (1 tied)11.0410.860.2064.80.08
8, gross margin up20011.7712.051510.7310.86-0.1034.7-0.06
9, asset turnover up19712.4912.051311.3010.860.4077.50.15

Table 7. By era: the high and low books, every scored member and SPY, mean window return net of costs, windows led (paired)

erawindowshigh 8 or 9, %every scored member, %SPY, %high led memberhigh led SPYlow 0 to 3, % (windows)every member on those, %low led membernames positive, high / all %max drawdown, high / all %
2000 to 2009106.647.79-0.576912.08 (7)8.49 (7)458.7 60.8-16.3 -16.8
2010 to 20191011.3713.1314.161 (1 tied)211.01 (6)16.66 (6)165.6 69.0-15.2 -13.8
2020 to 2025617.0417.3718.304327.83 (6)17.37 (6)466.2 65.6-13.6 -13.5
2000 to 20252610.8612.059.4511 (1 tied)1416.72 (19)13.87 (19)963.1 65.0-15.3 -14.9

Table 8. The quality funds against the books on the walks' own windows, and growth of 1 from July 2016

linescreens onfromwindowsline, % a yearhigh 8 or 9, %every scored member, %SPY, %high led linegrowth from 2016from 2016, % a year
QUAL, MSCI USA QualityROE, debt to equity, stable earnings20141213.9810.6312.0914.113 of 123.82x14.33
SPHQ, S&P 500 QualityROE, accruals ratio, debt ratio20161016.0912.0613.6815.884 of 104.16x15.31
QVAL, US Quantitative Valuecheapness, Piotroski-type strength20151110.9611.0712.5614.725 of 113.06x11.85
high score, 8 or 9, net2016102.85x11.05
every scored member, net2016103.30x12.69
SPY, distributions reinvested2016104.12x15.20

2.2  Per-step results

Table 9. One row per step, raw out-of-sample results. A short window can pair a negative return with a positive annualised Sharpe: at high daily volatility the arithmetic mean of daily returns sits above the compounded window return, and the Sharpe reads the former. Volatility drag, printed rather than smoothed.
#Out-of-sample window High score, 8 or 9 SR Every scored member SR
1 2000-07-03 → 2001-06-29 0.15 1.08
2 2001-07-02 → 2002-07-01 0.31 0.02
3 2002-07-01 → 2003-07-01 -0.21 0.24
4 2003-07-01 → 2004-06-30 1.61 2.13
5 2004-07-01 → 2005-07-01 1.39 1.28
6 2005-07-01 → 2006-06-30 1.12 1.18
7 2006-07-03 → 2007-06-29 1.60 1.72
8 2007-07-02 → 2008-06-30 -0.08 -0.65
9 2008-07-01 → 2009-07-01 -0.42 -0.37
10 2009-07-01 → 2010-07-01 1.13 1.03
11 2010-07-01 → 2011-07-01 2.56 2.10
12 2011-07-01 → 2012-06-29 0.06 0.09
13 2012-07-02 → 2013-07-01 1.83 1.94
14 2013-07-01 → 2014-07-01 1.89 2.16
15 2014-07-01 → 2015-07-01 0.52 0.62
16 2015-07-01 → 2016-06-30 0.16 0.17
17 2016-07-01 → 2017-06-30 1.32 1.76
18 2017-07-03 → 2018-06-29 0.79 1.02
19 2018-07-02 → 2019-07-01 0.59 0.65
20 2019-07-01 → 2020-06-30 -0.11 0.03
21 2020-07-01 → 2021-07-01 2.65 2.61
22 2021-07-01 → 2022-07-01 -0.24 -0.35
23 2022-07-01 → 2023-06-30 0.81 0.74
24 2023-07-03 → 2024-06-28 1.11 1.04
25 2024-07-01 → 2025-07-01 0.89 0.85
26 2025-07-01 → 2026-07-01 1.13 1.64
Out-of-sample equity: normalised growth (1.00x = break even)0.49x1.04x1.59xbars into the window →
Figure 4. High score, 8 or 9: every step's out-of-sample curve overlaid, each rebased to 1× at its own start. Read alongside the per-step table: consistent shape across steps is the walk-forward's evidence; a single lucky leg is not.
Out-of-sample equity: normalised growth (1.00x = break even)0.43x1.03x1.62xbars into the window →
Figure 5. Every scored member: the same windows, the other arm. Compare shape-for-shape with the previous figure: the two arms trade the identical out-of-sample legs.

2.2b  The family, walk by walk

Figure 1 draws these walks; here is every one of them in numbers, the paper’s own walk first and the study’s benchmark last.

WalkWindowsSpanGrowth CAGRWorst drawdownPooled Sharpe
high score, 8 or 9 · High score, 8 or 9 (this paper) 26 2000-07-03 → 2026-07-01 +1034.6% +9.8% -48.0% 0.59
high score, 8 or 9 · Every scored member (this paper) 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
high score, 8 or 9, cheapest fifth by book-to-market · High score, 8 or 9, cheapest fifth by book-to-market 19 (7 excluded) 2002-07-01 → 2026-07-01 +226.1% +5.0% -59.6% 0.38
high score, 8 or 9, cheapest fifth by book-to-market · Every scored member of the cheapest fifth 19 (7 excluded) 2002-07-01 → 2026-07-01 +268.7% +5.6% -69.0% 0.40
high score, 8 or 9, financials out · High score, 8 or 9, financials out 26 2000-07-03 → 2026-07-01 +1095.2% +10.0% -48.7% 0.60
high score, 8 or 9, financials out · Every scored member, financials out 26 2000-07-03 → 2026-07-01 +1524.2% +11.3% -52.4% 0.67
low score, 0 to 3 · Low score, 0 to 3 19 (7 excluded) 2000-07-03 → 2026-07-01 +1001.9% +9.7% -65.2% 0.58
low score, 0 to 3 · Every scored member 19 (7 excluded) 2000-07-03 → 2026-07-01 +855.3% +9.1% -51.0% 0.71
low score, 0 to 3, cheapest fifth by book-to-market · Low score, 0 to 3, cheapest fifth by book-to-market 11 (15 excluded) 2002-07-01 → 2024-06-28 +359.1% +7.2% -69.7% 0.55
low score, 0 to 3, cheapest fifth by book-to-market · Every scored member of the cheapest fifth 11 (15 excluded) 2002-07-01 → 2024-06-28 +337.5% +6.9% -62.2% 0.63
low score, 0 to 3, financials out · Low score, 0 to 3, financials out 13 (13 excluded) 2002-07-01 → 2026-07-01 +491.9% +7.7% -63.4% 0.61
low score, 0 to 3, financials out · Every scored member, financials out 13 (13 excluded) 2002-07-01 → 2026-07-01 +527.3% +8.0% -47.7% 0.85
signal 1, return on assets positive · Signal 1, return on assets positive 26 2000-07-03 → 2026-07-01 +1273.4% +10.6% -57.0% 0.63
signal 1, return on assets positive · Every scored member 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
signal 2, cash flow positive · Signal 2, cash flow positive 26 2000-07-03 → 2026-07-01 +1361.3% +10.9% -56.6% 0.64
signal 2, cash flow positive · Every scored member 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
signal 3, return on assets up · Signal 3, return on assets up 26 2000-07-03 → 2026-07-01 +1203.4% +10.4% -55.5% 0.62
signal 3, return on assets up · Every scored member 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
signal 4, cash flow above earnings · Signal 4, cash flow above earnings 26 2000-07-03 → 2026-07-01 +1431.4% +11.1% -55.2% 0.65
signal 4, cash flow above earnings · Every scored member 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
signal 5, leverage down · Signal 5, leverage down 26 2000-07-03 → 2026-07-01 +1344.9% +10.8% -57.9% 0.62
signal 5, leverage down · Every scored member 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
signal 6, current ratio up · Signal 6, current ratio up 26 2000-07-03 → 2026-07-01 +1101.2% +10.0% -56.8% 0.60
signal 6, current ratio up · Every scored member 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
signal 7, no net share issuance · Signal 7, no net share issuance 26 2000-07-03 → 2026-07-01 +1423.3% +11.0% -56.9% 0.65
signal 7, no net share issuance · Every scored member 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
signal 8, gross margin up · Signal 8, gross margin up 26 2000-07-03 → 2026-07-01 +1316.1% +10.7% -54.6% 0.63
signal 8, gross margin up · Every scored member 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
signal 9, asset turnover up · Signal 9, asset turnover up 26 2000-07-03 → 2026-07-01 +1516.1% +11.3% -57.9% 0.66
signal 9, asset turnover up · Every scored member 26 2000-07-03 → 2026-07-01 +1358.0% +10.9% -57.7% 0.63
the perfect nines · The perfect nines 12 (14 excluded) 2004-07-01 → 2026-07-01 +211.9% +5.3% -52.6% 0.54
the perfect nines · Every scored member 12 (14 excluded) 2004-07-01 → 2026-07-01 +169.8% +4.6% -38.6% 0.54
platform reference (SPY) (benchmark) 2000-07-03 → 2026-07-01 +678.1% +8.2% -55.3%

Growth and CAGR above are each walk over its own windows, so they are not comparable across walks with different window counts: a walk that excluded a window did not live through it. The figure rebases every line on the session all of them share.

2.3  Search accounting

This paper's search is a declared family: a declared family, counted at N = 16 evaluated books. Every member is either a registered walk with its own sealed hypothesis and frozen record, or a derived average computed from those frozen records; every member is reported, in the family matrix table and the robustness figure, and none was selected away. The count is declared by the author rather than derived from one project's ledger, because the members are sibling registered studies; the declaration names them and is frozen in this artifact. What the source strategy's author searched before publishing is not knowable from here and is not counted. The registered per-step record below still guarantees each window's hypothesis was hashed and registered before that window was scored.

2.4  The comparison

Both arms trade the same registered windows, so their returns can be PAIRED: inside each window the two return series are inner-joined date by date and the difference rHigh score, 8 or 9 − rEvery scored member is the object under test. Because this is ONE pre-declared contrast, frozen at registration before any window was scored, the paired statistic needs no multiple-testing deflation; the arm-level records carry the declared family count of §2.3 as their search accounting, and this contrast, sealed per window before scoring, is not multiplied by it.

In the table: Arm A = High score, 8 or 9 · Arm B = Every scored member.

Table 10. Window-by-window paired comparison. Δ is the growth gap (Arm A − Arm B) over the window's paired dates.
#WindowPaired bars Arm AArm B ΔLeader
1 2000-07-05 → 2001-06-29 250 +1.0% +16.5% -15.5 pp Arm B
2 2001-07-03 → 2002-07-01 247 +3.7% -1.0% +4.7 pp Arm A
3 2002-07-02 → 2003-07-01 252 -8.1% +2.9% -11.0 pp Arm B
4 2003-07-02 → 2004-06-30 251 +22.6% +29.5% -6.9 pp Arm B
5 2004-07-02 → 2005-07-01 253 +17.3% +15.2% +2.1 pp Arm A
6 2005-07-05 → 2006-06-30 251 +13.6% +13.8% -0.2 pp Arm B
7 2006-07-05 → 2007-06-29 249 +20.2% +19.7% +0.4 pp Arm A
8 2007-07-03 → 2008-06-30 251 -3.9% -14.8% +10.9 pp Arm A
9 2008-07-02 → 2009-07-01 252 -22.2% -25.8% +3.6 pp Arm A
10 2009-07-02 → 2010-07-01 252 +23.2% +23.0% +0.2 pp Arm A
11 2010-07-02 → 2011-07-01 253 +38.1% +37.3% +0.8 pp Arm A
12 2011-07-05 → 2012-06-29 251 -2.0% -1.0% -1.1 pp Arm B
13 2012-07-03 → 2013-07-01 249 +28.4% +28.4% +0.0 pp tie
14 2013-07-02 → 2014-07-01 252 +24.4% +26.2% -1.8 pp Arm B
15 2014-07-02 → 2015-07-01 252 +5.9% +7.1% -1.2 pp Arm B
16 2015-07-02 → 2016-06-30 252 +1.3% +1.4% -0.1 pp Arm B
17 2016-07-05 → 2017-06-30 251 +12.4% +17.8% -5.4 pp Arm B
18 2017-07-05 → 2018-06-29 250 +9.3% +11.8% -2.5 pp Arm B
19 2018-07-03 → 2019-07-01 250 +8.3% +8.5% -0.2 pp Arm B
20 2019-07-02 → 2020-06-30 252 -11.3% -5.1% -6.2 pp Arm B
21 2020-07-02 → 2021-07-01 252 +50.3% +52.5% -2.3 pp Arm B
22 2021-07-02 → 2022-07-01 252 -6.1% -7.8% +1.7 pp Arm A
23 2022-07-05 → 2023-06-30 250 +15.2% +13.2% +2.0 pp Arm A
24 2023-07-05 → 2024-06-28 249 +13.0% +11.9% +1.1 pp Arm A
25 2024-07-02 → 2025-07-01 250 +15.2% +14.2% +1.0 pp Arm A
26 2025-07-02 → 2026-07-01 251 +15.3% +20.9% -5.5 pp Arm B

Paired Sharpe of the difference track: -0.19 · block bootstrap (2000 paths, block 10, seed 1234): P(High score, 8 or 9 beats Every scored member) = 15.3%.

Window win-rate. High score, 8 or 9 led 11 of 26 windows (42.3%), Every scored member led 14, and 1 windows were ties, and the mean window gap of -1.20 pp points the same way. Widest single window: 2000 at -15.5 pp.

Table 11. The same comparison split at 2010. Pooling the whole walk into one row hides which side of the split the difference came from.
PeriodWindows High score, 8 or 9Every scored member Mean gapHigh score, 8 or 9 led
All windows 26 +10.97% +12.17% -1.20 pp 11/26
Before 2010 10 +6.74% +7.90% -1.16 pp 6/10
2010 onward 16 +13.61% +14.83% -1.22 pp 5/16
All windowsn=26 · High score, 8 or 9 led 11 · Every scored member led 14 · ties 1+11.0%+12.2%-1.20 ppBefore 2010n=10 · High score, 8 or 9 led 6 · Every scored member led 4 · ties 0+6.7%+7.9%-1.16 pp2010 onwardn=16 · High score, 8 or 9 led 5 · Every scored member led 10 · ties 1+13.6%+14.8%-1.22 ppgap
Figure 6. Mean window return per period. High score, 8 or 9 above, Every scored member below, with the gap at right. The pooled bar and the post-2010 bar are the same comparison over different periods.

3  The circuit

The strategy is a circuit of platform primitives, frozen when the study is registered. Below is the circuit as wired on the canvas, the objective it encodes and how the search runs through it, followed by the mathematics each primitive actually computes, the same formulas the execution engine runs. The complete parameterisation is preserved in the study ledger (Appendix A).

The hypothesis under test

The sentence below is the registration record, generated when the circuit was sealed and printed verbatim; the authored description of the design is Section 1.

A COMPARATIVE study: High score, 8 or 9 vs Every scored member, walked on the same registered out-of-sample windows. High score, 8 or 9: S&P 500, evaluated, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. Every scored member: S&P 500, evaluated, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. The arms differ in: Piotroski F-score book (PIT), book: high → all. The contrast under test: whether High score, 8 or 9 generates better risk-adjusted returns than Every scored member over the identical out-of-sample windows.

The two blocks this study runs on, the F-score book and the one-year hold, were written for it as custom primitives on the engine, the way a user writes one on the desktop. They read a frozen table of scores built once from the vendor's annual statements with their SEC acceptance dates, and they run on any universe such a table is built for. Universe and Autopsy are the platform's own.

The frozen circuit, data flows left to rightuniverse: click for detailsuniversecustom fscore book: click for detailscustom fscore bookcustom fscore hold: click for detailscustom fscore holdportfolio forward autopsy: click for detailsportfolio forward autopsyuniverse: click for detailsuniversecustom fscore book: click for detailscustom fscore bookcustom fscore hold: click for detailscustom fscore holdportfolio forward autopsy: click for detailsportfolio forward autopsyHigh score, 8 or 9Every scored membershared
Figure 7. The frozen circuit, every node a primitive, every wire a typed data-flow; the two arms are colour-coded (High score, 8 or 9 green, Every scored member blue, shared feeds neutral). Each box is one step of the strategy; data flows along the wires left to right, and no box can see data dated later than the box feeding it. The whole diagram was frozen when the hypothesis was registered. Click any node to open what that step ran with and what it produced.

Envelopes show counts, ratios, dates, and the parameters the author chose. Full price and per-name data series are not republished: the underlying market data is licensed to QuanterLab. Point figures quoted in the prose, a named holding's return over a stated span, are summary facts derived from public market prices, not redistributed series.

What each part does
Universe, The starting set of tickers, resolved point-in-time from the index change-log, so names delisted or removed later still compete on the dates they traded.
Portfolio Forward Autopsy, The post-mortem, where the forward test’s return actually came from.

The objective and the search

High score, 8 or 9

UniverseS&P 500 index constituents.
Validation & out-of-sampleheld forward test (every wired name bought equal weight at the anchor close and held to the end of the one-year window, dividends reinvested on the ex-date, 10.0 basis points one way at entry and at exit).
Other componentsStudy: Hold the book a year, Piotroski F-score book (PIT).

Every scored member

The specification is identical to High score, 8 or 9's table above, row for row; the one sealed difference between the arms is itemized below.

What differs between the arms, one difference; the comparison is clean:

  • paramPiotroski F-score book (PIT), book: high → all

Everything else is held identical, so an out-of-sample gap between the arms is attributable to this one change.

Cost elements are wired into the circuit, the realised drag is reported per step in Appendix B.

Show the mathematics, 2 primitives, formulas and parity notes

3.1  Universe

The starting set of tickers, resolved point-in-time from the index change-log, so names delisted or removed later still compete on the dates they traded.

Before any math, you need a list of stocks. An index preset (S&P 500, Nasdaq-100, Dow 30) is reconstructed as it stood ON your anchor date by replaying the historical add/drop change-log backwards, so a 2018 backtest sees the 2018 membership, not today's winners.

Point-in-time membership

Start from today's constituents and un-apply every membership change after the anchor t:

\mathcal{U}(t) = \mathcal{U}_{\text{now}} \;\ominus\; \{\text{adds after } t\} \;\oplus\; \{\text{drops after } t\}
Constituents resolved from the index change-log; the same point-in-time set the factor + screening modules use.

3.2  Portfolio Forward Autopsy

The post-mortem, where the forward test’s return actually came from.

Runs after the Portfolio Forward Test and dissects its realized path: per-rebalance contributions, winners and losers, exposure and cash periods, and how the realized route compares to what the risk cones projected. It computes nothing new about the future, it explains the past the book just lived.

Reading it

Depth I–IV: headline attribution, per-segment breakdown, per-name contributions, and the calibration ledger (projected cone vs realized, segment by segment). In a study, this is the node that fills the appendices.

4  Discussion

4.1  Findings

Over 10,973 scored name-years the mean score is 6.03 (Tables 1 and 4). The four level signals pass for most names: 92 percent have a positive return on assets, 96 positive cash flow from operations, 88 cash flow above earnings, 75 no net share issuance. The five change signals pass between 48 and 52 percent of the time, and they do not carry: a name in the high book this July is in it again next July 19.8 percent of the time, against 14.5 percent for a name from the middle, and a name scoring 9 scores 6.3 on average a year later. The low book carries a little more, 14.9 percent of low scorers are low again against 3.5 percent of the middle. The size of the high book is a market variable, not a company one: 11 names scored 8 or 9 in July 2002 and 135 in July 2022, because the change signals count improvement and after a good year for everybody everybody improved.

By sector from 2010 (Table 3), Utilities score lowest, a mean of 5.57 with 4.8 percent of name-years at 8 or 9 against 16.3 for the index, because a utility's turnover and margin barely move; Energy has the most low scorers, 9.5 percent of name-years against 2.6 for Technology, because its return on assets and debt ratio swing with the oil price. Industrials and Consumer Defensive score highest at 6.24.

In July 2000 the vendor's statements score 281 of the 496 members, 56.7 percent (Figure 2, Table 2); 130 members have no statements at the vendor at all and 82 have statements but no accepted pair by the anchor. The scored share passes 83 percent in 2010 and reaches 99.6 percent in July 2025. The names without statements are the names that left the index and the vendor never carried, so the first decade is scored on the survivors, and the limitations say which way that leans.

The names scoring 8 or 9 (Table 5, Figure 1), 62 a year on average, returned 10.86 percent per window net against 12.05 for every scored member, gross 11.08 against 12.28, so costs took 0.22 on either side. On the platform's paired rows the book led in 11 of 26 windows with one tied, July 2012, where the two arms sit within a tenth of a point; on the run reports' own window returns that July falls the book's way and the count is 12. It beat SPY in 14 windows; every scored member beat SPY in 13. By era (Table 7): 6.64 against 7.79 from 2000 to 2009, ahead in 6 of 10; 11.37 against 13.13 from 2010 to 2019, ahead in 1 of 10 with the tie; 17.04 against 17.37 from 2020, ahead in 4 of 6. The decade where the statements cover the index is the decade the book did worst against it. The paired bootstrap puts the probability that the high book is the better book at 15.3 percent, paired Sharpe -0.19, a gap of -1.10 points of CAGR. In the 6 windows where every scored member lost money the high book led in 4, and its three widest leads are three of them, July 2001, 2007 and 2008; its three widest misses are July 2000, 2002 and 2003. The share of names that ended the year up is 63.1 percent in the book against 65.0 in the index, and the mean drawdown inside a window 15.3 percent against 14.9: the high scorers are the same set of large caps with a few names taken out, and carry the same drawdown. Taking financials out does not change it: 11.07 against 12.41, ahead in 12 of 26, probability 14.1 percent.

Ranked by book-to-market at the statement's fiscal year end, the cheapest fifth of the scored members did better than the whole index on the 19 windows where it held five or more high scorers, 9.94 against 9.44, with SPY at 9.80 on the same windows. The high scorers inside it, 10 names a year, returned 9.20 against 9.94 for every scored member of the fifth, ahead in 8 of the 19, probability 39.0 percent, and the other 7 windows had fewer than five names. The value half of Piotroski's recipe shows up in the S&P 500, and the score half, applied on top of it, does not; a book of ten names a year is too small to carry a paper, which is why this is the second finding and not the first.

One signal of the nine is clear of noise and it hurts (Table 6). The names whose current ratio rose, 188 a year, returned 11.23 against 12.05 for every scored member, a paired Sharpe of -0.42 and a 1.3 percent probability of being the better book. On the paired rows they led in 11 of 26 with two tied, so the drag is small and steady, -0.80 points of CAGR, rather than large and occasional; the widest windows against them were 2025 and 2000. Three signals lean the other way without settling: cash flow above earnings, 82.5 percent probability and 0.20 points; asset turnover up, 77.5 percent and 0.40 points; no net share issuance, 64.8 percent and 0.20 points, ahead in 16 of 26 windows with one tied, the most of any book. A positive return on assets and a rising one sit at 9.3 and 12.4 percent: the names failing them, the loss-makers, one name in twelve, and the half whose return on assets fell, did better than the index, which is the low book's story again. Positive cash flow, debt ratio down and gross margin up are the index within a tenth of a point. The three quality funds people hold instead of a score screen on the level of profitability and on debt, SPHQ on accruals too, and none of them on the current ratio: the industry dropped the one signal with a measurable drag before this paper measured it.

The names scoring 0 to 3, 17 a year on average, returned 16.72 against 13.87 for every scored member on the 19 windows where the book had ten names (it had fewer in 6 Julys, 2005, 2007, 2012, 2014, 2015, 2019, and in 2006 it had 12 but too few with forward prices). It led in 9 of the 19, probability 83.8 percent, paired Sharpe 0.21. The lead is two windows wide: July 2020 (81.7 against 52.4) and July 2025 (48.5 against 20.8), and without those two the book returned 11.03 against 11.20. Its mean drawdown inside a window is 20.9 percent against 15.0 for the index. By era it led in 4 of 7 windows from 2000 to 2009, 1 of 6 from 2010 to 2019, and 4 of 6 from 2020, the rebound years. Inside the cheapest fifth, 18.18 against 17.17 on 11 windows; with financials out, 19.20 against 16.76 on 13. The perfect nines, 16 names on 12 windows, returned 11.03 against 9.28, ahead in 5, with one window each way of twenty points: 2007 and 2019.

On the walks' own windows from its first full July (Table 8, Figure 3), QUAL returned 13.98 percent a year against 10.63 for the high book and 14.11 for SPY over 12 windows, and the high book led it in 3; SPHQ from 2016, 16.09 against 12.06 and 15.88 over 10 windows, the high book ahead in 4; QVAL, the fund with a Piotroski-type screen inside it, 10.96 against 11.07 and 14.72 over 11 windows. Chained from July 2016 (Figure 3): SPHQ 4.16x, SPY 4.12x, QUAL 3.82x, every scored member 3.30x, QVAL 3.06x, the high book 2.85x. The two large-cap quality funds are SPY with a tilt. The book of high scorers is the equal-weight index with a few names removed, and equal weight trailed SPY over those years.

4.2  Interpretation

Piotroski wrote nine questions for firms the market had priced for trouble, where a positive return on assets or a positive cash flow was information. In the S&P 500 those are answered yes by 92 and 96 percent of names, and the score comes down to five questions about last year's change that pass about half the time and do not persist. A book of high scorers is then the index minus the loss-makers, the issuers and the names that had a bad year, held for the year after. It holds up when the index falls, its three widest leads are three of the 6 windows in which every scored member lost money, and it trails when the names it left out bounce, July 2002 and 2003 after the 2002 low. Its widest miss is July 2000, 0.9 percent against 16.4 for every scored member: the statements that had improved most in 1999 belonged to the technology names about to fall, and the book held Technology at 18 percent of its names against 9 for the index. Over the whole record the book returns about a point a year less than the index it is drawn from.

The low book has the same problem running the other way. A score of 0 to 3 at a company that stays in the S&P 500 is usually one bad year, not a firm on its way out, and the year after a bad year is a good one when the whole market is recovering: the book's lead is July 2020 and July 2025, and without them it returned 11.03 against 11.20. In the covered decade, 2010 to 2019, it led in 1 of 6 windows. This is the opposite of Piotroski's sample, where the low scorers were the firms that went on to delist; the index membership rule has already removed those.

Cash flow above earnings, the accruals signal, is Sloan (1996) restated as a bit, and it leans the right way at 82.5 percent; asset turnover up and no net issuance lean the same way. A large company whose current assets grew faster than its current liabilities usually built inventory or receivables or sat on cash, which in a firm with no funding problem is idle capital, and the signal was written for firms whose problem was funding.

Piotroski and So (2012) showed that the score pays where the price disagrees with the statements, cheap names with strong fundamentals and expensive names with weak ones. The S&P 500 is mostly priced for the quality it has, and the one cut here that adds the disagreement, the cheapest fifth, is too small in this index to carry a book, ten high scorers a year, and did not beat its own fifth. Mohanram (2005) had to write a separate score for growth stocks because the F-score's questions do not carry to low book-to-market firms; most of the S&P 500 sits there.

What would change the conclusion is a broader universe, where the cheapest fifth holds a few hundred names and some of them are in trouble, which is where the score was born; a long-short test, which needs a borrow model this record does not carry; and point-in-time sector labels, which would move a few names across the financials line. None of these would change what the census shows, that in this index the score is one year's change and does not carry over. The two nodes written for this study, the F-score book and the one-year hold, stay on the platform with the tables they read, so a reader with an account can wire them to a universe of their own and rerun the census and the sixteen walks on it. The broad-universe walk is the next one to run.

This study is one member of a declared search family: the same design walked at several sealed settings across sibling registered projects, every member either a registered walk with its own frozen record or a derived average of those records, and every member reported. The family size is declared by the author and named in the lineage; it is the search-accounting count for this paper. What was searched before the source strategy was published is not knowable from here and is not counted.

4.3  Limitations

The vendor holds no statements for 1,173 member-years, 130 of the 496 members in July 2000 and none by 2022, and it prices none of the names that left the index and it no longer carries. Those are the names that were acquired or delisted, and Piotroski's own finding is that low scorers delist more often, so the first decade's low book is missing the names most likely to have gone to zero and its lead there is flattered; the reference is flattered the same way, less. In 2006 the low book had 12 names and fewer than ten with forward prices, and that window is excluded rather than filled. From 2010 the hole is under a fifth of the index and from 2018 under a twentieth, and the results the paper leans on, the high book's record and the signal-by-signal walks, hold in the covered years as they do in the whole record.

The score is computed from the vendor's fields as it maps them, and a bank's current assets are the vendor's construction; the financials-out cut is the check. The sector labels are the vendor's as of today, not as of the anchor. Price-to-book for the cheapest fifth is the vendor's figure at the statement's fiscal year end, so the ranking is a few months stale at the anchor and uses the fiscal-year-end price. Costs are a flat ten basis points one way on every name, not quoted spreads; the names are large caps and the books turn over once a year, so the cost line is small either way, 0.22 percent a year on the high book. Taxes are not modelled. The walks are long only, and Piotroski's long-short number is not reproduced. The reference arm is equal weight and the funds are cap weighted, so Table 8 compares two weightings as well as two screens. SPHQ's record before 2016 belongs to other indices and is left out.

References

QuanterLab reference architecture
  1. Gelman, A., & Loken, E. (2013). The garden of forking paths: Why multiple comparisons can be a problem, even when there is no “fishing expedition.” Working paper, Columbia University.
  2. Harvey, C. R., Liu, Y., & Zhu, H. (2016). … and the Cross-Section of Expected Returns. Review of Financial Studies, 29(1), 5–68. doi:10.1093/rfs/hhv059
  3. Lo, A. W. (2002). The Statistics of Sharpe Ratios. Financial Analysts Journal, 58(4), 36–52. doi:10.2469/faj.v58.n4.2453
Author’s references?
  1. Piotroski (2000), Value investing: the use of historical financial statement information to separate winners from losers, Journal of Accounting Research: nine binary signals from the statements; among the highest book-to-market fifth, the high scorers earned 7.5 percentage points a year over the group between 1976 and 1996, a long-short of 23 percent, concentrated in small firms with no analyst fo
  2. Sloan (1996), Do stock prices fully reflect information in accruals and cash flows about future earnings?, The Accounting Review: firms whose earnings are made of accruals rather than cash flow earn lower returns after, the mechanism behind signal 4.
  3. Mohanram (2005), Separating winners from losers among low book-to-market stocks using financial statement analysis, Review of Accounting Studies: a separate score for growth stocks, because the value screen's signals do not carry to low book-to-market firms.
  4. Piotroski and So (2012), Identifying expectation errors in value/glamour strategies: a fundamental analysis approach, Review of Financial Studies: the score's returns concentrate where price and fundamentals disagree, cheap names with strong statements and expensive names with weak ones.
  5. Novy-Marx (2013), The other side of value: the gross profitability premium, Journal of Financial Economics: the level of gross profits over assets predicts returns about as well as book-to-market; the score uses the change in gross margin, which is a different quantity.
  6. Gray and Carlisle (2012), Quantitative Value, Wiley: the financial-strength score built on Piotroski's signals that sits inside the Quantitative Value fund's screen.

Appendix A  Reproducibility in QuanterLab

Each step is backed by a frozen run report. The study is re-derivable from the ledger below.

#CommitReportAnchorOOS window
1 b9697978a521 9022 2000-07-01 2000-07-03 → 2001-06-29
2 c55d06bd4a91 9023 2001-07-01 2001-07-02 → 2002-07-01
3 321ea9b0e3f2 9024 2002-07-01 2002-07-01 → 2003-07-01
4 942ca442aed7 9025 2003-07-01 2003-07-01 → 2004-06-30
5 13c16592153c 9026 2004-07-01 2004-07-01 → 2005-07-01
6 44d70a12363c 9027 2005-07-01 2005-07-01 → 2006-06-30
7 ac07c5fb8411 9028 2006-07-01 2006-07-03 → 2007-06-29
8 84ecfbd1a6f8 9029 2007-07-01 2007-07-02 → 2008-06-30
9 aa1f7c703121 9032 2008-07-01 2008-07-01 → 2009-07-01
10 c4c4ed2b390b 9034 2009-07-01 2009-07-01 → 2010-07-01
11 522dc59524a6 9037 2010-07-01 2010-07-01 → 2011-07-01
12 1d4cbe4eaf4f 9039 2011-07-01 2011-07-01 → 2012-06-29
13 bf694e16bdf5 9041 2012-07-01 2012-07-02 → 2013-07-01
14 ca79b1208439 9043 2013-07-01 2013-07-01 → 2014-07-01
15 ae736ea34941 9045 2014-07-01 2014-07-01 → 2015-07-01
16 afd3759ed866 9047 2015-07-01 2015-07-01 → 2016-06-30
17 026fc6f2355e 9055 2016-07-01 2016-07-01 → 2017-06-30
18 602353eb3cab 9061 2017-07-01 2017-07-03 → 2018-06-29
19 330ce25f0c44 9067 2018-07-01 2018-07-02 → 2019-07-01
20 a0f41c7b48b6 9072 2019-07-01 2019-07-01 → 2020-06-30
21 b196d0d9c505 9076 2020-07-01 2020-07-01 → 2021-07-01
22 fcdcceefb825 9081 2021-07-01 2021-07-01 → 2022-07-01
23 2c7678a991b8 9085 2022-07-01 2022-07-01 → 2023-06-30
24 17afa677507c 9087 2023-07-01 2023-07-03 → 2024-06-28
25 f8d778f6d467 9092 2024-07-01 2024-07-01 → 2025-07-01
26 cae72d4eb753 9096 2025-07-01 2025-07-01 → 2026-07-01

Appendix A2  Registration record

What this record does and does not establish. Every window in this study is historical: the data existed before the study began, so this is sequential sealing on past windows, not pre-registration in the clinical-trial sense, and no procedure could make it so. What the platform does enforce is order, each step's specification was frozen and hashed before that step was scored, and the walk cannot advance past a step that was never run or close one with a result registered for a different window. The two timestamp columns below are the evidence: read them together and each seal precedes its own run, and each run precedes the next seal. A study whose seals all post-date its runs would show it here. Wall-clock spacing between seals varies with the author's schedule and queue latency; the ordering, not the tempo, is the claim.

“A COMPARATIVE study: High score, 8 or 9 vs Every scored member, walked on the same registered out-of-sample windows. High score, 8 or 9: S&P 500, evaluated, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. Every scored member: S&P 500, evaluated, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. The arms differ in: Piotroski F-score book (PIT), book: high → all. The contrast under test: whether High score, 8 or 9 generates better risk-adjusted returns than Every scored member over the identical out-of-sample windows.”

The same hypothesis was registered independently at every step, hashed before each step's out-of-sample window was scored:

Table 12. Registration audit, one row per registered step, with the time each specification was frozen and the time its window was scored. The hypothesis is identical on every row by design: it was registered once and re-registered unchanged at each anchor. Rows that differ would mean the specification moved mid-walk, which is the thing this record exists to rule out. The timestamps are the separate claim: each seal precedes its own run, and each run precedes the next seal.
#AnchorRegistered at (UTC)Run completed (UTC)
1 2000-07-012026-09-12 11:47:06 2026-09-12 11:47:42
2 2001-07-012026-09-12 11:47:42 2026-09-12 11:47:54
3 2002-07-012026-09-12 11:47:54 2026-09-12 11:48:06
4 2003-07-012026-09-12 11:48:06 2026-09-12 11:48:18
5 2004-07-012026-09-12 11:48:18 2026-09-12 11:48:31
6 2005-07-012026-09-12 11:48:31 2026-09-12 11:48:43
7 2006-07-012026-09-12 11:48:43 2026-09-12 11:48:55
8 2007-07-012026-09-12 11:48:55 2026-09-12 11:49:07
9 2008-07-012026-09-12 11:49:07 2026-09-12 11:49:32
10 2009-07-012026-09-12 11:49:32 2026-09-12 11:49:44
11 2010-07-012026-09-12 11:49:44 2026-09-12 11:50:08
12 2011-07-012026-09-12 11:50:09 2026-09-12 11:50:21
13 2012-07-012026-09-12 11:50:21 2026-09-12 11:50:33
14 2013-07-012026-09-12 11:50:33 2026-09-12 11:50:45
15 2014-07-012026-09-12 11:50:46 2026-09-12 11:50:58
16 2015-07-012026-09-12 11:50:58 2026-09-12 11:51:10
17 2016-07-012026-09-12 11:51:10 2026-09-12 11:51:59
18 2017-07-012026-09-12 11:51:59 2026-09-12 11:52:35
19 2018-07-012026-09-12 11:52:36 2026-09-12 11:53:24
20 2019-07-012026-09-12 11:53:24 2026-09-12 11:54:01
21 2020-07-012026-09-12 11:54:01 2026-09-12 11:54:37
22 2021-07-012026-09-12 11:54:37 2026-09-12 11:55:14
23 2022-07-012026-09-12 11:55:14 2026-09-12 11:55:50
24 2023-07-012026-09-12 11:55:50 2026-09-12 11:56:15
25 2024-07-012026-09-12 11:56:15 2026-09-12 11:56:51
26 2025-07-012026-09-12 11:56:52 2026-09-12 11:57:28

Appendix B  Per-step diagnostics

Realized in the projection tables below is the risk engine scoring its own forecast: the buy-and-hold return of the segment that followed each rebalance, on the same gross basis the cone was projected on. It is deliberately not the charged, calendar-window total return the study’s tables print, so the two will not reconcile line by line; the cone and its outcome share one basis, which is what a calibration test requires. Each row names its segment’s span so a boundary session is visible.

Names held is the union across the window: the count of distinct instruments the book touched between the window’s first and last session, not the number it held at one time. A book that rotates monthly touches more names than it holds.

What each step's run actually did beyond its return: capital allocation across lanes and regimes, the portfolio book's rebalancing and cost drag, and how positions were sized. Harvested from the frozen run reports, present where the circuit produced them.

Open the full per-step grid (26 steps: every rebalance, capital routing and sizing, per window)

Step 1 · 2000-07-03 → 2001-06-29

High score, 8 or 9

Portfolio book, rebalanced hold · 39 names held · selection: anchor · 5.1% in cash · cost drag 0.202% · 2 names dropped at load (41 selected, 39 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 259 names held · selection: anchor · 5.8% in cash · cost drag 0.233% · 15 names dropped at load (274 selected, 259 held across the window), weights renormalised onto the rest

Step 2 · 2001-07-02 → 2002-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 27 names held · selection: anchor · 0.0% in cash · cost drag 0.207%

Every scored member

Portfolio book, rebalanced hold · 277 names held · selection: anchor · 5.4% in cash · cost drag 0.198% · 15 names dropped at load (292 selected, 277 held across the window), weights renormalised onto the rest

Step 3 · 2002-07-01 → 2003-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 11 names held · selection: anchor · 9.1% in cash · cost drag 0.184% · 1 name dropped at load (12 selected, 11 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 281 names held · selection: anchor · 5.7% in cash · cost drag 0.206% · 16 names dropped at load (297 selected, 281 held across the window), weights renormalised onto the rest

Step 4 · 2003-07-01 → 2004-06-30

High score, 8 or 9

Portfolio book, rebalanced hold · 25 names held · selection: anchor · 0.0% in cash · cost drag 0.245%

Every scored member

Portfolio book, rebalanced hold · 295 names held · selection: anchor · 2.7% in cash · cost drag 0.259% · 8 names dropped at load (303 selected, 295 held across the window), weights renormalised onto the rest

Step 5 · 2004-07-01 → 2005-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 52 names held · selection: anchor · 0.0% in cash · cost drag 0.235%

Every scored member

Portfolio book, rebalanced hold · 305 names held · selection: anchor · 2.6% in cash · cost drag 0.23% · 8 names dropped at load (313 selected, 305 held across the window), weights renormalised onto the rest

Step 6 · 2005-07-01 → 2006-06-30

High score, 8 or 9

Portfolio book, rebalanced hold · 60 names held · selection: anchor · 1.7% in cash · cost drag 0.227% · 1 name dropped at load (61 selected, 60 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 310 names held · selection: anchor · 2.9% in cash · cost drag 0.228% · 9 names dropped at load (319 selected, 310 held across the window), weights renormalised onto the rest

Step 7 · 2006-07-03 → 2007-06-29

High score, 8 or 9

Portfolio book, rebalanced hold · 61 names held · selection: anchor · 3.3% in cash · cost drag 0.24% · 2 names dropped at load (63 selected, 61 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 330 names held · selection: anchor · 3.3% in cash · cost drag 0.24% · 11 names dropped at load (341 selected, 330 held across the window), weights renormalised onto the rest

Step 8 · 2007-07-02 → 2008-06-30

High score, 8 or 9

Portfolio book, rebalanced hold · 57 names held · selection: anchor · 1.8% in cash · cost drag 0.192% · 1 name dropped at load (58 selected, 57 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 349 names held · selection: anchor · 3.2% in cash · cost drag 0.171% · 11 names dropped at load (360 selected, 349 held across the window), weights renormalised onto the rest

Step 9 · 2008-07-01 → 2009-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 39 names held · selection: anchor · 2.6% in cash · cost drag 0.156% · 1 name dropped at load (40 selected, 39 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 366 names held · selection: anchor · 4.6% in cash · cost drag 0.148% · 17 names dropped at load (383 selected, 366 held across the window), weights renormalised onto the rest

Step 10 · 2009-07-01 → 2010-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 38 names held · selection: anchor · 0.0% in cash · cost drag 0.247%

Every scored member

Portfolio book, rebalanced hold · 384 names held · selection: anchor · 3.1% in cash · cost drag 0.246% · 12 names dropped at load (396 selected, 384 held across the window), weights renormalised onto the rest

Step 11 · 2010-07-01 → 2011-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 48 names held · selection: anchor · 0.0% in cash · cost drag 0.276%

Every scored member

Portfolio book, rebalanced hold · 398 names held · selection: anchor · 2.8% in cash · cost drag 0.275% · 11 names dropped at load (409 selected, 398 held across the window), weights renormalised onto the rest

Step 12 · 2011-07-01 → 2012-06-29

High score, 8 or 9

Portfolio book, rebalanced hold · 91 names held · selection: anchor · 0.0% in cash · cost drag 0.196%

Every scored member

Portfolio book, rebalanced hold · 405 names held · selection: anchor · 2.7% in cash · cost drag 0.198% · 11 names dropped at load (416 selected, 405 held across the window), weights renormalised onto the rest

Step 13 · 2012-07-02 → 2013-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 62 names held · selection: anchor · 0.0% in cash · cost drag 0.257%

Every scored member

Portfolio book, rebalanced hold · 415 names held · selection: anchor · 2.2% in cash · cost drag 0.257% · 9 names dropped at load (424 selected, 415 held across the window), weights renormalised onto the rest

Step 14 · 2013-07-01 → 2014-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 51 names held · selection: anchor · 0.0% in cash · cost drag 0.249%

Every scored member

Portfolio book, rebalanced hold · 421 names held · selection: anchor · 1.9% in cash · cost drag 0.252% · 8 names dropped at load (429 selected, 421 held across the window), weights renormalised onto the rest

Step 15 · 2014-07-01 → 2015-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 70 names held · selection: anchor · 0.0% in cash · cost drag 0.212%

Every scored member

Portfolio book, rebalanced hold · 429 names held · selection: anchor · 2.1% in cash · cost drag 0.214% · 9 names dropped at load (438 selected, 429 held across the window), weights renormalised onto the rest

Step 16 · 2015-07-01 → 2016-06-30

High score, 8 or 9

Portfolio book, rebalanced hold · 72 names held · selection: anchor · 2.8% in cash · cost drag 0.203% · 2 names dropped at load (74 selected, 72 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 442 names held · selection: anchor · 1.8% in cash · cost drag 0.203% · 8 names dropped at load (450 selected, 442 held across the window), weights renormalised onto the rest

Step 17 · 2016-07-01 → 2017-06-30

High score, 8 or 9

Portfolio book, rebalanced hold · 49 names held · selection: anchor · 0.0% in cash · cost drag 0.225%

Every scored member

Portfolio book, rebalanced hold · 465 names held · selection: anchor · 1.1% in cash · cost drag 0.236% · 5 names dropped at load (470 selected, 465 held across the window), weights renormalised onto the rest

Step 18 · 2017-07-03 → 2018-06-29

High score, 8 or 9

Portfolio book, rebalanced hold · 64 names held · selection: anchor · 1.6% in cash · cost drag 0.219% · 1 name dropped at load (65 selected, 64 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 473 names held · selection: anchor · 0.8% in cash · cost drag 0.224% · 4 names dropped at load (477 selected, 473 held across the window), weights renormalised onto the rest

Step 19 · 2018-07-02 → 2019-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 77 names held · selection: anchor · 0.0% in cash · cost drag 0.217%

Every scored member

Portfolio book, rebalanced hold · 483 names held · selection: anchor · 0.4% in cash · cost drag 0.217% · 2 names dropped at load (485 selected, 483 held across the window), weights renormalised onto the rest

Step 20 · 2019-07-01 → 2020-06-30

High score, 8 or 9

Portfolio book, rebalanced hold · 77 names held · selection: anchor · 0.0% in cash · cost drag 0.177%

Every scored member

Portfolio book, rebalanced hold · 492 names held · selection: anchor · 0.4% in cash · cost drag 0.19% · 2 names dropped at load (494 selected, 492 held across the window), weights renormalised onto the rest

Step 21 · 2020-07-01 → 2021-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 77 names held · selection: anchor · 0.0% in cash · cost drag 0.301%

Every scored member

Portfolio book, rebalanced hold · 493 names held · selection: anchor · 0.2% in cash · cost drag 0.305% · 1 name dropped at load (494 selected, 493 held across the window), weights renormalised onto the rest

Step 22 · 2021-07-01 → 2022-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 51 names held · selection: anchor · 0.0% in cash · cost drag 0.188%

Every scored member

Portfolio book, rebalanced hold · 496 names held · selection: anchor · 0.0% in cash · cost drag 0.184%

Step 23 · 2022-07-01 → 2023-06-30

High score, 8 or 9

Portfolio book, rebalanced hold · 134 names held · selection: anchor · 0.7% in cash · cost drag 0.231% · 1 name dropped at load (135 selected, 134 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 497 names held · selection: anchor · 0.4% in cash · cost drag 0.226% · 2 names dropped at load (499 selected, 497 held across the window), weights renormalised onto the rest

Step 24 · 2023-07-03 → 2024-06-28

High score, 8 or 9

Portfolio book, rebalanced hold · 62 names held · selection: anchor · 0.0% in cash · cost drag 0.226%

Every scored member

Portfolio book, rebalanced hold · 497 names held · selection: anchor · 0.0% in cash · cost drag 0.224%

Step 25 · 2024-07-01 → 2025-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 122 names held · selection: anchor · 0.0% in cash · cost drag 0.231%

Every scored member

Portfolio book, rebalanced hold · 497 names held · selection: anchor · 0.2% in cash · cost drag 0.228% · 1 name dropped at load (498 selected, 497 held across the window), weights renormalised onto the rest

Step 26 · 2025-07-01 → 2026-07-01

High score, 8 or 9

Portfolio book, rebalanced hold · 109 names held · selection: anchor · 0.9% in cash · cost drag 0.231% · 1 name dropped at load (110 selected, 109 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 496 names held · selection: anchor · 0.4% in cash · cost drag 0.242% · 2 names dropped at load (498 selected, 496 held across the window), weights renormalised onto the rest

QuanterLab · Study f582abf48ead · compiled September 12, 2026. Point-in-time constituents and hypothesis-registration timestamps are enforced by the platform. This report is generated from the frozen study artifact and is reproducible from the ledger above. Educational research, not investment advice: every result on this page is simulated, and nothing here is a recommendation to buy or sell any security.

Run a study like this one

Everything above was produced inside QuanterLab, the registration, the walk, the statistics and the paper itself. Build the circuit on a canvas, register the hypothesis before you score it, and the platform enforces the rest.

The lab is in private beta and opens in September 2026. Reading the research needs no account, follow it and we'll tell you when the next study publishes.

As seen on Quantocracy

A note on AI. QuanterLab is a quantitative finance research platform, and every number in this study comes from a run on the platform. The hypothesis, the parameter choices, the validation design and the conclusions belong to the author. Runs execute on point-in-time data with walk-forward validation, and each study ships with its methodology and logs, so a reader can reconstruct the result instead of trusting it. I use AI to edit and structure the prose; it does not generate results, produce numbers, or decide what a study concludes.