Survivorship Bias in Backtesting: What It Is and How to Avoid It
Survivorship bias is testing a strategy only on the companies that still exist today, while the ones that failed, were acquired or delisted are missing from the data. Because the losers are gone, the backtest overstates the returns a real investor would have earned.
Why survivorship bias overstates returns
Every year some companies leave the market: they go bankrupt, get acquired, or are delisted for other reasons. A dataset built from today's listed companies silently drops all of them, so the historical universe you test on is cleaner than the universe investors actually faced.
The result is a strategy that looks better than it was. Any rule that would have held a company on its way to zero shows only the winners in a survivorship-biased dataset, and the measured performance is flattered as a result.
Where it sneaks into a backtest
The most common source is downloading prices for today's tickers and testing over the past. Other quiet sources:
- Using the current constituents of an index as the universe for a test that runs years into the past.
- Screening for "all stocks with data since 2000" — a filter that only survivors can pass.
- Dropping tickers that stop trading, instead of keeping them through their final bar.
How to avoid it
Use survivorship-free stock data: a dataset that keeps every company that ever traded, dead ones included, with their full price history up to the last day they traded. Build the investable universe as it existed on each date, and let positions ride to delisting when the strategy says so.
FinzData carries survivorship-free US stocks including 8,500+ delisted symbols and 231 ETFs, with 1-minute, 5-minute, 30-minute, hourly and daily bars since 2000. A quick check with the Python client:
import finzdata as fd
# A survivor and a broad ETF, daily bars since 2010
aapl = fd.Ticker("AAPL").history(interval="1d", start="2010-01-01")
both = fd.download(["SPY", "QQQ"], start="2010-01-01")
print(aapl.tail())
Delisted names are served the same way, so the universe you test on can match the universe that actually existed. AI agents can run the same queries through the remote MCP endpoint at https://api.finzdata.com/mcp, with as_of on every tool.
FAQ
What is survivorship bias in backtesting?
Survivorship bias is testing a strategy only on companies that still exist today. Because the failures — bankrupt, acquired and delisted companies — are missing from the data, the backtest overstates the returns a real investor would have earned.
What is survivorship-free stock data?
Survivorship-free stock data keeps every company that ever traded, including the ones that later delisted, went bankrupt or were acquired. FinzData carries survivorship-free US stocks including 8,500+ delisted symbols and 231 ETFs, with daily and intraday bars since 2000.
How do I avoid survivorship bias in a backtest?
Build your universe as it existed on each historical date: include delisted names, use the index membership as it was at the time, and never filter the past by today's list of listed companies. Then run the strategy on that full universe.
Does FinzData include delisted stocks?
Yes. FinzData includes 8,500+ delisted US symbols with daily, hourly, 30-minute, 5-minute and 1-minute bars since 2000, so a backtest can hold companies that no longer trade.