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
相关产品推荐
相关产品推荐

