如何基于策略间交易为每个策略新增列并累计金额?
实现Pandas策略实时累计金额的方法
直接上解决方案,核心是把每笔交易拆成转出、转入两条记录,再通过分组累计和宽表转换来实现:
步骤拆解
- 把每一行交易拆成两条记录:转出策略对应负金额,转入策略对应正金额
- 保留原表的行索引,方便后续对齐
- 按策略分组计算累计金额
- 转成宽格式后和原表合并,得到每个策略的实时累计值
完整代码
import pandas as pd # 原始数据集 df = pd.DataFrame({"value": [1000, 4000, 2000, 3000], "out": ["cash", "cash", "lending", "DCA"], "in": ["DCA", "lending", "cash", "lending"]}) # 1. 拆分转出、转入记录 out_entries = df.assign(strategy=df['out'], amount=-df['value'])[['strategy', 'amount']] in_entries = df.assign(strategy=df['in'], amount=df['value'])[['strategy', 'amount']] # 2. 合并记录并保留原行索引 all_entries = pd.concat([out_entries, in_entries], keys=df.index).reset_index(level=0) # 3. 按策略计算累计金额 all_entries['cumulative'] = all_entries.groupby('strategy')['amount'].cumsum() # 4. 转宽格式并填充缺失值(初始为0) cumulative_table = all_entries.pivot(index='level_0', columns='strategy', values='cumulative').fillna(0) # 5. 和原表合并得到最终结果 final_df = pd.concat([df, cumulative_table], axis=1) print(final_df)
运行结果
value out in cash lending DCA 0 1000 cash DCA -1000.0 0.0 1000.0 1 4000 cash lending -5000.0 4000.0 1000.0 2 2000 lending cash -3000.0 2000.0 1000.0 3 3000 DCA lending -3000.0 5000.0 -2000.0
优势说明
- 全程用Pandas向量化操作,比逐行循环效率高,适合处理大规模数据
- 自动识别所有策略类型,不用手动指定列名,新增策略时无需修改代码
内容的提问来源于stack exchange,提问作者Wakuu
相关产品推荐
相关产品推荐

