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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:20:53