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 Altman’s Z-score formula still tell you anything about today’s S&P 500? Altman’s three zones tested apart

Universe · S&P 500 (point-in-time constituents)
Method · Comparative: The safe zone 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 outside banking and insurance scored on the last statements the SEC had accepted on or before the anchor (the trailing four quarters' flows and the latest balance sheet, the market value at the anchor) with… (full sealed statement)Two arms open each first of July with the same point-in-time S&P 500 membership, every member outside banking and insurance scored on the last statements the SEC had accepted on or before the anchor (the trailing four quarters' flows and the latest balance sheet, the market value at the anchor) with Altman's 1968 Z: working capital, retained earnings, EBIT and sales each over total assets and the market value of equity over total liabilities, weighted 1.2, 1.4, 3.3, 0.6 and 1.0; the distress zone below 1.81, the safe zone above 2.99. Arm B holds every scored member. Arm A holds only the names in the safe zone of the 1968 model. So the arms differ in one registered field, the zone. 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 22, 2026
Search family · declared family (N = 6, every member reported)
Abstract

In 1968 Edward Altman took sixty-six manufacturers, half of which had gone bankrupt, and found five numbers from their accounts that together told the two halves apart. His Z-score is still taught, and it is now used for a different job: as a quality screen, a way of choosing which shares to own. The reasoning is easy to follow. A low score means trouble, so a high score should mean a sound company, and sound companies should be good to own.

On the whole US market that reasoning has held: the most distressed companies earned less than the rest. It has not been checked the way the score is used on large companies today. So we ran it on the S&P 500. Every July from 2006 to 2025 we scored every member outside banking and insurance on the accounts the SEC had accepted by that morning, sorted them into Altman's three zones, bought each zone in equal parts and held it for a year. Each zone is set against every scored company in the index, bought the same way in the same year, so the only difference between the two books is the score.

Nothing separates them on returns. Each zone finished ahead of the companies it came from in eight to eleven of the twenty years, which is what a coin does, and the second published form of the score gives the same answer. They came apart in the two worst years, 2008 and the pandemic, when the safe zone fell least and the distress zone most. A reader looking for the zone to own will not find one here.

What the score does sort is the kind of business. In July 2025 about half the distress zone was utilities and property companies: regulated, asset-heavy businesses that borrow on purpose and have kept little of their past profit. The safe zone held the large technology companies. The score reads the shape of a balance sheet, which is what Altman built it to read. In this index that shape is a business model, not a warning.

What the score asks, and what it was built for

The score asks five questions of one balance sheet and one income statement, and each answer is a ratio. How much spare short-term money does the company have, against everything it owns (working capital over assets). How much of its past profit has it kept rather than paid out (retained earnings over assets). How much does the business earn before interest and tax, against what it owns (operating income over assets). What is the stock market's price for the whole company, against what the company owes (market value of equity over total liabilities). And how much does it sell for every dollar of assets it holds (sales over assets).

Altman weighted those five and added them up. Above 2.99 the company sits in what he called the safe zone, below 1.81 in the distress zone, and in between is a grey zone he was explicit about: the formula does not know. Every one of those weights and both of those edges are numbers you can change on the card that computes this; we left them where he published them.

The formula does the job it was built for, and this paper leaves that job alone. It tests the step people take after it: treating the safe zone as a buy list and the distress zone as a list to avoid. That step has been checked on the whole US market, where Dichev (1998) and Campbell, Hilscher and Szilagyi (2008) found the most distressed companies earned less than the rest. It has not been checked the way the score is used on large companies today: on the index as it stood each July, from the statements that were public that morning, held for a year and repeated.

Table 1. The six walks over the twenty windows from July 2006, and the six earlier windows beside them

BookScore formNames, averageCompounded, % a yearReference compounded, %Gap compounded, pointsGap in the average yearYears ahead of 20Chance it was better, %Gap, 2000 to 2005Years ahead of 6
The safe zonethe 1968 model18111.010.7+0.26+0.068 of 2051-4.000 of 6
The grey zonethe 1968 model9310.410.7-0.31-0.1010 of 2045+2.633 of 6
The distress zonethe 1968 model10610.210.7-0.56-0.1511 of 2045+3.785 of 6
Z'' the safe zonethe Z'' model21210.710.7-0.03+0.019 of 2050-1.223 of 6
Z'' the grey zonethe Z'' model9910.810.7+0.06+0.009 of 2050+1.435 of 6
Z'' the distress zonethe Z'' model6910.310.7-0.41-0.098 of 2047+2.823 of 6

1  Methodology

The universe. The S&P 500's membership on the first of July of each year, rebuilt from the index's own change log, so a company is in a year's test only if it was in the index that morning. The paper's windows are the twenty from July 2006, the anchor every other study on this site uses. The six registered windows before that are reported in Table 1 and Table 3 and claimed nowhere, for the coverage reason the limitations give.

The score. For each company, the statements the SEC had accepted on or before the anchor: the flows over the last four quarters that were public, the balance sheet from the latest of them, and the market value from the anchor's own closing price and the share count on the latest statement. A company whose statements do not carry a line the formula needs is left unscored and counted. Banks and insurers are left unscored by design, because these five ratios do not describe a balance sheet made of loans: 53 of the index in 2006 and 67 in 2025. The scored set grew from 285 companies in July 2006 to 431 in July 2025, mostly as the price record filled in (Table 4).

