Building Survivorship-Bias-Aware Historical Equity Universes
Summary
The document addresses how to construct the investable stock universe that existed at each historical rebalancing date. This matters when backtesting value strategies, because current ticker lists omit delisted securities and can introduce survivorship bias. It also notes that broad listing data may classify many instruments too coarsely to distinguish common shares from ETFs, warrants, preferred shares, or other securities.
Suggested approaches include using a historical securities master with dated security attributes, or inferring active symbols from end-of-day records by selecting those that traded near each sampling date. Security type data can help filter instrument classes, while full survivorship-bias-free price and fundamental histories are needed when those data drive the strategy. These methods have limits: trading activity is only a proxy for an available universe, and the answers do not establish that any particular vendor’s classifications or coverage are complete.
Key ideas
- Historical universe membership should reflect which securities were active at each rebalance date.
- Omitting delisted stocks can bias a backtest toward survivors.
- A dated securities master can provide ticker histories and security descriptions for filtering.
- Observed trades near a date can serve as a rough way to identify active symbols.
- Fundamental strategies also require historical fundamental data that includes delisted firms.
Tags
Full text
# Historical Ticker Symbols Data Source (for Creating Tradable Universe) # Historical Ticker Symbols Data Source (for Creating Tradable Universe) I would've guessed this question would have been answered somewhere on here before, but I have been going down rabbit holes for days trying to figure it out with no luck... I want to backtest different value investing strategies, and I'm trying to find a high quality source for historical ticker symbols to create a tradable universe from. For example, if I wanted to test the performance of a strategy that buys the lowest P/E stocks on Jan 1st and rebalances annually from 2010-2020, I would need to know the universe of ticker symbols available to purchase on Jan 1st for each year. Then, I would have to remove all the tickers that are not relevant like ETFs, warrants, preferred shares, SPACs, etc. The only data provider I have been able to find that allows you to travel back in time and get retroactive ticker data is Alpha Vantage under their 'Listing and Delisting Status' endpoint. It lets you enter a date as a URL parameter and pulls the active tickers listed on various exchanges at that point in time. However, the data is a mess. When you pull the data from that endpoint it lists essentially everything as having an asset type of 'stock' or 'ETF'. I have tried running the tickers it outputs through other endpoints like 'company overview' that I thought might classify the asset type/industry of each ticker more accurately but have been unsuccessful. So for now, I'm stuck with trying to filter everything by the company name. Like if it has 'Warrant' in the name I exclude it, etc. But writing the logic to do that correctly for >10k tickers is basically impossible. Has anyone found a good solution for this? Thanks in advance!!! ## Answer by user128285 (score 1) https://quant.stackexchange.com/a/64238 algoseek.com provides Equity Security Master File which tracks any changes for a security (Ticker, Name, Primary Exchange, etc) and goes back to Jan 2007. You can filter tickers by `SecurityDescription` column and a relevant date range to get your target Universe. Also, they provide FIGI and ISIN within it, so cross-referencing with other vendors should be pretty easy. You can find it available with relevant documentation and data sample at the products page. ## Answer by Sergei Rodionov (score 0) https://quant.stackexchange.com/a/63231 In absence of reference data, one can build the list of tradeable stocks by running a query on end-of-day data and selecting symbols with at least one trade during the given day, for example on the first trading day/week/month of each year in the backtesting period. In SQL syntax, this would look as follows: ``` SELECT symbol, date_format(time, 'yyyy') AS dt FROM atsd_session_summary WHERE exchange = 'SIP' AND class = 'SIP' AND symbol LIKE 'A%' AND date_format(time, 'w') <= 2 AND datetime >= '2020' GROUP BY exchange, class, symbol, PERIOD(1 year) ORDER BY symbol, dt ``` If you have reference data nearby, filtering by security type is another filter one can use. The good news is that security type doesn't change so we can safely apply the current type to historical records. Security type is typically available in all retail data platform APIs, whether Alpha Vantage or others. ``` AND tags.entity.type = 'CS' ``` ## Answer by Brian from QuantRocket (score 0) https://quant.stackexchange.com/a/63240 To do this correctly, you need several things: - survivorship bias-free price data (that is, data with active and delisted tickers). If you plan to use fundamental data in your investment rules, you also need survivorship bias-free fundamental data. - securities master data that is sufficiently rich to allow you to distinguish between different security types (preferred shares, common stock, ADRs, etc.) - a way to dynamically filter the universe of securities according to your criteria, based on the subset of securities that were active at the time. QuantRocket supports this use case well. It includes survivorship bias-free price data for US equities and integrates survivorship bias-free fundamental data from Sharadar. It has rich securities master data. And the Pipeline API is specifically designed for filtering and performing computations on large universes of securities. Disclaimer: I'm affiliated with QuantRocket.
Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.