如何用逐行随机权重DataFrame计算多资产组合日收益率?
问题原因与解决方案
问题根源
你遇到的全NaN结果,核心原因是Pandas的索引对齐机制:
wdf.iloc[i]提取的单行权重是一个以A/B/C为索引的Series;pct_returns的行索引是日期,列索引是A/B/C;- 直接相乘时,Pandas会优先按行索引对齐,日期与
A/B/C完全不匹配,导致所有位置无法对齐,最终返回全NaN。
解决方法
方法1:逐行计算单组合
将权重转为numpy数组跳过索引对齐,或指定按列对齐后求和:
# 方式A:用矩阵乘法(推荐) weights = wdf.iloc[0].values # 取第1组权重,转为numpy数组 portfolio_return = pct_returns.dot(weights) # 计算每日组合收益率 # 方式B:按列相乘后求和 weights = wdf.iloc[0] portfolio_return = pct_returns.multiply(weights, axis='columns').sum(axis=1)
方法2:批量计算所有100组组合高效无循环
不用逐行循环,直接通过矩阵乘法一次性生成所有组合的收益率:
# pct_returns(T行3列) × wdf转置(3行100列) → T行100列的结果 all_portfolios = pct_returns.dot(wdf.T) # 为组合命名可选 all_portfolios.columns = [f'Combo_{idx+1}' for idx in range(wdf.shape[0])]
前置检查:确保列名匹配
如果pct_returns和wdf的列名不一致,也会导致对齐失败,先确认列名完全一致:
# 检查列名是否匹配 assert list(pct_returns.columns) == list(wdf.columns), "资产列名不匹配,请调整"
内容的提问来源于stack exchange,提问作者Mark Smith
相关产品推荐
相关产品推荐