The books. Three, one per zone, on Altman's published edges, plus the same three on the Z'' form: six registered walks in all. In every window the zone is arm A and every scored company of the same index is arm B, bought the same way on the same morning, so the two arms differ in one thing and it is the cut. That second book is the only ruler this paper uses, and it holds the zone's own names too. An index fund would make a poor ruler here, because it is weighted by company size and holds names this test cannot price.

The trade. Every name in the book bought in equal parts at the anchor close and held to the same day a year later, each dividend reinvested into the company that paid it on its ex-date, ten basis points paid on every name at entry and at exit. A company that stops trading marks at its last close and is sold there. A window holding fewer than ten names would be excluded and counted; none was.

The test. Each walk was registered before it ran: its circuit, its anchors and its claim were written down and frozen first. The platform pairs the two arms day by day inside each window and asks how often the zone was the better book: a seeded block bootstrap over 6,524 paired days of all twenty-six registered windows. One comparison per walk, decided in advance. Table 1 prints a different number, taken over the twenty yearly gaps this paper reads, 20,000 resamples on a fixed seed; the platform's own tables below print the day-by-day one.

Two ways of averaging, kept apart. Compounded means the growth of one dollar through the twenty windows, annualised; the average year is the plain average of the twenty window returns. A book that swings more compounds to less off the same average year, which is why the two disagree, and every gap in this paper says which one it is on. The platform's own tables below cover all twenty-six registered windows and recompute the arms over the days they both traded, so their figures sit above these and are not the same quantity.

2  Results

2.1  Headline

The safe zone, Sharpe
0.62
own daily series, stitched across the windows
Every scored member, Sharpe
0.65
own daily series, stitched across the windows
The statistic this paper stands on
Over twenty years from July 2006 each of Altman’s three zones finished ahead of the companies it came from in eight to eleven of the twenty, which is what a coin does, and both forms of the score agree. What it does sort is the kind of business: 49 of the 102 companies in its distress zone in July 2025 were utilities or property firms. The card beside this reads all twenty-six registered windows; the paper reads the twenty from 2006, for the reason the limitations give.

This paper answers for a declared family of 6 sealed studies. 6 member walks are drawn as 12 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. 5 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.00x4.45x8.89x2007200920112013201520172019202120232025Z'' safe · Z'' the safe zonedistress · The distress zonegrey · The grey zoneplatform reference (SPY)safe · The safe zonesafe · Every scored member
Figure 1. The declared family: 12 lines, one per walk and one per arm of a comparative walk, 5 shown to start; the dashed grey line is the study’s own benchmark, platform reference (SPY), on the paper’s own windows (+717.4%). Growth of 1 on the left axis, every line rebased to 1× on 2006-07-03, the first session all of them share. The figure draws every walk from 2006-07-01, the stretch this paper reads; the registration keeps the earlier windows and the methodology says why they are not drawn here. The family table prints each walk over its own windows. Click a name to show or hide its line.
Every July, the companies the score could read, split into Altman’s three zones. The number above each bar is how many companies were scored that year; the number below the year is the typical score. The figure runs from 2000 so the fill-in is visible; the paper's windows start in 2006. The distress zone is between a fifth and a third of the index in every one of those years, which is the first sign that it is not measuring imminent failure.
Figure 2. Every July, the companies the score could read, split into Altman’s three zones. The number above each bar is how many companies were scored that year; the number below the year is the typical score. The figure runs from 2000 so the fill-in is visible; the paper's windows start in 2006. The distress zone is between a fifth and a third of the index in every one of those years, which is the first sign that it is not measuring imminent failure.
The result. Each bar is one of the twenty years: the zone’s return over that year minus the return of every scored company bought the same way, in points. A lighter bar is a year the zone trailed. All three books sit on both sides of the line, the safe zone above it in eight years of twenty and the distress zone in eleven.
Figure 3. The result. Each bar is one of the twenty years: the zone’s return over that year minus the return of every scored company bought the same way, in points. A lighter bar is a year the zone trailed. All three books sit on both sides of the line, the safe zone above it in eight years of twenty and the distress zone in eleven.

Table 2. What the two ends are made of, at two anchors

BookJulyNamesThree largest sectorsThree largest namesMarket value over debts, typicalPast profit kept, cents per dollar
Safe zone2025227Tech 60, Industry 48, Health 38NVDA, MSFT, AAPL5.0651
Distress zone2025102Utilities 28, Property 21, Retail 11T, VZ, BA0.893
Safe zone2015193Retail 33, Tech 31, Industry 29AAPL, GOOGL, GOOG3.3146
Distress zone2015101Utilities 25, Property 16, Energy 11GE, AGN, CMCSA0.648

Table 3. The gap by stretch: the zone’s return minus every scored company’s, average points a year

BookThe paper, 2006 to 2025First half, 2006 to 2015Second half, 2016 to 2025Not claimed, 2000 to 2005
Safe zone+0.1 (8 of 20)-0.7 (3 of 10)+0.8 (5 of 10)-4.0 (0 of 6)
Grey zone-0.1 (10 of 20)+0.2 (4 of 10)-0.4 (6 of 10)+2.6 (3 of 6)
Distress zone-0.1 (11 of 20)+0.7 (6 of 10)-1.0 (5 of 10)+3.8 (5 of 6)

Table 4. What could be held and what could be scored, every fifth July and the paper’s first

