1. 课程导入
在进入具体算法与工程实现之前,我们需要先建立对“高频行情数据”这一对象的整体认知。很多工程师第一次接触行情数据时,会把它当作普通的时序数据来处理,结果在存储成本、回放延迟和查询效率上接连踩坑。本章的目标不是讲某个压缩算法,而是帮你建立一张全局地图:数据长什么样、难点在哪里、我们要学什么、按什么路线推进。
一、高频行情数据的特点:为什么它不能当普通时序数据处理
高频行情数据通常来自交易所的逐笔委托、逐笔成交和快照行情。以国内A股Level-2为例,单市场单日逐笔数据可达数亿条,快照数据每3秒一次、每次包含数百只股票的十档盘口。它的核心特征可以归纳为以下几点:
- 高吞吐、低延迟:行情峰值每秒可达数十万条消息,采集端必须在不丢包的前提下完成落盘或转发。
- 强时间序:每条记录都带有交易所时间戳与本地接收时间戳,时间不可逆,乱序窗口有限。
- 字段高度重复:同一只股票在连续快照中,代码、市场、买卖方向等字段几乎不变,变化集中在价格和数量上。
- 数值分布集中:价格通常落在有限档位,数量多为整数且量级相近,存在大量可预测的增量。
- 结构半结构化:不同交易所、不同行情类型的字段布局不同,但同一类型内部结构稳定。
这些特征决定了:通用压缩工具(如gzip)虽然能压缩,但压缩比和速度都难以同时满足要求;而直接按行存储原始结构体,磁盘和内存开销会迅速失控。因此,我们需要专门针对行情数据设计编码与存储方案。
核心判断:高频行情数据的本质是“带时间戳的、字段高度相关的、增量可预测的数值流”。压缩的关键不在于通用熵编码,而在于把“相关性”和“可预测性”转化为更小的表示。
二、核心原理:压缩编码与存储优化的三个层次
本课程将压缩与存储优化拆成三个相互配合的层次,理解这三层是后续所有实战的基础。
- 字段级编码:针对单个字段做变换,例如时间戳差分、价格定点化、数量变长整数编码。目标是消除字段内部的冗余。
- 记录级编码:利用同一记录内字段之间的相关性,例如用“股票代码+方向”作为上下文,对价格和数量做增量编码。目标是消除记录内部的冗余。
- 块级存储:把多条记录组织成数据块,配合列式布局、字典编码和块内压缩,再叠加索引与分片策略。目标是降低I/O放大并提升查询效率。
这三层不是孤立的。字段级编码决定了记录级编码的输入形态,记录级编码又决定了块级存储的压缩上限。实战中常见的误区是只优化某一层,例如只换一个更快的压缩库,却忽略了字段本身的编码方式,最终收益有限。
三、方法流程:从原始行情到可查询存储的完整链路
把上面的三层结构落到工程上,一条典型的处理链路如下:
交易所行情源
↓ 采集(组播/专线)
原始消息缓冲(内存队列)
↓ 解析与规范化
统一记录结构(时间戳、代码、价格、数量、方向)
↓ 字段级编码
编码后记录流
↓ 记录级编码 + 块组装
压缩数据块(含块头、字典、索引)
↓ 落盘/写入对象存储
分片文件 + 元数据索引
↓ 查询/回放
按时间范围与代码过滤读取
这条链路中,每一步都会影响最终压缩比和查询性能。例如,解析阶段如果保留了冗余的字符串代码,后续字典编码的压力就会增大;块组装时如果块太大,单次查询的I/O放大就会明显。因此,本课程会沿着这条链路逐段拆解。
实战提示:在动手写压缩代码之前,先统计你的数据中“每字段的变化频率”和“数值分布直方图”。这两个统计量往往比任何压缩算法选型都更能决定最终效果。
四、案例与场景:一个典型的存储成本失控案例
某团队最初把逐笔成交按CSV格式落盘,单日单市场约120GB。后来改为二进制结构体存储,降到约45GB,但查询某只股票某段时间的成交明细仍需扫描大量无关数据。再后来引入字段级差分编码和按股票代码分片,单日降到约9GB,且按代码查询时只需读取对应分片。
| 阶段 | 存储格式 | 单日体积 | 主要问题 |
|---|---|---|---|
| 初始 | CSV文本 | 约120GB | 体积大、解析慢、无索引 |
| 第一次优化 | 二进制结构体 | 约45GB | 体积下降,但查询仍需全扫描 |
| 第二次优化 | 差分编码+分片 | 约9GB | 需维护字典与索引一致性 |
这个案例说明:压缩编码和存储优化必须一起考虑。只压不索引,查询依然慢;只索引不压,成本依然高。课程后续会围绕“压缩比、写入速度、查询延迟、实现复杂度”这四个维度做权衡。
五、常见误区与复盘
- 误区一:直接上通用压缩库就能解决问题。通用压缩库对行情数据的压缩比通常只有2~4倍,而针对性编码可达10倍以上。
- 误区二:只关注压缩比,忽略解压速度。回放场景对解压延迟敏感,过度复杂的编码可能得不偿失。
- 误区三:忽略时间戳的精度与单调性。时间戳差分编码的前提是单调递增,乱序数据需要额外处理。
- 误区四:块大小拍脑袋决定。块太大导致I/O放大,块太小导致压缩率下降,需要根据查询模式实测。
复盘结论:高频行情压缩不是“找一个最强算法”,而是“针对数据特征设计一套可验证、可调优的编码与存储组合”。本课程后续每一章都会给出可运行的参数与验证方法。
六、学习目标与整体课程框架
完成本课程后,你应该能够:
- 准确描述高频行情数据的字段特征与统计规律;
- 独立设计字段级与记录级编码方案,并评估压缩比;
- 实现按时间与代码分片的块级存储,并建立索引;
- 针对回放与查询两类场景做参数调优;
- 定位压缩链路中的性能瓶颈并给出优化方案。
整体课程按“认知—编码—存储—实战—复盘”推进:前几章建立数据认知与编码基础,中间章节深入记录级编码与块存储,后段进入分片、索引、冷热分层与真实行情回放实战,最后做性能对比与故障复盘。每章都会配可运行的代码片段与参数清单,方便你直接在自己的数据上验证。
现在,你已经有了这张全局地图。接下来我们将从行情数据的字段结构开始,逐步进入编码与存储的具体实现。