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

基于收益率(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. 将收益率转换为资金乘数:1 + df['Ret %'],比如收益率0.02对应乘数1.02,-0.02对应乘数0.98
  2. 使用cumprod()计算乘数的累积乘积,得到每一期相对于初始资金的总倍数
  3. 乘以初始资金100,得到每一期的权益金额
  4. 最后用round(2)保留两位小数,和预期结果格式一致

这种方法完全基于Pandas的向量化操作,避免了Python循环的性能损耗,在数据量较大时性能提升非常明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:15:30