Python多索引计算:基于历史数据对证券交易进行分类
我来帮你搞定这个交易分类需求!用Pandas的话,咱们可以用分组+矢量化操作高效实现,不用写复杂循环,代码简洁还运行快。
实现步骤与代码示例
首先得确保数据按证券(sedol)和交易日期(carry_dt)排序,这样每个证券的交易记录是按时间顺序排列的,后续的日期比较才准确:
# 按sedol分组、carry_dt升序排序 df = df.sort_values(by=['sedol', 'carry_dt'], ascending=True)
接下来分三步生成Type列,逻辑清晰又高效:
import numpy as np import pandas as pd # 1. 标记每个证券的首次交易记录:组内第一条记录即为首次 df['is_first_trade'] = df.groupby('sedol').cumcount() == 0 # 2. 获取同个证券下,当前记录的前一交易日carry_rate df['prev_carry_rate'] = df.groupby('sedol')['carry_rate'].shift(1) # 3. 嵌套条件判断生成分类结果 df['Type'] = np.where( df['is_first_trade'], '首次', np.where( df['carry_rate'] == df['prev_carry_rate'], '无变动', '调整' ) ) # 不需要辅助列的话可以删掉 df = df.drop(columns=['is_first_trade', 'prev_carry_rate'])
代码细节解释
groupby('sedol').cumcount():给每个证券组内的记录从0开始编号,编号为0的就是该证券的第一条交易记录,对应“首次”分类。shift(1):在每个证券组内把carry_rate向下偏移一行,这样每条记录就能直接拿到前一交易日的利率值,方便对比。np.where():嵌套的条件判断逻辑,先优先判断是否为首次交易,再对比当前与前一日利率,最后剩下的情况自动归为“调整”。
额外注意事项
- 如果你的
carry_dt还不是日期格式,记得先转换:df['carry_dt'] = pd.to_datetime(df['carry_dt']),否则排序会出错。 - 如果存在
carry_rate为空的情况,可以在条件里补充判断逻辑,比如把空值单独归为“调整”,示例如下:
df['Type'] = np.where( df['is_first_trade'], '首次', np.where( df['carry_rate'].notna() & (df['carry_rate'] == df['prev_carry_rate']), '无变动', '调整' ) )
内容的提问来源于stack exchange,提问作者IMiller
相关产品推荐
相关产品推荐

