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

Python实现Trade列触发时重置的累计收益计算

实现方案

首先不推荐用iterrows(),因为效率低且容易出错,推荐用pandas的向量化操作来实现,步骤如下:

1. 标记分组

先根据Trade列创建分组标识,每当Trade非0时,分组编号加1:

import pandas as pd

# 构造数据
data = {
    'Return': [0.00, 0.08, 0.04, 0.02, 0.06, 0.10],
    'Price': [400, 432.00, 419.28, 427.6656, 513.325536, 564.65809],
    'Trade': [0, 0, -30, 0, 60, 0]
}
df = pd.DataFrame(data)

# 创建分组:Trade非0时触发新分组
df['group'] = (df['Trade'] != 0).cumsum()

2. 计算每组内的累计收益

对每个分组计算(1+Return)的累乘,再减1得到累计收益:

# 计算累计收益:每组内(1+Return)的乘积减1
df['cum_return'] = df.groupby('group')['Return'].apply(lambda x: (1 + x).cumprod() - 1)

结果验证

最终的DataFrame如下:

ReturnPriceTradegroupcum_return
0.00400000.00
0.08432.00000.08
0.04419.28-3010.04
0.02427.6656010.0608
0.06513.3255366020.06
0.10564.65809020.166

为什么不用iterrows()?

iterrows()是逐行遍历,速度慢,且处理分组逻辑时需要手动维护分组状态,容易出错。而向量化操作利用pandas的内置函数,效率高且代码简洁。

如果一定要用iterrows()实现,代码如下(不推荐):

cum_return = 0
df['cum_return_iter'] = 0.0

for idx, row in df.iterrows():
    if row['Trade'] != 0:
        # 出现交易,重置累计收益,当前Return直接作为起始
        cum_return = row['Return']
    else:
        # 无交易,累计收益计算为(1+cum_return)*(1+row['Return']) - 1
        cum_return = (1 + cum_return) * (1 + row['Return']) - 1
    df.at[idx, 'cum_return_iter'] = cum_return

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:31:36