基于时间序列收益率计算股票远期权重的Pandas实现咨询
解决方案
核心实现逻辑为:对齐两个数据框的日期和股票代码维度,按个股分组递推计算每日权重,最终转换为要求的「日期+股票代码」双维度长表格式,完整代码如下:
import pandas as pd import numpy as np # 1. 读取并预处理原始数据 # 收益率数据:默认包含Ticker、DateTime、日度收益率三列,收益率列名可根据实际情况调整 df_res = pd.read_csv("df.csv", sep=",", header=0) df_res['DateTime'] = pd.to_datetime(df_res['DateTime']) # 统一日期格式避免匹配错误 df_res = df_res.sort_values(['Ticker', 'DateTime']).reset_index(drop=True) # 期初权重数据:读取2020-06-30的初始权重 header_list = ["Ticker", "Weight", "dDate"] dfWorker = pd.read_csv('WORKERCOW.csv', sep=",", header=None, names=header_list) dfWorker['dDate'] = pd.to_datetime(dfWorker['dDate']) # 2. 按规则递推计算每日权重 weight_result = [] # 先加入6月30日的期初权重作为初始值 weight_result.append(dfWorker.rename(columns={'dDate':'DateTime'})[['DateTime', 'Ticker', 'Weight']]) # 按个股分组计算后续每日权重 for ticker, return_group in df_res.groupby('Ticker'): # 取当前个股的期初权重 init_w = dfWorker.loc[dfWorker['Ticker'] == ticker, 'Weight'].values[0] # 按规则计算:weight[t] = weight[t-1] * return[t],如果实际规则是权重乘(1+涨跌幅),把return替换为(1+return)即可 return_group['Weight'] = init_w * (return_group['return'].cumprod()) weight_result.append(return_group[['DateTime', 'Ticker', 'Weight']]) # 3. 合并结果并排序得到最终数据框 final_df = pd.concat(weight_result, ignore_index=True) final_df = final_df.sort_values(['DateTime', 'Ticker']).reset_index(drop=True) # 输出查看结果 print(final_df)
注意事项
- 上述代码中收益率的列名默认是
return,如果你的df_res里收益率列是其他名称,自行替换即可 - 如果权重计算的实际规则是「前一日权重 * (1+当日涨跌幅)」,把cumprod行的
return_group['return']改成(1+return_group['return'])即可
内容的提问来源于stack exchange,提问作者pythonuser
相关产品推荐
相关产品推荐

