深圳融克迪特科技有限公司 Logo,金融科技,量化交易,软件开发

深圳融克迪特科技有限公司

RONG CREDIT TECHNOLOGY CO., LTD.

工具实战

【CatBoost 系列 第4讲】CatBoost在事件驱动策略中的应用:财报与公告特征融合

从事件时间对齐、事件自身特征和市场背景特征出发,说明怎样把财报与公告样本整理成适合 CatBoost 训练的事件驱动数据表。

2026-04-29 智铨研究 阅读时长 6 分钟

目录

CatBoost · 工具实战

  1. 第 1 讲【CatBoost 系列 第1讲】CatBoost在量化任务中的优势:有序提升与抗过拟合机制
  2. 第 2 讲【CatBoost 系列 第2讲】CatBoost特征输入规范:类别编码、缺失值与时间切分
  3. 第 3 讲【CatBoost 系列 第3讲】CatBoost参数调参与早停策略:稳定收益优先配置法
  4. 第 4 讲【CatBoost 系列 第4讲】CatBoost在事件驱动策略中的应用:财报与公告特征融合
  5. 第 5 讲【CatBoost 系列 第5讲】CatBoost模型可解释性:特征贡献、样本归因与异常诊断
  6. 第 6 讲【CatBoost 系列 第6讲】CatBoost概率输出与风险分层在选股模型中的应用
  7. 第 7 讲【CatBoost 系列 第7讲】CatBoost跨市场迁移:A股与期货数据域适配方法
  8. 第 8 讲【CatBoost 系列 第8讲】CatBoost模型鲁棒性测试:市场状态切换下的稳定性评估
  9. 第 9 讲【CatBoost 系列 第9讲】CatBoost生产化部署:批量推理、监控告警与漂移修复

一、本讲目标

到了事件驱动任务,CatBoost 的优势会比普通因子表更明显,因为事件样本天然混合了大量离散信息:事件类型、披露时点、行业、公告状态、修订类型、是否超预期,几乎没有哪一列是纯粹连续的。

这一讲要解决的是:怎样把财报和公告这类事件信息整理成一张适合 CatBoost 训练的事件样本表。

你需要完成四件事:

  1. 明确事件样本的观测时点和标签窗口。
  2. 区分“事件本身的信息”和“事件发生时的市场背景”。
  3. 学会把公告、财报、价格快照拼成统一样本。
  4. 避免最常见的时间对齐错误。

二、环境准备:事件驱动样本和普通日频样本有什么不同

普通日频建模通常是一日一行、资产重复出现。事件驱动样本不一样,一行更像“一次事件”。

例如一条业绩预告样本,至少要回答下面几个问题:

如果这些边界不先说清,事件样本最容易出现的问题就是:用到了披露之后才知道的数据,或者把盘后公告错误并到了当日盘中可交易样本里。

三、操作步骤:把财报和公告整理成 CatBoost 可训练样本

事件驱动最怕的不是特征不够多,而是时间线不够清楚。你可以先把样本构造拆成下面几个固定动作,每一步都只解决一个问题。

3.1 第一步:先定义事件时间

事件驱动任务里,时间戳不能只保留日期,最好保留到“披露发生在交易时段的哪个位置”。至少要分清:

因为这会直接决定你的标签起点。

例如:

如果把这两类样本混在一起按同一标签规则处理,模型学到的不是事件影响,而是错位的收益响应。

3.2 第二步:拆成三类特征

一张稳的事件样本表,通常至少包含三类特征。

第一类是事件自身特征:

第二类是事件前市场背景:

第三类是上下文辅助信息:

这三类特征分别回答的是:发生了什么、发生时市场处在什么状态、这个事件是不是特殊情形。

3.3 第三步:标签不要只盯单一天收益

事件驱动里,标签往往不只一种。

你可以做:

CatBoost 既能做回归,也能做分类。实际项目中,如果你的目标是“筛出高质量事件”,分类往往比直接回归更容易稳定;如果你的目标是“给事件打连续分”,回归更直观。

不要一开始就默认回归一定更高级,先看你的交易动作到底是什么。

四、财报和公告最值得先做的类别特征

事件驱动任务里,下面这些列很适合直接作为类别列交给 CatBoost:

这些列不适合硬转成连续数字,因为它们表达的是身份和分组,不是大小关系。

相反,下列列通常更适合作为数值特征:

一个很常见的错误是把“公告类型编码 1,2,3,4”直接当数值列,让模型误以为 4 比 1 更大、更强。对事件样本来说,这种做法通常只会制造伪结构。

五、工具落地:一个事件样本表的最小训练示例

from catboost import CatBoostClassifier, Pool

feature_cols = [
    "event_type",
    "report_quarter",
    "industry_lv1",
    "announcement_session",
    "surprise_ratio",
    "pre_ret_5d",
    "pre_ret_20d",
    "volatility_20d",
    "turnover_20d",
]

cat_cols = [
    "event_type",
    "report_quarter",
    "industry_lv1",
    "announcement_session",
]

target_col = "label_outperform_5d"

train_pool = Pool(train_df[feature_cols], label=train_df[target_col], cat_features=cat_cols)
valid_pool = Pool(valid_df[feature_cols], label=valid_df[target_col], cat_features=cat_cols)

model = CatBoostClassifier(
    loss_function="Logloss",
    eval_metric="AUC",
    iterations=800,
    learning_rate=0.05,
    depth=6,
    random_seed=42,
    verbose=100,
)

model.fit(train_pool, eval_set=valid_pool, use_best_model=True)

这段代码最关键的地方在于:

  1. 事件类型和披露时段没有被强行数值化。
  2. 标签是围绕事件后的结果定义的,而不是围绕当天收盘后的回看结果定义的。
  3. 训练集和验证集仍然要按时间切分。

六、常见问题排查

事件样本出了问题,表现往往会比普通日频样本更隐蔽,因为很多错误不是立刻报错,而是安静地把标签和特征错位了。

6.1 问题一:模型效果很好,但上线后明显偏弱

先查披露时间有没有对错。事件驱动最容易出错的地方不是参数,而是“盘后事件被当成盘前可见”。只要时间线错了,线下效果再好都不可信。

6.2 问题二:某些事件类型样本太少

这时不要急着把所有稀有事件都并进来。先确认这些稀有事件有没有足够稳定的业务含义。样本少、定义还不稳定的事件,宁可先不进第一版模型。

6.3 问题三:事件样本重复

同一家公司可能在短时间内连续发预告、正式财报、补充说明、问询回复。如果你没有定义好主事件和从事件,很容易把一段高度重叠的信息重复入样。

更稳的做法是先设规则:

七、本讲完成标准

如果你已经做到下面几点,这一讲就算完成:

  1. 能把事件时间、事件类型、市场背景拆成不同特征层。
  2. 能说清盘前、盘中、盘后公告为什么不能共用一套标签起点。
  3. 能用 CatBoost 正确接收事件类别列。
  4. 能避免把事件后才知道的信息拼回事件发生时点。

八、系列衔接

本讲是《CatBoost量化建模完整学习计划》的第 4/9 讲,当前主题是《CatBoost在事件驱动策略中的应用:财报与公告特征融合》。

上一讲:第 3 讲《CatBoost参数调参与早停策略:稳定收益优先配置法》。

下一讲:第 5 讲《CatBoost模型可解释性:特征贡献、样本归因与异常诊断》。

九、风险揭示与免责声明

风险揭示与免责声明

本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。

本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。

市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。

读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。