1
100%
u/Finance__broski
1 day ago
Data
i checked how many stocks from the old s&p 500 you can still download, it's bad
most backtests start the same way, get a list of stocks, download prices from yfinance, run the strategy, the problem is the list, if you grab today's s&p 500 and test on 2010-2024 you're testing on companies that survived, everyone knows this in theory, i wanted the actual number
so i rebuilt the index membership as it stood on two past dates using the public changelog (every add and drop is dated), then tried to download each member from yfinance today
\- s&p 500 as of jan 2010: 506 tickers (dual-class listings make it not exactly 500), downloadable today 376, invisible 130, or 25.7%
\- s&p 500 as of jan 2015: 502 tickers, downloadable today 401, invisible 101, or 20.1%
one in four members of the most heavily covered index on earth, gone from the standard free source, and not just small names, the missing list includes allergan, celgene, cerner, alexion, broadcom's old ticker, baker hughes, CA technologies
i ran the same measurement on india (top-500 as of 2015) and got 24%, basically the same number, the intuition that "us data is clean and emerging market data is messy" doesn't survive contact, yfinance loses the disappeared everywhere
what differs is how they disappeared, every big us name i checked above left by acquisition, india's list is heavier on delistings and suspensions, and that difference matters for which way your backtest lies, a delisting takes the stock toward zero, an acquisition usually pays a premium, so survivor-only india data almost certainly flatters you, while for the us the sign of the bias is genuinely unclear because a lot of the invisible names exited UP, i've measured the coverage hole, not yet the return effect, that's the next piece
caveats so nobody overtrusts this, membership rebuilt from the public changelog which i haven't independently audited, the probe ran in late july, and ticker recycling cuts the other way, some "visible" tickers are a different company wearing a dead company's symbol (S was sprint, now it's sentinelone), so my invisibility numbers are if anything too low
practical takeaway, if your universe comes from "whatever yfinance serves when i ask for current constituents" your 10-year backtest is missing \~20-25% of the names that were actually there, and no walk-forward scheme fixes a hole in the data itself
happy to share the reconstruction method if anyone wants to reproduce it