3. 关联键基础概念
在逐笔(tick-by-tick)行情数据中,委托与成交是两条独立推送的流:一边是逐笔委托(Order),一边是逐笔成交(Trade)。要把“某笔成交是由哪一笔委托产生的”这件事说清楚,就必须依赖一个能把两边记录对应起来的标识——这就是逐笔委托成交关联键。它不是行情数据里的一个普通字段,而是订单簿重建、委托生命周期追踪、成交归因分析的基础设施。
一、关联键到底在关联什么
逐笔委托记录描述的是“某账户在某个时刻提交了一笔买单或卖单”,包含委托编号、方向、价格、数量、委托类型等;逐笔成交记录描述的是“买方与卖方在某个时刻以某个价格撮合了某个数量”,包含成交编号、成交价格、成交数量、买卖双方委托编号等。关联键的作用,就是把成交记录中的“买方委托编号/卖方委托编号”与委托记录中的“委托编号”对齐,从而还原出:
- 这笔成交消耗的是哪一笔(或哪几笔)委托的剩余量;
- 该委托在成交后剩余多少、是否已全部成交或部分成交;
- 该委托是否被撤单、撤单发生在成交之前还是之后;
- 同一委托在不同时间点上的状态迁移序列。
因此,关联键的本质是委托与成交之间多对多关系的连接锚点:一笔委托可以对应多笔成交(部分成交),一笔成交也可能同时对应买方委托与卖方委托两个键。理解这一点,是后续所有重建逻辑的前提。
二、交易所官方键与衍生键的区别
不同交易所对逐笔数据的字段设计并不一致,关联键因此分为两类。
官方键是交易所行情接口中直接给出的、具有明确语义的标识。典型如:上交所逐笔委托中的“委托编号”(order no),逐笔成交中的“买方委托编号”“卖方委托编号”;深交所逐笔委托中的“委托序号”,逐笔成交中的“买方委托序号”“卖方委托序号”。官方键由交易所生成,在同一交易日内通常唯一,是关联的首选依据。
衍生键则是在官方键缺失、不完整或跨市场不统一时,由数据使用方自行构造的键。常见做法包括:以“证券代码 + 委托编号”组合成复合键,避免不同标的间编号重复;以“通道号 + 委托编号”区分不同申报通道;在官方键完全缺失时,用“时间戳 + 价格 + 数量 + 方向”构造近似匹配键。衍生键的可靠性低于官方键,尤其在时间戳精度不足、同价同量并发委托较多时,容易出现错配。
三、唯一性与一致性要求
关联键要真正可用,必须满足两个硬性条件。
唯一性:在同一作用域内,一个键只能指向一条委托记录。作用域通常定义为“同一交易日 + 同一证券代码 + 同一交易方向”。若交易所的委托编号在当日全市场唯一,则作用域可放宽;若仅在单通道内唯一,则必须把通道号纳入键。唯一性被破坏时,重建会出现“一笔成交挂到多条委托上”的歧义。
一致性:成交记录中引用的委托键,必须能在委托流中找到对应记录,且方向、价格、数量逻辑自洽。例如买方委托编号对应的委托方向应为买,成交数量不应超过该委托的原始数量。一致性检查是数据质量校验的核心环节,常见异常包括:成交引用了不存在的委托键、买卖方向与委托方向矛盾、累计成交数量超过委托数量。
下面这张图展示了官方键与衍生键在关联链路中的位置,以及唯一性、一致性检查的落点:
四、关联键在订单簿重建中的角色
订单簿重建的目标,是维护每个价位上的挂单量,并随逐笔事件实时更新。关联键在其中承担“状态机驱动”的角色:
- 建单:收到逐笔委托,以委托编号为键在委托表中登记一条记录,状态置为“挂单中”,同时把数量挂到对应价位。
- 成交扣减:收到逐笔成交,用买方/卖方委托编号回查委托表,扣减对应委托的剩余量,并同步扣减该价位的挂单量。若剩余量归零,状态置为“全部成交”。
- 撤单处理:收到撤单消息,用委托编号回查,将剩余量从价位上移除,状态置为“已撤单”。
- 异常兜底:若成交引用的键在委托表中不存在,说明委托流缺失或键不一致,应记录异常并触发补数或降级处理,而不是静默丢弃。
举个教学示例(示例参数,非实测):某证券在 09:30:00.120 收到一笔买单,委托编号 10023,价格 10.50,数量 800。随后 09:30:00.350 收到一笔成交,买方委托编号 10023,成交价 10.50,数量 300。用键 10023 回查,委托剩余量由 800 变为 500,10.50 价位挂单量同步减 300。若之后又收到一笔成交引用 10023、数量 600,则累计成交 900 超过原始 800,一致性校验应报错,提示数据异常而非继续扣减。