Reconstructing Historical Stock Index Constituents and Returns
Summary
The discussion addresses how to build a long history of monthly prices for the changing constituents of an equity index. It warns that authoritative historical membership data may require a paid data source, and that current-constituent price histories alone do not represent the index’s past composition. This matters for research that aims to avoid survivorship bias.
One answer proposes combining historical addition and removal dates with individual stock price histories; it also suggests using an index-tracking ETF as a simpler proxy for a school project. The exchange cautions that ticker names can change and that some securities may lack price data before their membership began. The ETF shortcut provides an investable proxy’s history, not the historical constituent-level dataset, and the discussion does not address adjustment conventions, delistings, or whether the suggested sources remain available or complete. Researchers should verify coverage and align membership dates with monthly observations before drawing conclusions.
Key ideas
- Historical constituent-level research requires membership records over time, not just prices for current index members.
- Addition and removal dates can be paired with historical security prices to assemble a changing-universe dataset.
- An index-tracking ETF can serve as a simpler proxy when constituent-level analysis is unnecessary.
- Ticker changes and missing early price histories can leave gaps in a reconstructed sample.
Tags
Full text
# How to download historical composition of a Stock Index with monthly prices
# How to download historical composition of a Stock Index with monthly prices
for a Quantitative project in Asset Management, I need to obtain for each year -on a long period (20 years) - the different historical constituents and their prices on a monthly basis for a given stock index (S&P 500 or CAC 40). How should I proceed? I have try with Bloomberg but it's not possible since I don't have full access. I do have access to Datastream but I only manage to have the historical prices on a monthly basis for the current constituents of the Index.
Many thanks in advance!
## Answer by FinanceGuyThatCantCode (score 4, accepted)
https://quant.stackexchange.com/a/33082
This is very difficult. S&P actually wants you to pay for weightings that currently exist - they started charging for the weightings 8 years ago or so - used to be free.
Historical constituents seem like something you will have to pay S&P for - especially with all the quant traders out there who would love such info.
Happy to delete this answer if someone proves me wrong, but I expect you have to pay for this.
## Answer by DMG (score 0)
https://quant.stackexchange.com/a/64056
you can get S&P 500 historical constituents https://en.wikipedia.org/wiki/List_of_S%26P_500_companies get the add and remove date, and you can use python to pull the list from Yahoo systematically. Most yahoo data can go back as far as 1970.
```
import pandas_datareader.data as web
import pandas as pd
pd.set_option('display.max_columns', None)
data = web.get_data_yahoo('SPY', '01/01/1997', interval='m')
print(data)
```
for a school project, you can consider using SPY instead. SPY is very closely follows the S&P500 index.
There are a couple of things you might want to watch out for:
- Some of the underlying tickers might change names, due to different financial events.
- Some of the tickers' first add date might not be available.
the following is the output from the code.
```
High Low Open Close Volume Adj Close
Date
1997-01-01 79.687500 72.750000 74.375000 78.406250 4.362370e+07 50.724728
1997-02-01 82.000000 77.125000 78.718750 79.156250 3.002880e+07 51.209930
1997-03-01 81.796875 75.250000 78.750000 75.375000 3.751430e+07 48.763680
1997-04-01 80.687500 73.312500 75.250000 80.093750 5.767930e+07 52.014885
1997-05-01 85.562500 79.312500 80.218750 85.156250 3.747340e+07 55.302582
... ... ... ... ... ... ...
2021-02-01 394.170013 370.380005 373.720001 380.359985 1.307806e+09 379.118286
2021-03-01 398.119995 371.880005 385.589996 396.329987 2.401716e+09 395.036163
2021-04-01 420.720001 398.179993 398.399994 417.299988 1.462028e+09 417.299988
2021-05-01 422.820007 404.000000 419.429993 416.579987 8.737502e+08 416.579987
2021-05-14 417.489990 413.179993 413.209991 416.579987 8.220163e+07 416.579987
[294 rows x 6 columns]
```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.