Index Constituent Membership History — S&P 500, NASDAQ-100, Dow Jones
Two-file companion dataset for survivorship-bias-free backtesting. (1) Current constituents (635 rows): every member of the S&P 500, NASDAQ-100, and Dow Jones Industrial Average as of build date, with sector, sub-sector, headquarters, founding year, CIK, and date first added to the index. (2) Historical changes (2055 rows): every add/drop event for these three indices, stretching back to 1957 (S&P 500), 1985 (NASDAQ-100), and 1994 (Dow Jones), with the symbol added, the symbol replaced, the date, and the reason given by S&P/NASDAQ/Dow. Why this matters: every realistic backtest of an index strategy on point-in-time membership requires knowing who was IN the index at each historical date — without this, you suffer survivorship bias (only seeing winners that survived to today). Reconstruct membership at any past date by starting with current and replaying changes backwards. Read with pandas.read_csv(path, compression='gzip', parse_dates=['date']).
Use Cases
- Survivorship-bias-free backtesting (reconstruct point-in-time index membership)
- Index turnover analysis: which sectors are gaining / losing weight over time
- Trading the rebalance: studying announcement-effect alpha around add/drop events
- Long-horizon performance studies on "survived" vs "removed" populations
- Building accurate benchmark portfolios for any historical date
Methodology
Six FMP calls: sp500-constituent, nasdaq-constituent, dowjones-constituent for current membership; historical-sp500-constituent, historical-nasdaq-constituent, historical-dowjones-constituent for change history. Combined into two CSVs (current and historical) with an index column distinguishing the three indices.
Update Schedule
Static snapshot. S&P / NASDAQ / Dow only change a handful of times per year — refresh quarterly if needed.
Attribution
Source: index methodology committees (S&P Dow Jones Indices, NASDAQ) via Financial Modeling Prep.
Schema
| name | type |
|---|---|
| index | string |
| symbol | string |
| name | string |
| sector | string |
| subSector | string |
| dateFirstAdded | date |
| cik | string |
| founded | string |
Sample Data
| cik | name | index | sector | symbol | founded | subSector | headQuarter | dateFirstAdded |
|---|---|---|---|---|---|---|---|---|
| 0000320193 | Apple Inc. | Dow Jones | Technology | AAPL | 1976-04-01 | Consumer Electronics | Cupertino, CA | 2015-03-19 |
| 0000318154 | Amgen Inc. | Dow Jones | Healthcare | AMGN | 1980-04-08 | Drug Manufacturers - General | Thousand Oaks, CA | 2020-08-31 |
| 0001018724 | Amazon.com, Inc.amazon.com | Dow Jones | Consumer Cyclical | AMZN | 1994-07-05 | Specialty Retail | Seattle, WA | 2024-02-26 |
Get this via API
# 1. Add dAgentBase once, in any MCP client. No install, no vendor keys.
# Claude.ai / Claude Desktop: Settings -> Connectors -> Add custom connector
# Cursor / Claude Code / others: mcp.json
{
"mcpServers": {
"dagentbase": {
"url": "https://dagentbase.com/api/mcp",
"headers": { "Authorization": "Bearer dm_live_YOUR_KEY" }
}
}
}
# 2. Then ask your agent, in plain language:
# "Preview 'Index Constituent Membership History — S&P 500, NASDAQ-100, Dow Jones' and, if it fits, claim it and download the files."
# Tools it will use: search_listings -> preview_listing -> purchase_listing -> get_download_urls
# 1. Add dAgentBase once, in any MCP client. No install, no vendor keys.
# Claude.ai / Claude Desktop: Settings -> Connectors -> Add custom connector
# Cursor / Claude Code / others: mcp.json
{
"mcpServers": {
"dagentbase": {
"url": "https://dagentbase.com/api/mcp",
"headers": { "Authorization": "Bearer dm_live_YOUR_KEY" }
}
}
}
# 2. Then ask your agent, in plain language:
# "Preview 'Index Constituent Membership History — S&P 500, NASDAQ-100, Dow Jones' and, if it fits, claim it and download the files."
# Tools it will use: search_listings -> preview_listing -> purchase_listing -> get_download_urlsone time · open license
Details
Available formats