Survivorship bias doubled our momentum backtest. Here are the numbers.
If you backtest stock strategies on a list of today's tickers, your results are too good. The list leaves out every company that went bankrupt, was bought or was delisted, so your strategy never holds the losers that disappeared. That is survivorship bias. Everyone has heard of it. Few people measure it. We did, on three common strategy setups, and the answer surprised us: the bias ranged from 1.25 to 3.66 points a year. Disclosure: we build FinzData, the data and backtest service used here. The setup Each test runs the same strategy twice, January 2005 to October 2026: Point-in-time: the universe on each date is every US stock that actually traded that day, delisted names included. Survivors only: the same universe, minus every stock that is no longer trading today. This is what you get from a current ticker list. Each strategy holds the top 100 names by its signal and pays 10 basis points of trading costs. Momentum rebalances monthly and reversal weekly. The results Strategy CAGR, point-in-time CAGR, survivors only Bias $1 became (PIT vs survivors) 12-1 momentum, top 3,000 6.89% 10.55% +3.66 pts $4.28 vs $8.92 12-1 momentum, top 1,000 7.18% 8.43% +1.25 pts $4.54 vs $5.85 1-week reversal, top 1,000 8.53% 11.48% +2.95 pts $5.97 vs $10.72 What we learned The bias grows with the universe. Momentum on the top 1,000 stocks was inflated by 1.25 points a year. On the top 3,000 it was 3.66 points, and the survivors-only test dropped 5,997 stocks. Smaller companies delist more often. Strategies that buy losers get hit hardest. One-week reversal buys last week's worst performers. Some of those later delisted, and survivors-only data quietly removed them. The size depends on the strategy. Across these tests it ranged from 1.25 to 3.66 points a year. You cannot assume a fixed haircut; you have to measure each strategy. Your benchmark is biased too. The equal-weight top-1,000 benchmark returned 7.36% a year point-in-time and 8.67% survivors-only. A survivors-only test flatters the strategy and the yardstick at the same time. A weak idea can look fine. Point-in-time, 12-1 momentum on the top 3,000 trailed its equal-weight benchmark by 5.96 points a year. On survivors-only data the gap shrinks to 3.80 points. Run it yourself Every number above came from one call each to a survivorship_audit tool, which runs both versions and reports the difference. The easiest way to try it is from an AI assistant. In Claude Code: claude mcp add --transport http finzdata https://api.finzdata.com/mcp Then ask: "Run a survivorship audit on 12-1 momentum, top 3,000 US stocks, 2005 to today." The same server works in Claude, ChatGPT and Cursor. No sign-up is needed for the last 6 months of data; a free key gives 12 months. What else is in FinzData The same point-in-time API covers 16,000+ US stocks since 2000 (8,500+ delisted), 5,100+ ETFs, tick data for 1,100+ names, 139 futures markets, options chains and dealer gamma (GEX) for 11,200+ stocks, ETFs and indexes, 74 crypto pairs, 79 FX pairs, 123 indexes including the VIX, CFTC COT since 1986, 13F holdings, insider trades, short interest, SEC fundamentals as filed, 22,700+ macro series with every vintage, congressional trades, election spending, FINRA margin debt, ship transits through 28 chokepoints, and the Global Macro Pulse and Quantitative Model. Full write-up with run IDs for replay: https://finzdata.com/research/survivorship-bias-backtest-case-study Historical simulations, not investment advice.
This is a summary aggregated from Dev.to. Read the complete article on the original site:
Read full article at Dev.to