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如下:
| Return | Price | Trade | group | cum_return |
|---|---|---|---|---|
| 0.00 | 400 | 0 | 0 | 0.00 |
| 0.08 | 432.00 | 0 | 0 | 0.08 |
| 0.04 | 419.28 | -30 | 1 | 0.04 |
| 0.02 | 427.6656 | 0 | 1 | 0.0608 |
| 0.06 | 513.325536 | 60 | 2 | 0.06 |
| 0.10 | 564.65809 | 0 | 2 | 0.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
相关产品推荐
相关产品推荐

