3. 数据压缩核心概念

在高频行情场景中,数据以毫秒甚至微秒级持续产生,单日原始行情可达数十GB。若不做压缩,网络传输、内存缓存与磁盘存储都会迅速成为瓶颈。理解压缩算法的分类与原理,是设计行情压缩方案的第一步。本节围绕无损与有损两大阵营,以及熵编码、字典编码、游程编码、差分编码四类基础方法展开,帮助你在不同行情字段上做出正确的技术选型。

一、无损压缩与有损压缩:先划清边界

无损压缩指解压后数据与原始数据逐比特一致,适用于价格、成交量、订单号等不允许任何偏差的字段。有损压缩允许在可接受误差范围内丢弃部分信息,典型如浮点价格降精度、时间戳对齐到毫秒。行情系统中,成交价与委托量通常必须无损;而某些统计指标、K线快照可接受有损以换取更高压缩比。

选型原则:凡参与撮合、清算、风控计算或监管审计的字段,一律无损;仅用于展示、监控或近似分析的派生数据,才可考虑有损。

二、四类基础编码方法的原理

1. 熵编码:按概率分配码长

熵编码的核心思想是:出现概率高的符号用短码,概率低的符号用长码,使平均码长逼近信息熵。典型代表是Huffman编码与算术编码。在行情中,买卖方向、订单类型等枚举字段分布极不均匀,熵编码收益明显。

2. 字典编码:用短索引替换重复串

字典编码将反复出现的字符串或符号序列登记到字典,后续只存索引。LZ77、LZ78、LZW均属此类。行情中的交易所代码、合约代码、会员编号重复率极高,字典编码可大幅缩减体积。

3. 游程编码:连续重复值折叠

游程编码(RLE)把连续相同的值表示为“值+重复次数”。行情中大量字段长时间不变,例如某档位价格、涨跌停标志、交易状态,RLE效果显著。但对高频跳变字段几乎无效,甚至可能膨胀。

4. 差分编码:存变化量而非绝对值

差分编码存储相邻值的差值。行情价格、时间戳、序号通常单调或小幅波动,差值远小于原值,再配合熵编码可进一步压缩。这是行情压缩中最常用、收益最稳定的方法之一。

行情字段与压缩方法匹配关系 价格 / 时间戳 单调小幅波动 合约 / 交易所代码 重复字符串 状态 / 标志位 长时间不变 方向 / 订单类型 差分编码 存增量,再熵编码 字典编码 短索引替换重复串 游程编码 值 + 重复次数 熵编码 组合压缩 差分 + 字典 + 熵编码

三、方法流程:一次完整的行情压缩链路

实际系统中,四类方法往往串联使用。以逐笔成交为例,典型流程如下:

  1. 字段拆分:将时间戳、价格、成交量、方向、合约代码分离。
  2. 差分编码:时间戳与价格转为增量序列。
  3. 字典编码:合约代码映射为短整型索引。
  4. 游程编码:对连续不变的方向或状态字段折叠。
  5. 熵编码:对上述结果统一做Huffman或算术编码。
原始逐笔: 10:00:00.001, 3500.25, 100, B, IF2406
差分后:   t=+1ms, p=+0.25, v=100, B, idx=7
游程后:   t=+1ms, p=+0.25, v=100, B×1, idx=7
熵编码:   输出变长比特流,平均每笔约 6~9 字节

四、适用场景对照清单

方法核心操作最佳适用字段不适用场景
熵编码按概率分配变长码方向、订单类型等枚举均匀分布符号
字典编码重复串替换为索引合约、交易所、会员代码取值几乎不重复
游程编码连续相同值折叠状态、标志位、静态档位高频跳变字段
差分编码存相邻值之差时间戳、价格、序号随机跳变无规律

五、常见误区与复盘

误区一:对所有字段统一使用同一种压缩算法。不同字段统计特性差异巨大,统一处理往往既得不到高压缩比,又增加CPU开销。
误区二:忽视解压速度。行情回放与实时计算对解压延迟敏感,高压缩比但解压慢的算法可能拖垮整条链路。
复盘建议:先用真实行情样本统计各字段的重复率、差分分布与熵值,再决定组合策略。压缩比、压缩速度、解压速度三者需同时评估,不能只看单一指标。