通过两个DataFrame相乘构建投资组合时间序列
解决投资组合收益率时间序列计算问题
问题诊断
你的循环代码出错的核心原因是遍历对象错误:for x in portfolios_df会迭代DataFrame的列名(即证券代码),而非投资组合的行索引,导致portfolios_df.iloc[x]调用报错——iloc仅支持整数位置参数,无法识别字符串类型的列名。
解决方案
方案1:修正循环逻辑
遍历投资组合的行索引,逐行完成计算:
import pandas as pd portfolios_time_series = pd.DataFrame() # 遍历投资组合的行索引(而非列名) for idx in portfolios_df.index: # 获取当前投资组合的权重行 portfolio_weights = portfolios_df.loc[idx] # 计算「权重×当日收益率」中间表 weighted_daily_returns = security_returns_df.multiply(portfolio_weights, axis=1) # 对每行求和得到单投资组合的收益率时间序列,存入结果表 portfolios_time_series[idx] = weighted_daily_returns.sum(axis=1)
方案2:无循环的向量运算(推荐)
利用pandas的矩阵乘法直接完成批量计算,效率远高于循环,更符合数据分析的最佳实践:
# 矩阵乘法:收益率表(日期×证券) × 转置后的权重表(证券×组合) → 组合收益率表(日期×组合) portfolios_time_series = security_returns_df @ portfolios_df.T # 若需要让投资组合作为行、日期作为列,直接转置结果即可 portfolios_time_series = portfolios_time_series.T
结果说明
两种方案都能生成你需要的最终投资组合时间序列表:
- 单个组合的「权重×当日收益率」中间表,可通过
security_returns_df.multiply(portfolio_weights, axis=1)单独获取 - 最终表的每一行对应一个投资组合的完整收益率时间序列,与你提供的示例结构完全匹配
内容的提问来源于stack exchange,提问作者Farrep7
相关产品推荐
相关产品推荐

