2. 高频行情数据基础

在压缩编码与存储优化之前,必须先厘清“压的是什么”。高频行情数据并非单一结构,而是由三类语义不同、频率不同、字段不同的数据流组成:逐笔委托(Order)、逐笔成交(Trade)与快照行情(Snapshot)。它们在交易所侧的产生机制不同,在客户端侧的到达顺序与时间精度也不同。理解这些差异,是后续设计编码方案与存储模型的前提。

一、三类数据的核心原理与字段含义

逐笔委托记录的是“订单进入撮合引擎”这一事件。以沪深市场为例,上交所与深交所的逐笔委托字段存在差异,但核心语义一致:订单序号、通道号、证券代码、委托价格、委托数量、买卖方向、订单类型。深交所还包含“委托类别”(市价、限价、本方最优等)。逐笔委托是重建订单簿(Order Book)的原始输入。

逐笔成交记录的是“撮合引擎完成一次配对”这一事件。核心字段包括:成交序号、买方订单号、卖方订单号、成交价格、成交数量、成交时间、成交类型(成交、撤单)。注意,撤单在部分数据源中通过“成交类型”字段标识,而非独立消息,这是初学者最容易忽略的细节。

快照行情是“某一时刻订单簿的切片”。它不记录事件,而是记录状态:买卖各若干档的价格与数量、最新价、成交量、成交额、加权平均价等。快照按固定频率(如沪深3秒、部分期货500ms)发布,是策略中最常用的行情形态。

关键区别:逐笔数据是“事件流”,快照是“状态流”。事件流可重放、可重建状态;状态流不可逆推事件。压缩策略必须分别对待:事件流适合差分+字典编码,状态流适合列式+增量编码。

二、时间精度:最容易被低估的压缩维度

时间字段是高频数据中压缩收益最高的维度之一。不同数据源的时间精度差异巨大:

  • 交易所撮合时间:通常为微秒级(如深交所逐笔委托/成交带微秒时间戳)。
  • 快照时间:交易所侧为毫秒或秒级,但客户端接收时间常为纳秒级。
  • 本地采集时间:取决于网卡与时钟同步,PTP可达亚微秒,NTP通常毫秒级。

压缩时,若将时间戳按“绝对纳秒”存储,单条记录需8字节;若改为“相对前一跳的微秒差”,多数差值落在0~1000之间,可用1~2字节变长编码。这是时间维度压缩的核心思路。

三、常见数据源与结构差异

数据源逐笔委托逐笔成交快照频率时间精度
上交所 Level-2有(含订单号)有3秒微秒
深交所 Level-2有(含委托类别)有(含撤单标识)3秒微秒
中金所 Level-2有有500ms毫秒
第三方合成可能缺失可能合并1秒或自定义毫秒

数据源差异直接影响编码设计。例如,深交所逐笔委托含“委托类别”枚举,适合字典编码;上交所无此字段,则无需预留。若统一按最大字段集设计,会造成大量空值浪费。

三类行情数据的时间与语义关系 逐笔委托 Order 事件:订单进入撮合 字段:序号/价格/数量/方向 时间:微秒级 用途:重建订单簿 逐笔成交 Trade 事件:撮合配对完成 字段:买/卖订单号/价格/量 时间:微秒级 用途:成交明细/撤单识别 快照 Snapshot 状态:订单簿切片 字段:多档价格/量/统计 时间:毫秒/秒级 用途:策略信号/风控 时间轴(客户端视角) 委托到达 成交到达 快照到达 压缩启示 事件流:差分+字典编码,时间戳用相对微秒差;状态流:列式+增量编码,多档价格用有序差分。

四、案例场景:从原始报文到可压缩结构

假设我们接收深交所逐笔委托,原始字段为:通道号、序号、证券代码、价格、数量、方向、委托类别、时间。若直接按结构体存储,单条约40字节。经过以下预处理后,可压缩至8~12字节:

原始字段(示意):
channel=1, seq=100234, code="000001", price=12.35, qty=200, side=B, type=LIMIT, time=09:30:00.123456

预处理步骤:
1. 证券代码 → 字典ID(如 000001 → 1)
2. 方向+委托类别 → 枚举编码(B+LIMIT → 0x01)
3. 价格 → 转为整数分(1235),再对同证券前一价格差分
4. 数量 → 变长整数编码
5. 时间 → 相对前一跳的微秒差(如 123456 - 123000 = 456)
6. 序号 → 通常连续,可只存增量(如 +1 或 +N)

经过上述处理,一条记录从40字节降至约10字节,压缩比约4:1。若再叠加块级压缩(如Zstd),可进一步降至6~8字节。

实战提示:不要对原始报文直接做通用压缩。先做语义级预处理(字典、差分、枚举),再做通用压缩,收益远高于直接压缩原始结构体。

五、常见误区与复盘

  • 误区一:把快照当逐笔用。快照是状态切片,无法还原中间事件。若策略依赖订单簿微结构,必须使用逐笔数据重建。
  • 误区二:忽略撤单的表示差异。部分数据源将撤单放在逐笔成交中,用类型字段区分;部分放在逐笔委托中。编码前必须确认数据源语义。
  • 误区三:时间戳统一按纳秒存储。不同数据源精度不同,统一纳秒会造成大量无效低位。应按数据源实际精度选择最小可用单位。
  • 误区四:字段顺序随意。列式存储中,字段顺序影响压缩率。将高基数、低重复的字段(如订单号)与低基数、高重复的字段(如方向)分开存储,可显著提升压缩效果。

复盘结论:高频行情压缩的第一步不是选算法,而是理解数据语义与时间精度。逐笔委托、逐笔成交、快照三类数据必须分别建模、分别编码。忽略语义差异的“一刀切”压缩方案,往往在解压后才发现字段错位或时间失真。