JulyIndex membersPriced by the vendorScoredBanks and insurers, unscoredSafe / grey / distressTypical score
200048825721839103 54 · 612.78
200549132626751135 64 · 683.06
200649234428553151 64 · 703.14
201049440634356147 88 · 1082.72
201549544838558193 91 · 1012.99
202049949742968170 117 · 1422.53
202549849643167227 102 · 1023.12

Table 5. Where each book’s return came from, over the twenty windows from July 2006

BookAverage year, %Compounded, % a yearDividends, points a yearCost, points a yearYearly returns, spread in pointsAverage fall inside a year, %Fall in the 2008 window, %Fall in the 2019 window, %Years ahead of every scored company
Safe zone12.0811.01.40.2215.4-15.2-45.0-32.18 of 20
Grey zone11.9210.42.10.2218.1-15.9-50.7-42.710 of 20
Distress zone11.8710.23.10.2219.4-15.8-53.1-42.511 of 20
Every scored company, the ruler12.0210.72.00.2216.9-15.2-48.6-37.7it is the ruler
The index fund (SPY)12.2311.1in the price0.00not reportednot reportednot reportednot reportednot comparable

2.2  Per-step results

Table 6. 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 The safe zone SR Every scored member SR
1 2000-07-03 → 2001-06-29 0.21 0.91
2 2001-07-02 → 2002-07-01 0.00 0.07
3 2002-07-01 → 2003-07-01 0.25 0.25
4 2003-07-01 → 2004-06-30 1.90 2.18
5 2004-07-01 → 2005-07-01 0.82 1.30
6 2005-07-01 → 2006-06-30 1.09 1.14
7 2006-07-03 → 2007-06-29 1.45 1.75
8 2007-07-02 → 2008-06-30 -0.48 -0.48
9 2008-07-01 → 2009-07-01 -0.36 -0.42
10 2009-07-01 → 2010-07-01 1.04 1.07
11 2010-07-01 → 2011-07-01 2.26 2.19
12 2011-07-01 → 2012-06-29 0.12 0.10
13 2012-07-02 → 2013-07-01 1.59 1.84
14 2013-07-01 → 2014-07-01 2.08 2.25
15 2014-07-01 → 2015-07-01 0.78 0.62
16 2015-07-01 → 2016-06-30 0.18 0.27
17 2016-07-01 → 2017-06-30 1.50 1.46
18 2017-07-03 → 2018-06-29 1.26 1.06
19 2018-07-02 → 2019-07-01 0.57 0.65
20 2019-07-01 → 2020-06-30 0.42 0.05
21 2020-07-01 → 2021-07-01 2.40 2.61
22 2021-07-01 → 2022-07-01 -0.53 -0.35
23 2022-07-01 → 2023-06-30 1.07 0.84
24 2023-07-03 → 2024-06-28 1.11 0.91
25 2024-07-01 → 2025-07-01 0.52 0.76
26 2025-07-01 → 2026-07-01 1.50 1.70
Out-of-sample equity: normalised growth (1.00x = break even)0.50x1.00x1.50xbars into the window →
Figure 4. The safe zone: 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.46x1.02x1.59xbars 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 windows.

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 drawdown
safe · The safe zone (this paper) 20 2006-07-03 → 2026-07-01 +703.0% +11.0% -50.4%
safe · Every scored member (this paper) 20 2006-07-03 → 2026-07-01 +666.5% +10.7% -53.7%
Z'' distress · Z'' the distress zone 20 2006-07-03 → 2026-07-01 +612.1% +10.3% -61.1%
Z'' distress · Every scored member, Z'' 20 2006-07-03 → 2026-07-01 +666.5% +10.7% -53.7%
Z'' grey · Z'' the grey zone 20 2006-07-03 → 2026-07-01 +674.2% +10.8% -51.5%
Z'' grey · Every scored member, Z'' 20 2006-07-03 → 2026-07-01 +666.5% +10.7% -53.7%
Z'' safe · Z'' the safe zone 20 2006-07-03 → 2026-07-01 +662.4% +10.7% -53.5%
Z'' safe · Every scored member, Z'' 20 2006-07-03 → 2026-07-01 +666.5% +10.7% -53.7%
distress · The distress zone 20 2006-07-03 → 2026-07-01 +592.7% +10.2% -58.9%
distress · Every scored member 20 2006-07-03 → 2026-07-01 +666.5% +10.7% -53.7%
grey · The grey zone 20 2006-07-03 → 2026-07-01 +625.2% +10.4% -54.6%
grey · Every scored member 20 2006-07-03 → 2026-07-01 +666.5% +10.7% -53.7%
platform reference (SPY) (benchmark) 2006-07-03 → 2026-07-01 +717.4% +11.1% -55.3%

Every row above is that walk from 2006-07-01 on, the stretch this paper reads, rebased and recomputed over those windows. The pooled Sharpe is left out here because the compile pooled it over the whole registered walk, earlier windows included; the platform's own tables below carry it.

2.3  Search accounting

This paper's search is a declared family: a declared family, counted at N = 6 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 rThe safe zone − 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 = The safe zone · Arm B = Every scored member.

