首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >财报因子回测别按报告期合并:用时间点连接挡住未来数据

财报因子回测别按报告期合并:用时间点连接挡住未来数据

原创
作者头像
量化行业新引擎
发布2026-09-22 09:08:56
发布2026-09-22 09:08:56
40
举报
文章被收录于专栏:AI量化视界AI量化视界

财报因子回测有一种隐蔽的穿越:行情表按交易日排好,再把财报表按报告期直接 merge。报告期写着 12 月 31 日,不代表那天已知道净利润;若公告几个月后才披露,年初的信号就读到了未来数据。收益曲线可能很好看,实盘却无法复现。

数据表至少保留 stock_code、report_period、published_at、ingested_at、revision_id 和 value。published_at 是公开披露时间,ingested_at 是数据管道实际拿到并处理完成的时间。可用时刻保守取两者较晚者:available_at=max(published_at, ingested_at)。若数据源只有公告日期,没有时分秒,就别假定盘中可用,可从下一交易日开始纳入信号。

连接时按决策时刻 decision_at 找当时已有的版本。用 pandas.merge_asof,指定 left_on="decision_at"、right_on="available_at"、by="stock_code"、direction="backward",并先将两张表按各自时间键升序排序。它找的是同一股票在决策前最近的一条可用记录;不要选 nearest 或 forward,以免接入未来记录。同一时刻有多条记录时,先定义版本优先级并去重。

更正公告不能直接覆盖旧行,否则今天下载的最新版财务值会悄悄改写过去的信号。连接后逐行断言 available_at<=decision_at;接不到值就保持缺失,别用未来值回填。还可以设置 tolerance,避免很久以前的数据被当成当前数据。

最后做个小测试:造一条盘后才可用的记录,断言当天收盘前的决策拿不到它,而后一个交易时段能拿到。这比只盯收益率更能说明数据管道有没有穿越。merge_asof 的排序、backward 方向及 by 分组行为,见 pandas 官方文档:https://pandas.pydata.org/docs/reference/api/pandas.merge_asof.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档