Project 4 PIT 事件图
一个财报版本从发生到进入信号要经过哪些事件、每个事件的时间字段是什么、哪一步可以用来做什么。图中的日期来自构造宇宙里的一个重述例子(P102,FY2013),数值见 README。
| 阶段 | 构造时点 | 字段与用途 |
|---|---|---|
| 财年末 | 2013-12-31 | period_end;识别报告期,不是可得时间 |
| 原始10-K受理 | 2014-04-17 16:05 UTC | available_at;真实来源候选为SEC accepted |
| 原始版本入库 | 2014-04-18 | ingested_at;构造中晚于公开一天 |
| 月末信号 | 2014-04-30 23:59:59 UTC | signal_time;此时原始版本可用 |
| 下一可交易价格 | 2014-05第一个可交易时点 | trade_time;月度层只有近似 |
| 收益/标签区间 | 2014-05 | 下一日历月;只作评价 |
| 10-K/A重述受理 | 2014-05-20 | 重述的available_at |
| 重述入库与信号 | 2014-05-21入库,2014-05月末起使用 | 同时核公开/入库后,替代同报告期原始版本 |
规则
- 可得:版本在信号月
可得 ⇔ available_at与ingested_at都严格早于次月第一个时刻(UTC)。2014-04 的信号用原始值;2014-05 起用重述值;2014-03 及之前没有这个财年。 - 选取:在可得的版本里,先取
period_end最新的,再取该period_end下available_at最新的(旧期间的重述不会顶掉新期间;重述一旦可得就用重述)。同一行的所有数值(含上年比较余额)来自同一版本。 - 时间字段的用途:
period_end只回答“这是哪个报告期”,从不当作可得时间;available_at决定能不能用;ingested_at防止“数据库后来才补的”被拿来用;signal_time是计算时点;trade_time之前的价格不得执行;标签区间在signal_time之后,只用于评价。 - 行业与宇宙:行业标签用当时已知的版本;宇宙成员用
signal_time当时是否上市(含后来退市者);退市月收益计入,之后为缺失。 - 价格事件:拆股、分红影响总回报与市值;用复权总回报,不用拼接的价格;本层构造数据没有公司行动。
- 月度层的近似:信号在月末收盘后算出,应在下一个可交易时点执行;月度收益是“月末到月末”,所以月度标签(下个月收益)等价于“在上一个月末收盘价成交”,与契约“收盘信号在下一可交易时点执行”相差至多一个交易日。日度价格与成交日历是完整 Project 4 的缺项(
gap_table.md)。
历史构造反例与对应检查(不是本次新运行)
| 违反的规则 | 反例(signal_layer.py) |
观察 |
|---|---|---|
规则 1、3:把 period_end 当 available_at |
counterexample_period_end |
约 18–20% 的单元格用到了尚未提交的财报;泄漏内容与信号月 2–3 月的下月收益相关(B/M 0.079, |
| 规则 2:同一版本、重述 | counterexample_restatement |
2014-04 用原始、2014-05 用重述;混用得到 ROE 2.33%,同版本是 2.72% 或 2.51% |
| 规则 3:未来数据不进入当期 | counterexample_future_perturbation |
改掉截止月之后的一切,截止月及之前的信号逐位不变(54 个月,最大差 0) |
| 规则 4:宇宙 as-of | counterexample_survivorship |
只留幸存者:2019-06 少 13 个名字,等权月均收益略高(0.833% 对 0.818%) |
| 规则 2 与分母规则:非正分母 | counterexample_denominators |
240 个非正权益单元格,朴素 B/M 为负;规则下为 NaN |
| 预处理只用同日截面 | counterexample_full_sample_standardization |
全样本标准化与只用过去的版本在 11.2% 的单元格上符号相反 |
事件图没有覆盖的
公司合并、更名、证券代码变更与 CIK 到证券的映射;盘后公告的次日归属(SEC accepted 在 5:30pm EST 之后算次一营业日提交,见 source_feasibility.md);多份并行 10-K/A;财报以外的数据(分析师预期、新闻)。这些在真实数据阶段要补。