Only the Dead Have Short Months
There are 19,194 dead US equity symbols and 14,241 live ones. The dead outnumber the living by roughly four to three, and every list of tickers you can download today contains none of them.
The largest number in the system
The thing I am building tests whether a stock-picking rule ever actually worked, on the data that existed at the time rather than the data that exists now. Its own notes name bad data as one of the three things that can kill it outright. In a synthetic world where the true edge is known by construction, dropping the companies that stopped trading is worth an extra 3.4% a year of return that is not there. That is larger than any real edge the engine has ever measured.
So the fake profit from a bookkeeping omission is bigger than the thing being searched for. Every result is noise on top of it until that is fixed.
The omission is not anybody’s mistake. Ask the usual free price source for a company that stopped trading and you get nothing back: not a truncated history, nothing. The regulator’s current ticker file lists the companies that currently file. Both are correct products describing the present. Assemble a universe from either and you have a list of things that made it.
Buying the dead
The way in was a broker’s free market-data tier, for one reason: it will enumerate inactive symbols. All 19,194 of them, by name. Nameable is the precondition for includable.
Better still, the bars are all there. TWTR returns real daily prices up to October 2022 and then stops, which is what a delisting is supposed to look like from the outside. A second endpoint says how each one ended. ATVI is a cash merger at $95. FB is a name change to META, same underlying identifier. A name that leaves the universe now leaves at a known price instead of vanishing.
That felt like the end of the problem. A price file with the dead in it, in exchange for a few days of adapter work.
The month with seven days in it
Before a study can consider a name, it has to clear a liquidity screen: at some point the stock must have traded enough dollars a day that buying it was plausible. The code grouped each symbol’s dollar volume by calendar month and divided by 21, the nominal number of sessions in a trading month.
Now take a company that traded normally through the first week of a month and then stopped forever. Seven sessions, at exactly the same dollars per day as a perfectly healthy name. Divide by 21. It reads as a third as liquid as it really was, drops under the floor, and leaves the universe.
Only companies that stopped trading have short final months.
That is the entire defect. A constant divisor, correct for every month a company will ever have except the last one. The penalty fell exclusively on the dead, inside a filter whose whole purpose was to not lose them. The repair divides by the sessions the symbol actually traded, and it is one line. The test that pins it builds two symbols at identical daily volume, one trading seven days and one trading twenty-one, and asserts that both survive.
Then it happened again, in a different language
The prices that vendor serves are adjusted as of the moment you ask. That is standard, and for measuring returns it is exactly right.
A stock that later does a 1-for-10 reverse split reads as $0.50 today on a day when it really traded at $5. A screen requiring a price of at least $5 therefore deletes that day from history: a date the company genuinely passed, failed retroactively because of something that happened afterwards. That is look-ahead, and it points in one direction, because a reverse split is what a falling company does. The fix is to ask the vendor twice and keep both series: raw prices for anything that makes a selection, adjusted prices for returns, where the level never enters a decision.
The two problems have nothing in common. One is an average with a hardcoded denominator. The other is a data vendor’s convenience feature. Neither contains the word delisted anywhere near it. Both quietly remove the dead.
Failure and corruption look identical
What connects them is that dying looks like bad data.
A company that fails leaves a short record, a truncated tail, sometimes a violent move and then nothing at all. Every data hygiene rule I have ever written distrusts precisely that: too few observations, incomplete periods, values that jump too far, series that stop. Those rules were written to catch corrupt files. A corrupt file and a dead company present identically.
So each layer of cleaning applies one more quiet filter against the exact population whose absence is the most expensive error in the system. You do not have to make a mistake for this to happen. You only have to be careful in the ordinary way, twice, in two places that do not know about each other.
Nothing about this is specific to markets. Customers who churn stop generating rows. Sessions that crash never write their completion record. Anything whose exit is silent gets swept up by the rules that were protecting you from garbage, and the population left over is the one that stayed.
The gate could be told rather than shown
The audit that stands between all of this and a confident false answer had its own version of the problem in it.
A price file carries a flag saying its source includes delisted names. That flag short-circuited the survivorship check into an unconditional pass. The one mandatory gate between the engine and phantom alpha could be satisfied by an adapter setting a boolean about itself.
It measures either way now. The flag no longer decides whether to look, only what an absence of deaths means: a source that never claimed the dead and has none is suspicious, and a source that claims them and cannot produce one is worse than a source that never claimed. The comment above it says a declaration is checked, never believed. The new adapter leaves the flag off on purpose and lets the tape prove it.
What passing looks like
Run against the real tape: 1,039 of 9,717 names stop trading across 10.6 years. That is 1.01% a year of attrition against a floor of 0.5%, and it is the first price source in this project’s history to clear the survivorship gate on measurement rather than by declaration.
The rest of the audit is warnings it declines to fail on. There are 2,263 daily moves beyond plus or minus 90% in 16.7 million bars, which is 0.014% of them and is binary biotech outcomes and blank-check unwinds rather than corruption. Thirteen names sit frozen for 60 sessions, halted with a delisting pending. Both of those are what a real tape looks like, and a file without them would be the suspicious one.
A price file is not good because it is clean. This one passes because 1,039 of its companies stop printing and never come back.