← Ground Truth report library

Your Backtest Is Missing Dead Companies. We Put Them Back and Measured It.

Episode B01 · report format v2 · lab run 2026-08-15, pre-registration dated 2026-08-15 — not hash-locked
VERDICT — REAL, USUALLY FLATTERING, AND SMALLER THAN WE FIRST SAID

Deleting the companies that died flattered this strategy at 4 of 4 basket widths — by +1.16 to +2.49 CAGR points a year, with a drawdown 4.51 to 6.62 points shallower than the truth. But the effect has no fixed size and not even a fixed direction: on a leveraged, concentrated version of the same strategy it ran backwards, costing 2.68 points. Survivorship bias is real and it is not the reason your backtest and your account disagree.

What we granted, and what we actually tested

Granted, not measured: that survivorship bias exists, that it usually flatters, and that every practitioner warning you about it is right to.

Tested: how much it is worth, in CAGR points and drawdown points, on one strategy we built ourselves and had already believed.

What this report does NOT claim, pre-committed before the data: that this explains the gap between backtests and live accounts; that the direction is a law; that a delist count carries a return effect; or anything at all about membership survivorship, which is a second effect we did not measure.

§1 · The pre-registration — and what it is not

This pre-registration is dated, not hash-locked, and we are saying so. It was written on 2026-08-15, before any code in the lab directory; the inherited arm's was written 2026-08-11 (UTC). But no commit lock exists for either: the pre-registration and the script it governs landed in the same commit in both labs, so version control cannot witness the ordering. What stands behind the dates is a written provenance note, which is an attestation and not cryptographic evidence. Our A13 report could cite a pre-run lock hash; this one cannot, and filling the gap with a hash that does not exist would be the exact move this channel was built to catch.

The falsifiable question

The survivorship verdict-flip vs spy holds at >= 3 of 4 basket widths.

Our stated prior: we expected the flip to hold at 3 or more widths

It held at 1 of 4. The prediction was falsified. The bias moved the number at every width and moved the verdict at only one, which is a smaller claim than the one we registered — and the one we are left with.

The primary configuration (locked)

ParameterLocked value
strategy12-1 momentum: 252-day return, 5-day skip, monthly re-rank, equal-weight daily hold of the prior day's top-N
universepoint-in-time top-500-liquid US common stocks (min $1M dollar-volume, $5 price floor)
window2003-09-10 to 2026-06-22 — 5,731 trading days, 262 rebalance months, 21.7 effective years
widths swept5, 9, 15, 25
the one variablewhether the universe keeps names that later delisted, or is intersected with today's active flag
frictionsnone — no stop, no leverage, no transaction cost

Deliberately NOT tested — named in advance

  1. Transaction costs and slippage — excluded so the one variable stays one variable; it also means every number here is a gross number.
  2. Membership survivorship — the second effect a real user inherits, unmeasured and not claimed.
  3. Delisting force-exit — a dead name's return goes NaN and is dropped rather than sold at a loss, which flatters the survivorship-FREE arm too.
A flip would have said the data choice decides the verdict; no flip would have said it moves the number only. Both endings were disarmed on paper before the run.

The goalposts — all required to proceed

#Pre-registered goalpostMeasuredPass
Pre-registered goalpost 1 — the verdict flip holds at ≥3 of 4 widths1 of 4FALSIFIED
Pre-registered goalpost 2 — the survivor-only arm understates drawdownheld on the plain basket, reversed on the inherited armFALSIFIED
Pre-registered goalpost 3 — delisting attrition falls monotonically as the as-of date approaches today38.2% → 32.4% → 25.4%CONFIRMED
Pre-registered goalpost 4 — the census reproduces from the storeat least 6,529 of 11,827CONFIRMED

3 of 6 pre-registered predictions across both labs were wrong — and on this lab's own four, two were. Both counts are true; they have different denominators, and a count without its denominator is the defect this channel exists to catch.

§2 · The headline arithmetic

FigureValueWhat it means
Plain basket, 9 names — survivorship-free7.49%/yr
Same basket — survivor-only universe9.58%/yr
What deleting the dead was worth+2.09 pts/yr
Range across all 4 widths+1.16 to +2.49 pts/yr
Drawdown, made to look shallower by4.51 to 6.62 pts
Inherited leveraged arm — the same bias, backwards-2.68 pts/yr
SPY over the same window9.07%/yr, -56.47% drawdown

§3 · Was it the path? The stress tests

