Skip to content
All library documents

Reconstructing Historical Stock Index Constituents and Returns

Article Quant Q&A · Author: Paul Manigault

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.