创建历史标准普尔 500 指数成分股数据帧



我正试图用S&过去20年中,每天都有500家公司。我有条目和存在的数据,记录了每个公司的条目日期和存在日期(如果是这样的话(。如下所示(更多行(:

Action    Company            Code         Date
0   Added    FactSet Res         FDS.N      2021-12-20
1   Removed  HanesBrands         HBI.N      2021-12-20
2   Removed  Leggett & Platt     LEG.N      2021-12-20
3   Added    Signature Bank      SBNY.OQ    2021-12-20
4   Added    Solaredge Tech      SEDG.OQ    2021-12-20
5   Added    HanesBrands         HBI.N      2015-03-23
6   Added    Leggett & Platt     LEG.N      1999-10-18

在另一个数据帧中,我将每个交易日期作为索引,并将每个唯一的公司代码作为列。它看起来像这样(更多的列(:

Dates   FDS.N   HBI.N   LEG.N  SBNY.OQ  SEDG.OQ      
1999-12-31  NaN     NaN     NaN     NaN     NaN
2000-01-03  NaN     NaN     NaN     NaN     NaN
2000-01-04  NaN     NaN     NaN     NaN     NaN
2000-01-05  NaN     NaN     NaN     NaN     NaN
2000-01-06  NaN     NaN     NaN     NaN     NaN
...         ...     ...     ...     ...     ...
2021-12-27  NaN     NaN     NaN     NaN     NaN
2021-12-28  NaN     NaN     NaN     NaN     NaN
2021-12-29  NaN     NaN     NaN     NaN     NaN
2021-12-30  NaN     NaN     NaN     NaN     NaN
2021-12-31  NaN     NaN     NaN     NaN     NaN

我试图做的是用每个公司的名称填充第二个DataFrame,如果在每个索引日期该公司是否是索引的一部分。它可能是这样的(这只是一个例子(:

Dates   FDS.N   HBI.N   LEG.N  SBNY.OQ   SEDG.OQ     
1999-12-31  NaN     NaN    LEG.N     NaN       NaN
2000-01-03  NaN     NaN    LEG.N     NaN       NaN
2000-01-04  NaN     NaN    LEG.N     NaN       NaN
2000-01-05  NaN     NaN    LEG.N     NaN       NaN
2000-01-06  NaN     NaN    LEG.N     NaN       NaN
...         ...     ...     ...     ...        ...
2021-12-27  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ
2021-12-28  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ
2021-12-29  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ
2021-12-30  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ
2021-12-31  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ

我真的不知道怎样才能做到这一点。

在上市日期和退市日期的数据框架中按问题提取,如果有两行,则第一行上市,第二行退市,因为存在上市和退市,并且在一行的情况下只有上市日期,因此日期范围作为指定的最后一天。最后,更新来自S&P与所需交易日期的指数。

import pandas as pd
import io
import yfinance as yf
sp500_idx = yf.download("^GSPC", periods=max)
new_index = sp500_idx.loc['1999-12-31':'2021-12-31',].index
data = '''
Action    Company            Code         Date
0   Added    "FactSet Res"         FDS.N      2021-12-20
1   Removed  "HanesBrands"         HBI.N      2021-12-20
2   Removed  "Leggett & Platt"     LEG.N      2021-12-20
3   Added    "Signature Bank"      SBNY.OQ    2021-12-20
4   Added    "Solaredge Tech"      SEDG.OQ    2021-12-20
5   Added    "HanesBrands"         HBI.N      2015-03-23
6   Added    "Leggett & Platt"     LEG.N      1999-10-18
'''
df = pd.read_csv(io.StringIO(data), delim_whitespace=True)
df['Date'] = pd.to_datetime(df['Date'])
new_df = pd.DataFrame()
# start = '1999-12-31'
end = '2021-12-31'
for c in df['Code'].unique():
dfc = df.query('Code == @c')
dfc = dfc.sort_values('Date', ascending=True).reset_index()
if len(dfc) == 2:
drange = pd.date_range(dfc.loc[0,'Date'], dfc.loc[1,'Date'])
else:
drange = pd.date_range(dfc.loc[0,'Date'], end)
s = pd.Series(c, index=drange, name=c)
new_df = pd.concat([new_df, s],axis=1)

FDS.N   HBI.N   LEG.N   SBNY.OQ     SEDG.OQ
Date                    
1999-12-31  NaN     NaN     LEG.N   NaN     NaN
2000-01-03  NaN     NaN     LEG.N   NaN     NaN
2000-01-04  NaN     NaN     LEG.N   NaN     NaN
2000-01-05  NaN     NaN     LEG.N   NaN     NaN
2000-01-06  NaN     NaN     LEG.N   NaN     NaN
...     ...     ...     ...     ...     ...
2021-12-27  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ
2021-12-28  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ
2021-12-29  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ
2021-12-30  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ
2021-12-31  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ

最新更新