阶段4数据获取●●●●●

财务数据对齐:公告日≠报告期的生死线

我的掌握程度:
q-331精讲

先掌握这个答案

两个日期:①报告期(end_date):财报覆盖的截止日(Q1=3月31日)——"这段时间的经营结果";②公告日(ann_date):实际对外披露的日期——通常滞后1-4个月。对齐铁律:任何时点只能用「公告日≤当日」的财务数据。merge_asof用法:pd.merge_asof(price, finance, left_on='date', right_on='ann_date', direction='backward')——每个交易日取最近已公告的值。错用报告日的后果:财务因子IC虚高30-100%——半年报公布前3个月就在"用"它。

先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。

从理解到使用

以信息可得时间对齐

财报报告期结束日不是市场获知信息的时间。对每个特征记录available_at,并确认不晚于决策时点;盘后数据通常不能用于同日收盘前下单。保留历史修订与退市样本,检查删尾重跑是否稳定。

本阶段实战方法 · 一条能复现的数据流水线

把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。

  1. 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
  2. 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
  3. 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。

使用边界

  • 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
  • API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
背景 · 从一个困惑说起
一季报的"报告期"是3月31日——但公司4月20日才公布。数据库标的是3月31日——如果你在3月31日的回测里用了这个数据——你在偷看三周后的信息。
由此产生的问题
公告日与报告期的区别?merge_asof的正确用法(按公告日对齐)?错用报告日的后果量级?
核心概念
两个日期:①报告期(end_date):财报覆盖的截止日(Q1=3月31日)——"这段时间的经营结果";②公告日(ann_date):实际对外披露的日期——通常滞后1-4个月。对齐铁律:任何时点只能用「公告日≤当日」的财务数据。merge_asof用法:pd.merge_asof(price, finance, left_on='date', right_on='ann_date', direction='backward')——每个交易日取最近已公告的值。错用报告日的后果:财务因子IC虚高30-100%——半年报公布前3个月就在"用"它。
为什么需要它
①前视偏差的第一大来源:阶段1的q-063讲原理——本题是代码落地;②merge_asof是防前视的工程标准件:它确保每个时点用的都是"当时已知"的最新版;③机构级要求:数据团队的核心价值之一就是维护ann_date口径的PIT数据——个人的纪律版。
实际应用场景
标准三步:①确认数据有ann_date列(tushare的income/balancesheet自带);②按ann_date排序;③merge_asof(backward)到交易日——NaN表示"还没公告"(诚实的信息真空)。
与之前知识的联系
q-062/063(阶段1前视与PIT概念)→本题(代码实现)→q-332(merge_asof深入);与q-357(截断检验)的终极防线配合。
⚠ 常见误解
  • 用报告期对齐差几周影响不大:一季报的差距约3周、年报可达4个月——这期间你的因子在"偷看"——IC虚高50%+很常见
  • 数据库有ann_date就不用管了:还要确认merge用的是ann_date列(不是end_date列)——字段选错一切白搭
  • merge_asof会自动防止前视:它按你指定的列对齐——如果你错指定end_date它照错不误——工具的正义取决于你选的列

🤖 AI导师

导师会先检查你的前置知识(复权口径、merge),再用案例、公式和代码帮助理解。此功能需要先启用服务。