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

Python计算股票投资组合日收益率代码异常问题求助

修正投资组合日收益率计算代码

问题根源

你的代码有两处明显逻辑错误,导致计算出的日收益数值异常偏高:

  • 循环配对逻辑错误:zip(subset.iterrows(), portfolio_weightings.values()) 把每行单日数据和单个权重一一绑定,这完全不符合投资组合的计算逻辑——每一天的收益需要用到所有股票的权重,而非只对应一个权重。
  • 收益计算公式错误:当前公式重复叠加了权重与资金的乘积,还错误地用单只股票的持仓金额乘以组合收益率总和,直接导致数值被无意义放大。

修正后的代码

根据你的数据集类型,分两种情况给出修正方案:

情况1:数据集列是股票日收益率(比如0.01代表当日涨1%)

portfolio_returns = []
capital = 20000
# 对齐股票代码和权重的顺序,避免匹配错误
stock_list = list(portfolio_weightings.keys())
weight_list = list(portfolio_weightings.values())

for date, row in subset.iterrows():
    # 提取当日各股票的收益率
    daily_stock_returns = row[stock_list].values
    # 计算当日组合收益率:每只股票收益率×对应权重后求和
    portfolio_daily_return = sum(daily_stock_returns * weight_list)
    # 当日收益 = 初始资金 × 组合收益率(若要复利则需更新capital)
    daily_profit = capital * portfolio_daily_return
    portfolio_returns.append(daily_profit)
    # 如果需要模拟资金逐日增长,取消下面注释
    # capital += daily_profit

情况2:数据集列是股票收盘价

需要先计算单只股票的日收益率,再计算组合收益:

portfolio_returns = []
capital = 20000
stock_list = list(portfolio_weightings.keys())
weight_list = list(portfolio_weightings.values())

# 先计算每只股票的日涨跌幅:(当日收盘价-前日收盘价)/前日收盘价
stock_daily_returns = subset[stock_list].pct_change().dropna()

for date, row in stock_daily_returns.iterrows():
    portfolio_daily_return = sum(row.values * weight_list)
    daily_profit = capital * portfolio_daily_return
    portfolio_returns.append(daily_profit)
    # 模拟复利增长的话取消注释
    # capital += daily_profit

注意事项

  • 一定要确保数据集里的股票列顺序和权重字典的键顺序一致,不然会出现权重和股票不匹配的问题;
  • 如果只是计算基于初始资金的每日收益,不用更新capital;如果要体现复利效果,每次计算后要把当日收益加到capital里;
  • 修正后的数据会回到合理范围,比如初始资金20000的话,单日收益大概在几十到几百区间(依市场波动而定)。

内容的提问来源于stack exchange,提问作者Barrett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:12:41