Table 7. 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 +2.2% +13.1% -10.9 pp Arm B
2 2001-07-03 → 2002-07-01 247 -1.8% -0.3% -1.6 pp Arm B
3 2002-07-02 → 2003-07-01 252 +3.2% +3.3% -0.1 pp Arm B
4 2003-07-02 → 2004-06-30 251 +25.8% +30.9% -5.2 pp Arm B
5 2004-07-02 → 2005-07-01 253 +10.2% +15.9% -5.7 pp Arm B
6 2005-07-05 → 2006-06-30 251 +13.3% +13.9% -0.6 pp Arm B
7 2006-07-05 → 2007-06-29 249 +18.0% +20.5% -2.5 pp Arm B
8 2007-07-03 → 2008-06-30 251 -11.1% -10.9% -0.2 pp Arm B
9 2008-07-02 → 2009-07-01 252 -21.4% -24.7% +3.3 pp Arm A
10 2009-07-02 → 2010-07-01 252 +19.8% +22.9% -3.1 pp Arm B
11 2010-07-02 → 2011-07-01 253 +38.2% +38.9% -0.7 pp Arm B
12 2011-07-05 → 2012-06-29 251 -0.2% -0.5% +0.4 pp Arm A
13 2012-07-03 → 2013-07-01 249 +22.1% +26.2% -4.0 pp Arm B
14 2013-07-02 → 2014-07-01 252 +25.8% +26.7% -0.9 pp Arm B
15 2014-07-02 → 2015-07-01 252 +9.5% +7.0% +2.5 pp Arm A
16 2015-07-02 → 2016-06-30 252 +1.7% +3.3% -1.6 pp Arm B
17 2016-07-05 → 2017-06-30 251 +14.2% +14.1% +0.2 pp Arm A
18 2017-07-05 → 2018-06-29 250 +16.0% +12.2% +3.8 pp Arm A
19 2018-07-03 → 2019-07-01 250 +8.2% +8.5% -0.3 pp Arm B
20 2019-07-02 → 2020-06-30 252 +8.5% -4.0% +12.5 pp Arm A
21 2020-07-02 → 2021-07-01 252 +42.7% +50.3% -7.6 pp Arm B
22 2021-07-02 → 2022-07-01 252 -11.9% -7.7% -4.2 pp Arm B
23 2022-07-05 → 2023-06-30 250 +20.9% +15.2% +5.7 pp Arm A
24 2023-07-05 → 2024-06-28 249 +12.8% +10.2% +2.5 pp Arm A
25 2024-07-02 → 2025-07-01 250 +8.0% +12.1% -4.1 pp Arm B
26 2025-07-02 → 2026-07-01 251 +22.0% +22.6% -0.6 pp Arm B

Paired Sharpe of the difference track: -0.16 · block bootstrap (2000 paths, block 10, seed 1234): P(The safe zone beats Every scored member) = 17.7%.

Window win-rate. The safe zone led 8 of 26 windows (30.8%), Every scored member led 18, and the mean window gap of -0.88 pp points the same way. Widest single window: 2019 at +12.5 pp.

Table 8. The same comparison split at 2006. Pooling the whole walk into one row hides which side of the split the difference came from.
PeriodWindows The safe zoneEvery scored member Mean gapThe safe zone led
All windows 26 +11.41% +12.29% -0.88 pp 8/26
Before 2006 6 +8.80% +12.80% -4.00 pp 0/6
2006 onward 20 +12.19% +12.14% +0.06 pp 8/20
All windowsn=26 · The safe zone led 8 · Every scored member led 18 · ties 0+11.4%+12.3%-0.88 ppBefore 2006n=6 · The safe zone led 0 · Every scored member led 6 · ties 0+8.8%+12.8%-4.00 pp2006 onwardn=20 · The safe zone led 8 · Every scored member led 12 · ties 0+12.2%+12.1%+0.06 ppgap
Figure 6. Mean window return per period. The safe zone above, Every scored member below, with the gap at right. The pooled bar and the post-2006 bar are the same comparison over different periods.

The two eras disagree by 4.06 pp. The pooled figure is therefore not a standing property of either method, it is dominated by the earlier period. Read the two rows, not the average.

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: The safe zone vs Every scored member, walked on the same registered out-of-sample windows. The safe zone: 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: Score Select, mode: zone → all; Score Select, zone: safe →, . The contrast under test: whether The safe zone generates better risk-adjusted returns than Every scored member over the identical out-of-sample windows.

Every block in this study is a card from the platform’s catalog: the index, the price loader, the statements loader, the Altman score, the cut and the one-year hold. Nothing was written for this paper. The coefficients, both zone edges, the source of operating income and the treatment of banks are parameters on the score card, and the cut is a separate card, so a reader can rebuild any of the six walks and change any of it.

The frozen circuit, data flows left to rightuniverse: click for detailsuniverseprice loader: click for detailsprice loaderfactor loader: click for detailsfactor loaderfactor altman: click for detailsfactor altmanfactor score select: click for detailsfactor score selecthold forward: click for detailshold forwardportfolio forward autopsy: click for detailsportfolio forward autopsyuniverse: click for detailsuniverseprice loader: click for detailsprice loaderfactor loader: click for detailsfactor loaderfactor altman: click for detailsfactor altmanfactor score select: click for detailsfactor score selecthold forward: click for detailshold forwardportfolio forward autopsy: click for detailsportfolio forward autopsyThe safe zoneEvery scored membershared
Figure 7. The frozen circuit, every node a primitive, every wire a typed data-flow; the two arms are colour-coded (The safe zone 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.
Price Loader, Bulk OHLCV fetch for the whole universe, point-in-time, no future bars.
Factor Loader, Point-in-time fundamentals, never let the user see a number before the SEC did.
Factor Altman, Altman's Z: five balance-sheet ratios, weighted, read against two zone edges.
Factor Score Select, The cut: turn a score into the book you hold.
Hold Forward, The one hold every paper used: equal weight at the anchor, held to the end.
Portfolio Forward Autopsy, The post-mortem, where the forward test’s return actually came from.

The objective and the search

The safe zone

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 basis points one way at entry and at exit, fewer than 10 names excludes the window, SPY held the same way as the benchmark).
Other componentsFactor models: Fundamentals Loader (PIT).

