You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:55:11