基于收益率(Ret %)计算权益变动:求Pandas/Numpy向量化替代方案
向量化计算权益变动(Pandas/Numpy解决方案)
问题背景
现有如下结构的DataFrame:
Ret % 0 0.02 1 0.01 2 0.04 3 -0.02 4 -0.01 5 0.04 6 0.02 7 -0.01 8 0.04 9 -0.02 10 0.01 11 0.04
需要生成名为Equity的列,以初始金额100为起点,每次将对应Ret %(收益率)应用于当前权益计算变动,预期结果如下:
Ret % Equity 0 0.02 102.00 1 0.01 103.02 2 0.04 107.14 3 -0.02 105.00 4 -0.01 103.95 5 0.04 108.11 6 0.02 110.27 7 -0.01 109.17 8 0.04 113.53 9 -0.02 111.26 10 0.01 112.37 11 0.04 116.87
已通过for循环实现,但需要提升性能,寻求Pandas/Numpy的向量化解决方案。
向量化实现方案
直接利用Pandas的cumprod()函数实现累积乘积计算,这是底层优化的向量化操作,性能远优于Python循环:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'Ret %': [0.02, 0.01, 0.04, -0.02, -0.01, 0.04, 0.02, -0.01, 0.04, -0.02, 0.01, 0.04] }) # 计算权益变动:(1+收益率)的累积乘积 × 初始资金100 df['Equity'] = (1 + df['Ret %']).cumprod() * 100 # 保留两位小数,匹配预期结果格式 df['Equity'] = df['Equity'].round(2) # 输出结果 print(df)
原理说明
- 将收益率转换为资金乘数:
1 + df['Ret %'],比如收益率0.02对应乘数1.02,-0.02对应乘数0.98 - 使用
cumprod()计算乘数的累积乘积,得到每一期相对于初始资金的总倍数 - 乘以初始资金100,得到每一期的权益金额
- 最后用
round(2)保留两位小数,和预期结果格式一致
这种方法完全基于Pandas的向量化操作,避免了Python循环的性能损耗,在数据量较大时性能提升非常明显。
内容的提问来源于stack exchange,提问作者Gus
相关产品推荐
相关产品推荐

