2. 金融数据源概览

在多源金融数据的事件时间对齐中,第一步不是写代码,而是建立对数据源本身的“时间语义地图”。同一笔市场事件,在行情、交易、公告、新闻、财报、宏观六类数据源中,其被记录、被发布、被生效的时间往往并不一致。若忽略这些差异,后续对齐就会把“发布时间”误当“发生时间”,把“报告期”误当“披露时间”,导致特征穿越或事件错配。

核心原则:每个数据源至少存在三个时间维度——事件发生时间、数据生成/采集时间、数据可用时间。事件时间对齐的目标,是让所有特征在“可用时间”上严格不晚于预测或决策时点。

一、六类数据源的时间语义与频率特征

下表从频率、典型时间字段、时间语义和主要对齐风险四个角度,对六类数据源进行横向对比。这是本章最需要先建立的整体认知。

数据源 典型频率 关键时间字段 时间语义 主要对齐风险
行情 毫秒~日频 trade_time、quote_time、exchange_ts 交易所撮合或快照生成时刻 交易所时钟与本地时钟偏差、快照非连续
交易 逐笔/订单级 order_ts、exec_ts、cancel_ts 订单与成交的实际发生时刻 撤单与成交乱序、回报延迟
公告 事件驱动 publish_time、effective_date 披露时刻与生效日期分离 盘后发布、次日生效,易造成前视
新闻 秒级~分钟级 news_time、ingest_time 媒体发布与系统入库不同步 转载、修订、时区不统一
财报 季度/年度 report_period、announce_date 报告期与披露日严格区分 把报告期当可用时间,严重前视
宏观 月/季/年 period、release_time、revision 统计期、初值、修正值多层 修正值回填、发布滞后

二、核心原理:三类时间与可用时间边界

无论数据源如何变化,事件时间对齐都围绕三类时间展开:事件时间(事情真实发生)、记录时间(系统写入)、可用时间(下游可安全使用)。行情和交易的记录时间通常接近事件时间,延迟以毫秒计;公告、新闻、财报、宏观则存在明显的“发布—生效—修正”链条,可用时间往往晚于事件时间数小时到数月。

因此,对齐时不能简单按事件时间排序,而应构造统一的“可用时间轴”。对每条记录,取所有时间字段中“最晚且真实可观测”的那个作为可用时间下界。例如财报的可用时间应取 announce_date 而非 report_period;宏观数据若存在修正,应保留 revision_time 并只使用当时已发布的版本。

实用判断:如果某字段在预测时点尚不可知,它就不能进入特征。可用时间边界是防止前视偏差的唯一硬约束。

三、方法流程:从数据源到统一时间轴

  1. 字段盘点:列出每个数据源的全部时间字段,标注其语义(发生/记录/发布/生效/修正)。
  2. 时区归一:统一为 UTC 或交易所本地时间,并记录原始时区,避免跨市场错位。
  3. 可用时间计算:按业务规则确定可用时间,如公告取 publish_time,财报取 announce_date,宏观取 release_time。
  4. 频率对齐:高频行情可降采样到决策频率,低频数据可前向填充,但填充只能使用已发布值。
  5. 乱序与重复处理:对逐笔和新闻按可用时间排序,处理重复转载与修订版本。
  6. 对齐验证:抽样检查是否存在“特征时间晚于标签时间”的穿越样本。
# 示例:统一可用时间字段(伪代码)
def resolve_available_time(row, source):
    if source == "quote":
        return row["exchange_ts"]
    if source == "announcement":
        return row["publish_time"]
    if source == "financial_report":
        return row["announce_date"]   # 不是 report_period
    if source == "macro":
        return row["release_time"]    # 不是 period
    return row["ingest_time"]

四、案例场景:同一事件的六源时间线

假设某上市公司在 2024-04-25 收盘后发布年报,报告期为 2023-12-31,新闻在 19:30 转载,行情在次日 09:30 反应,宏观数据在 05-15 发布。若以报告期 2023-12-31 作为特征时间,模型会在 2024 年初就“提前知道”年报内容,形成严重前视。正确做法是以 announce_date 2024-04-25 作为可用时间,新闻和行情则按各自可用时间对齐到该事件之后。

六类数据源:事件时间 → 可用时间 事件发生 可用时间 行情/交易 毫秒级可用 新闻 分钟级可用 公告 发布即可用,生效日另计 财报 披露日可用,非报告期 宏观 发布+修正,滞后最长 可用时间边界 特征不得晚于决策时点

五、误区与复盘

  • 误区一:用报告期代替披露日。财报、宏观的 period 只是统计区间,真正可用时间是发布日,混用会造成数月级前视。
  • 误区二:忽略时区。跨市场数据若未统一时区,行情与新闻可能错位数小时,事件窗口完全失真。
  • 误区三:把入库时间当事件时间。新闻转载和系统补录会让 ingest_time 远晚于 news_time,需按业务选择。
  • 误区四:忽略修正值。宏观数据初值与修正值差异显著,回填修正值等于使用未来信息。
复盘要点:对齐后必须做“时间穿越审计”——随机抽取样本,检查是否存在任何特征字段的可用时间晚于标签时间。若存在,优先修正可用时间定义,而不是调整模型。

建立六类数据源的时间语义地图,是后续事件时间对齐、特征工程和回测可信度的基础。只有先分清“何时发生”与“何时可用”,才能让多源数据在同一时间轴上安全汇合。