Every scored member

The specification is identical to The safe zone's table above, row for row; the one sealed difference between the arms is itemized below.

What differs between the arms, one manipulated variable, expressed as 2 paired settings on one node:

  • paramScore Select, mode: zone → all
  • paramScore Select, zone: safe →,

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, 7 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  Price Loader

Bulk OHLCV fetch for the whole universe, point-in-time, no future bars.

Momentum, volatility, trend, every price-based metric needs history. This loads open/high/low/close/volume for all names in parallel, clipped so nothing after the anchor can leak in. The lookback window is derived automatically from the deepest metric you wired.

The window is derived, not guessed

It loads exactly enough history for the hungriest downstream metric plus a warm-up buffer:

W = \max_k(\text{lookback}_k) + \text{buffer}, \qquad \text{bars} \le \text{anchor } t

3.3  Factor Loader

Point-in-time fundamentals, never let the user see a number before the SEC did.

Loads ~23 fundamental metrics (valuation, quality, growth) per name, but with one inviolable rule: a financial statement becomes visible only on or after its SEC acceptedDate. A 2020 backtest sees only what was actually filed by 2020, no look-ahead, ever.

The PIT gate
\text{visible}(f, t) \iff \text{acceptedDate}(f) \le t
Missing acceptance dates fall back to filingDate, else statement date + 45 days.
Byte-identical to FM101FBKT (shared_libs/factor_core). US indexes only (SEC reliability).

3.4  Factor Altman

Altman's Z: five balance-sheet ratios, weighted, read against two zone edges.

Working capital, retained earnings, operating income and sales each over total assets, plus equity over total liabilities, weighted by Altman’s coefficients into one number. Above the safe edge the company looks far from distress, below the distress edge it looks close to it, between them is the grey zone. Three published forms are offered (the 1968 original with the market value of equity, Z′ for private firms with book equity, Z″ with no sales term) and every coefficient and both edges are yours to change. Banks and insurers are left unscored by default, because these ratios do not describe a balance sheet made of loans.

The score
Z = c_1X_1 + c_2X_2 + c_3X_3 + c_4X_4 + c_5X_5
The five ratios
X_1=\frac{\text{working capital}}{\text{assets}},\; X_2=\frac{\text{retained earnings}}{\text{assets}},\; X_3=\frac{\text{EBIT}}{\text{assets}},\; X_4=\frac{\text{equity}}{\text{liabilities}},\; X_5=\frac{\text{sales}}{\text{assets}}
The 1968 form weights them 1.2, 1.4, 3.3, 0.6, 1.0 and puts the MARKET value of equity in X4; Z′ uses 0.717, 0.847, 3.107, 0.420, 0.998 with BOOK equity; Z″ uses 6.56, 3.26, 6.72, 1.05 and drops X5.
The zones
\text{zone}(Z)=\begin{cases}\text{distress} & Z < \ell\\ \text{grey} & \ell \le Z \le h\\ \text{safe} & Z > h\end{cases}
The 1968 edges are 1.81 and 2.99; Z′ 1.23 and 2.90; Z″ 1.10 and 2.60. Move them and the zones move with them.

3.5  Factor Score Select

The cut: turn a score into the book you hold.

Keeps the top N or the bottom N by a named score, or every name above a value, below a value, between two values, an Altman zone, or every scored name (the reference book a study compares a cut against). What it emits is a standard survivors set, so any forward test, portfolio or optimizer downstream takes it.

The cuts
\{i:\operatorname{rank}(s_i)\le N\},\quad \{i:\operatorname{rank}(-s_i)\le N\},\quad \{i: s_i \ge \ell\},\quad \{i: s_i \le h\},\quad \{i: \ell \le s_i \le h\},\quad \{i: \text{zone}(s_i)\in Z\}

3.6  Hold Forward

The one hold every paper used: equal weight at the anchor, held to the end.

Buys every selected name in equal parts at the anchor close and holds to the window’s end, reinvesting each dividend into the paying name on its ex-date, paying a cost once at entry and once at exit. No signal, no rebalance, nothing re-estimated: what it measures is the selection itself. A name that stops trading marks flat at its last close and is sold there; fewer names than the floor excludes the window and says so.

The book
u_i=\frac{C/N \cdot (1-f)}{P_{i,0}},\qquad E_t=\sum_i u_{i,t}P_{i,t}
C is the book, N the names, f the one-way cost. Units grow on an ex-date by the dividend over that day’s price, which is the dividend reinvested in the payer.
Dividends reinvested
u_{i,t}=u_{i,t^-}\left(1+\frac{D_{i,t}}{P_{i,t}}\right)
The same hold the F-score paper ran (fscore_study.hold_pnl), unchanged.

3.7  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

Figure 3 is the result. Each bar is one year: the zone's return that year minus the return of every scored company bought the same way. The bars fall on both sides of the line in all three zones. The safe zone was ahead in eight years of the twenty, the grey zone in ten, the distress zone in eleven.