The sweep across basket widths is the stress test: the same question asked four times at 5, 9, 15, 25 names. The sign of the effect survived all four. Its size did not — it moves by a factor of roughly two across widths, which is why this report gives a range and never a single number.

Both arms reproduced exactly on re-run (CAGR and drawdown deltas both 0.0), in 82.1s of a registered 2700s budget.

§4 · The controls

SPY, identical in all 8 cells: $65,896.78 from $10,000, 9.07%/yr, -56.47% max drawdown. It is the same instrument in every row, so any difference between rows is the basket, not the market.

The ghost bound. Dead names occupy 0.000% to 0.724% of basket-day slots. That is a bound on how much of the effect can be mechanical, not a second measurement of the effect.

§5 · The best objection, pre-registered and answered

The best objection is that our survivorship-free arm is itself flattered. It is. When a held name's data ends, its return goes NaN and is dropped — there is no force-exit at a loss and no cost charged. So the true gap between the two universes is at least what we report, never exactly it. Every delta on this page is a floor.

The second objection is that active tracks symbols, not companies. Also true. A ticker change, a merger and a bankruptcy all read identically in this flag — UTX, which merged, sits beside LEH, which did not. So the honest phrase is symbols that stopped, not companies that went to zero.

§6 · Their own terms

There is no practitioner under test here. The strategy is ours, we built it, and we had already believed it — which is the only reason we can open every drawer of it for you. The claim on trial was our own.

§7 · The complete ledger — all 8 rows

This is a grid, not a trade ledger, and the difference matters. sim_hold returns endpoints — a final value, a CAGR and a max drawdown per cell — not a row per fill. So what follows is every cell the experiment produced, 4 widths × 2 universes = 8 cells, and there is no per-trade file behind it to publish. Saying so is cheaper than implying otherwise. Check our arithmetic: the CSV below is the same file the figures above are computed from.
Download the full 8-row ledger (CSV)
#widthuniversefinal $CAGRmax DDbeats SPYdead names heldghost-daysbasket-day slotsghost share
15survivorship-free$10,085.130.04%-96.76%no14816527,3200.604%
25survivor-only$17,219.862.53%-91.16%no0027,3200.000%
39survivorship-free$47,995.137.49%-89.43%no23335649,1760.724%
49survivor-only$72,839.319.58%-82.81%yes0049,1760.000%
515survivorship-free$172,550.6414.02%-72.62%yes32752281,9600.637%
615survivor-only$215,334.3715.18%-68.11%yes0081,9600.000%
725survivorship-free$282,940.1916.64%-65.58%yes461779136,6000.570%
825survivor-only$381,926.7818.26%-60.12%yes00136,6000.000%

§8 · What would change our mind

  1. Send us a strategy where putting the dead companies back improves it on both return and drawdown, and we will run it here. We already found one ourselves — the leveraged arm above — which is exactly why we will not pretend the direction is a law. Find us a second and this becomes a sequel, not a correction.
  2. Show that the untyped bucket is not what we assume. Our census floor rests on 6,768 rows that carry no type and of which 0 are active. If a large share of those are not common stocks, the floor moves and we will move it in public.
  3. Publish a per-trade reconstruction that contradicts the grid. We report endpoints because that is what the simulator returns; a fill-level run that disagrees with these eight cells would be a finding and we would rather have it than not.

§9 · What survives

Survivorship bias is real, and it is smaller than its reputation. On this strategy it is worth +1.16 to +2.49 CAGR points a year — enough to matter, nowhere near enough to explain why a backtest and a live account disagree.

The direction is not a law. We found a case where it reverses, on a leveraged version of our own strategy. Anyone quoting you a single number for survivorship bias is quoting a number that depends on what they were running.

And the check is cheap. Ask what list the backtest was allowed to buy from. If the answer is today's list, you already know which way the number leans.

§10 · Want to run a test like this yourself?

Everything we make is free — the reports, the ledgers, all of it. The only thing that costs us real money is the market data.

Where the numbers on this page came from. The equity history behind this report is a one-shot pull from Massive.com (formerly Polygon.io). No options data was used here. They do not pay us, they have no say in a verdict, and they are not the link below.
Buying market data? Going through here supports Ground Truth (affiliate)
The firewall: going through that link pays us a small commission at no extra cost to you. It is a way to support the channel, not a description of our pipeline — the vendors that produced our numbers are named directly above, and we would rather say so plainly than let a commission blur the two. That is the only money this channel takes. Never from anyone whose claims we test — and never for anything inside a category we review.

Get every report + the 7 Questions one-pager (free)