Skip to main content
Skip to main content

Index Constituent Membership History — S&P 500, NASDAQ-100, Dow Jones

DatasetCSV.GZOpenFinanceIndicesConstituentsSurvivorship BiasBacktestingSP500NASDAQDowFree

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

nametype
indexstring
symbolstring
namestring
sectorstring
subSectorstring
dateFirstAddeddate
cikstring
foundedstring

Sample Data

ciknameindexsectorsymbolfoundedsubSectorheadQuarterdateFirstAdded
0000320193Apple Inc.Dow JonesTechnologyAAPL1976-04-01Consumer ElectronicsCupertino, CA2015-03-19
0000318154Amgen Inc.Dow JonesHealthcareAMGN1980-04-08Drug Manufacturers - GeneralThousand Oaks, CA2020-08-31
0001018724Amazon.com, Inc.amazon.comDow JonesConsumer CyclicalAMZN1994-07-05Specialty RetailSeattle, WA2024-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_urls
Free

one time · open license

Details

Date Range1957-03-032026-09-05
Rows2,690
Size65.8 KB
Files2
FormatCSV.GZ

Available formats

CSV.GZ2 files · 65.8 KB
Freeopen