In the average year the three zones land within a fifth of a point of the companies they came from. Compounded over the whole twenty years the safe zone comes out 0.26 points a year ahead of them, the grey zone 0.31 behind and the distress zone 0.56 behind. That is the same twenty years read a second way, and it favours the steadier book: the distress zone's yearly returns swung the widest and the safe zone's the least (Table 5), and a book that swings more ends a long stretch lower even when its average year is the same. Table 1 prints both ways of averaging for all six walks.

The falls are where the score did sort something, and it took a crash to show it. The two worst years of the twenty were the one beginning in July 2008 and the one beginning in July 2019, and in both the safe zone fell least and the distress zone most, with the companies they came from in between. In 2008 the safe zone was down 45.0 percent at its lowest, the companies it came from 48.6 and the distress zone 53.1; in the pandemic year, 32.1, 37.7 and 42.5 (Table 5). Across all twenty years the order held in seven of them, so this is a crash effect and not a rule of the ordinary years.

What the score does sort is the kind of business, and that part does not move. In July 2025 the safe zone held the large technology companies and most of the healthcare and industrial names, while the distress zone held 28 utilities, 21 property companies and the two large telephone companies. Ten years earlier the same shape: 41 utilities and property companies of 101 names. A company in the distress zone had kept 3 cents of every dollar of assets as past profit against 51 cents in the safe zone (Table 2). It shows up in what the books pay as well: 3.1 points of the distress zone's average year came from dividends against 2.0 for the companies it came from, because utilities and property companies pay them (Table 5).

The registration carries six earlier windows, July 2000 to July 2005, and they say something different: the safe zone 4.0 points a year behind and behind in all six, the distress zone 3.8 points ahead and ahead in five. We do not claim those years, because a book can only hold a company the price record still carries, and in July 2000 that is 257 of the index's 488 members. The record is keyed to a company's current ticker, so what is missing is every 2000 ticker that is not a ticker today: bought, failed and merely renamed alike. The same hole is smaller but still open inside the paper's own window, 30 percent of the index unpriced in 2006 and 9 percent in 2015, so we ran the second half on its own. From 2016 the safe zone is 0.79 points ahead of the companies it came from in the average year, and 0.51 behind with the pandemic year left out. The answer does not change: nothing here sorts returns.

Every step of this ran on cards from the platform's own catalog, in this order: the index, the price loader, the statements loader, the Altman score, the cut and the one-year hold. A reader with an account can put the same six on a canvas, move a zone edge or change a coefficient, and run their own version of any of it, on this index or outside it.

4.2  Interpretation

Used as a buy list on large companies, the three zones earned about what the companies they were drawn from earned, in both published forms of the score, and the one thing the score sorted was how far each fell in a crash.

In a large-cap index the score sorts companies by how their balance sheets are built, not by how likely they are to fail. It puts regulated borrowers at one end and cash-rich technology companies at the other. That is a style, and styles take turns. Anyone using the score as a quality filter is choosing one type of business and calling it a safety measure.

The companies Dichev (1998) and Campbell, Hilscher and Szilagyi (2008) found earning least were small and close to failure, and an index of the five hundred largest holds few of them. Here about half the distress zone is utilities and landlords, which is why the effect they found has little to work on.

This is the second score we have taken apart this way, and the answer has the same shape as the first. Piotroski's nine-signal score, tested on the same index (our earlier paper), also failed to pick winners among large companies, while Piotroski (2000) found it worked among the cheap small companies he built it for. Both scores read the accounts of companies that have already survived the thing the score was built to predict.

What we would test next, and the cards are on the canvas for it: the same six books outside the S&P 500, where a low score is more likely to mean what Altman meant; and the change in a company's score from one year to the next, which is a different question from its level.

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

Twenty one-year windows is not many. Resampling the yearly gaps puts every one of the six books between 45 and 51 percent likely to have been the better book, which is the range a coin covers. The claim is that the score does not sort returns in this index, and both published forms of it agree on that over twenty years.

The price record is the paper's largest limitation. A book can only hold a company the vendor still carries: 257 of the index's 488 members in July 2000, 317 of 488 in 2003, 344 of 492 in 2006, and from 2020 all but two. Scoring did not cause that gap. In the July 2000 window the whole priced set returned 16.6 percent and the scored part of it 13.2, so scoring lowered the level.

Banks and insurers are left out of both books, 67 of the index in 2025, so this is a test of the score on everything else. One year is the only holding period tested. Nothing is sold short, nothing is fitted or tuned, and the coefficients and both zone edges are Altman's own.

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. Altman (1968), Financial ratios, discriminant analysis and the prediction of corporate bankruptcy, Journal of Finance: the five ratios and the zones, fitted on 66 manufacturers, 33 of which had filed for bankruptcy, with the safe edge at 2.99 and the distress edge at 1.81.
  2. Altman (1983), Corporate Financial Distress: the Z′ and Z′′ forms for companies that are not listed manufacturers, the second of which drops the sales term and uses the book value of equity.
  3. Altman, Iwanicz-Drozdowska, Laitinen and Suvas (2017), Financial distress prediction in an international context, Journal of International Financial Management and Accounting: the score still separates failing from surviving companies across 31 countries, which is the job this paper does not test.
  4. Piotroski (2000), Value investing: the use of historical financial statement information to separate winners from losers, Journal of Accounting Research: the nine-signal score our earlier paper tested the same way on the same index, and the finding that it worked among the cheap small companies it was built for.
  5. Dichev (1998), Is the risk of bankruptcy a systematic risk?, Journal of Finance: on the whole US market, the companies this score and Ohlson’s placed closest to failure earned less than the rest.
  6. Campbell, Hilscher and Szilagyi (2008), In search of distress risk, Journal of Finance: the same result from a different failure model.

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 badf1e356b60 10989 2000-07-01 2000-07-03 → 2001-06-29
2 d65a60207fa3 10991 2001-07-01 2001-07-02 → 2002-07-01
3 d4f18d2ad8e5 10995 2002-07-01 2002-07-01 → 2003-07-01
4 1b2f000f29dc 10997 2003-07-01 2003-07-01 → 2004-06-30
5 ccb776bad49e 11000 2004-07-01 2004-07-01 → 2005-07-01
6 7bd91c837c2d 11005 2005-07-01 2005-07-01 → 2006-06-30
7 9090115ecea8 11006 2006-07-01 2006-07-03 → 2007-06-29
8 eb120068e0ab 11010 2007-07-01 2007-07-02 → 2008-06-30
9 8816a89d53cf 11012 2008-07-01 2008-07-01 → 2009-07-01
10 bd7fbaff1290 11017 2009-07-01 2009-07-01 → 2010-07-01
11 8458f2f80a73 11020 2010-07-01 2010-07-01 → 2011-07-01
12 4a6a152aa59d 11022 2011-07-01 2011-07-01 → 2012-06-29
13 5f1d463efdc7 11025 2012-07-01 2012-07-02 → 2013-07-01
14 e1116ee0c679 11027 2013-07-01 2013-07-01 → 2014-07-01
15 a019a502c7c8 11032 2014-07-01 2014-07-01 → 2015-07-01
16 83ab731f636e 11035 2015-07-01 2015-07-01 → 2016-06-30
17 e059093fe1c3 11038 2016-07-01 2016-07-01 → 2017-06-30
18 c5f7516a3cde 11040 2017-07-01 2017-07-03 → 2018-06-29
19 eea8f8f59c82 11044 2018-07-01 2018-07-02 → 2019-07-01
20 d0ec85215e98 11047 2019-07-01 2019-07-01 → 2020-06-30
21 9bb4aa28e08c 11050 2020-07-01 2020-07-01 → 2021-07-01
22 2c8462031286 11052 2021-07-01 2021-07-01 → 2022-07-01
23 dfb841c97729 11055 2022-07-01 2022-07-01 → 2023-06-30
24 2252881a69b3 11058 2023-07-01 2023-07-03 → 2024-06-28
25 267d6af413e2 11060 2024-07-01 2024-07-01 → 2025-07-01
26 17cfd2367e62 11065 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: The safe zone vs Every scored member, walked on the same registered out-of-sample windows. The safe zone: 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: Score Select, mode: zone → all; Score Select, zone: safe →, . The contrast under test: whether The safe zone 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 9. 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-22 06:45:22 2026-09-22 07:45:25
2 2001-07-012026-09-22 07:45:25 2026-09-22 07:50:38
3 2002-07-012026-09-22 07:50:38 2026-09-22 07:55:02
4 2003-07-012026-09-22 07:55:03 2026-09-22 08:00:15
5 2004-07-012026-09-22 08:00:15 2026-09-22 08:06:53
6 2005-07-012026-09-22 08:06:53 2026-09-22 08:12:43
7 2006-07-012026-09-22 08:12:43 2026-09-22 08:19:21
8 2007-07-012026-09-22 08:19:21 2026-09-22 08:25:22
9 2008-07-012026-09-22 08:25:22 2026-09-22 08:32:23
10 2009-07-012026-09-22 08:32:23 2026-09-22 08:40:37
11 2010-07-012026-09-22 08:40:37 2026-09-22 08:47:26
12 2011-07-012026-09-22 08:47:26 2026-09-22 08:53:27
13 2012-07-012026-09-22 08:53:27 2026-09-22 09:00:42
14 2013-07-012026-09-22 09:00:42 2026-09-22 09:07:09
15 2014-07-012026-09-22 09:07:09 2026-09-22 09:14:00
16 2015-07-012026-09-22 09:14:00 2026-09-22 09:20:51
17 2016-07-012026-09-22 09:20:51 2026-09-22 09:27:52
18 2017-07-012026-09-22 09:27:53 2026-09-22 09:34:18
19 2018-07-012026-09-22 09:34:18 2026-09-22 09:40:34
20 2019-07-012026-09-22 09:40:34 2026-09-22 09:45:59
21 2020-07-012026-09-22 09:46:00 2026-09-22 09:51:49
22 2021-07-012026-09-22 09:51:49 2026-09-22 09:57:18
23 2022-07-012026-09-22 09:57:18 2026-09-22 10:02:45
24 2023-07-012026-09-22 10:02:45 2026-09-22 10:08:12
25 2024-07-012026-09-22 10:08:12 2026-09-22 10:13:31
26 2025-07-012026-09-22 10:13:31 2026-09-22 10:19:01

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. Cost drag is the gap between the step's return before and after its trading costs, in percentage points of the step's starting capital, so on a book that trades every session and compounds it can exceed the step's own net return.

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

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

The safe zone

Portfolio book, rebalanced hold · 103 names held · selection: anchor · 3.9% in cash · cost drag 0.204% · 4 names dropped at load (107 selected, 103 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 218 names held · selection: anchor · 2.3% in cash · cost drag 0.226% · 5 names dropped at load (223 selected, 218 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 108 names held · selection: anchor · 2.8% in cash · cost drag 0.196% · 3 names dropped at load (111 selected, 108 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 227 names held · selection: anchor · 1.8% in cash · cost drag 0.2% · 4 names dropped at load (231 selected, 227 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 97 names held · selection: anchor · 1.0% in cash · cost drag 0.206% · 1 name dropped at load (98 selected, 97 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 232 names held · selection: anchor · 2.6% in cash · cost drag 0.207% · 6 names dropped at load (238 selected, 232 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 93 names held · selection: anchor · 4.3% in cash · cost drag 0.252% · 4 names dropped at load (97 selected, 93 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 241 names held · selection: anchor · 2.9% in cash · cost drag 0.262% · 7 names dropped at load (248 selected, 241 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 119 names held · selection: anchor · 2.5% in cash · cost drag 0.221% · 3 names dropped at load (122 selected, 119 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 263 names held · selection: anchor · 1.9% in cash · cost drag 0.232% · 5 names dropped at load (268 selected, 263 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 135 names held · selection: anchor · 2.2% in cash · cost drag 0.227% · 3 names dropped at load (138 selected, 135 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 267 names held · selection: anchor · 2.2% in cash · cost drag 0.228% · 6 names dropped at load (273 selected, 267 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 151 names held · selection: anchor · 1.3% in cash · cost drag 0.236% · 2 names dropped at load (153 selected, 151 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 285 names held · selection: anchor · 2.5% in cash · cost drag 0.241% · 7 names dropped at load (292 selected, 285 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 151 names held · selection: anchor · 1.3% in cash · cost drag 0.178% · 2 names dropped at load (153 selected, 151 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 298 names held · selection: anchor · 1.3% in cash · cost drag 0.178% · 4 names dropped at load (302 selected, 298 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 145 names held · selection: anchor · 2.1% in cash · cost drag 0.157% · 3 names dropped at load (148 selected, 145 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 312 names held · selection: anchor · 1.6% in cash · cost drag 0.151% · 5 names dropped at load (317 selected, 312 held across the window), weights renormalised onto the rest

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

The safe zone

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

Every scored member

Portfolio book, rebalanced hold · 330 names held · selection: anchor · 0.9% in cash · cost drag 0.246% · 3 names dropped at load (333 selected, 330 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 147 names held · selection: anchor · 2.0% in cash · cost drag 0.277% · 3 names dropped at load (150 selected, 147 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 343 names held · selection: anchor · 0.9% in cash · cost drag 0.278% · 3 names dropped at load (346 selected, 343 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 170 names held · selection: anchor · 1.2% in cash · cost drag 0.2% · 2 names dropped at load (172 selected, 170 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 347 names held · selection: anchor · 0.9% in cash · cost drag 0.199% · 3 names dropped at load (350 selected, 347 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 159 names held · selection: anchor · 0.6% in cash · cost drag 0.244% · 1 name dropped at load (160 selected, 159 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 359 names held · selection: anchor · 0.3% in cash · cost drag 0.252% · 1 name dropped at load (360 selected, 359 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 172 names held · selection: anchor · 0.6% in cash · cost drag 0.252% · 1 name dropped at load (173 selected, 172 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 368 names held · selection: anchor · 0.3% in cash · cost drag 0.253% · 1 name dropped at load (369 selected, 368 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 199 names held · selection: anchor · 1.0% in cash · cost drag 0.219% · 2 names dropped at load (201 selected, 199 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 374 names held · selection: anchor · 0.5% in cash · cost drag 0.214% · 2 names dropped at load (376 selected, 374 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 193 names held · selection: anchor · 0.5% in cash · cost drag 0.204% · 1 name dropped at load (194 selected, 193 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 385 names held · selection: anchor · 0.5% in cash · cost drag 0.207% · 2 names dropped at load (387 selected, 385 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 187 names held · selection: anchor · 0.5% in cash · cost drag 0.229% · 1 name dropped at load (188 selected, 187 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 406 names held · selection: anchor · 0.5% in cash · cost drag 0.228% · 2 names dropped at load (408 selected, 406 held across the window), weights renormalised onto the rest

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

The safe zone

Portfolio book, rebalanced hold · 189 names held · selection: anchor · 0.5% in cash · cost drag 0.232% · 1 name dropped at load (190 selected, 189 held across the window), weights renormalised onto the rest

Every scored member

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

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

The safe zone

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

Every scored member

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

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

The safe zone

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

Every scored member

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

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

The safe zone

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

Every scored member

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

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

The safe zone

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

Every scored member

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

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

The safe zone

Portfolio book, rebalanced hold · 207 names held · selection: anchor · 0.5% in cash · cost drag 0.242% · 1 name dropped at load (208 selected, 207 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 430 names held · selection: anchor · 0.5% in cash · cost drag 0.231% · 2 names dropped at load (432 selected, 430 held across the window), weights renormalised onto the rest

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

The safe zone

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

Every scored member

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

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

The safe zone

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

Every scored member

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

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

The safe zone

Portfolio book, rebalanced hold · 227 names held · selection: anchor · 0.4% in cash · cost drag 0.244% · 1 name dropped at load (228 selected, 227 held across the window), weights renormalised onto the rest

Every scored member

Portfolio book, rebalanced hold · 431 names held · selection: anchor · 0.5% in cash · cost drag 0.245% · 2 names dropped at load (433 selected, 431 held across the window), weights renormalised onto the rest

QuanterLab · Study 7985feed1623 · compiled September 22, 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.