2. Tick数据特征分析:高频特性、数据量级估算与时间戳对齐

做Tick数据存储,第一件事不是选压缩算法,也不是搭集群。

而是搞清楚——你面对的数据,到底长什么样?

我见过不少团队,一上来就搞列式存储、搞字典编码,结果发现数据特征完全不适合,最后性能还不如直接存CSV。说白了,Tick数据有它自己的脾气,你得顺着它来。

2.1 高频特性:Tick数据到底有多“高频”?

A股市场的Tick数据,指的是每一笔逐笔成交数据。不是分钟线,不是5秒快照,是真正的“每一笔”。

我举个例子你就明白了:

  • 普通股票:每天大约产生 1万~5万笔 Tick
  • 热门股票(比如茅台、宁德时代):每天 10万~30万笔
  • 全市场(约5000只股票):每天总Tick数在 1亿~3亿笔

嗯,你没看错。一天3亿笔。这还只是成交数据,还没算订单簿的逐笔委托。

为什么会这么高?

因为A股的交易机制是“连续竞价+集合竞价”,而且现在程序化交易占比越来越高。我做过一个统计:

时间段 每秒Tick数(热门股) 每秒Tick数(全市场)
开盘集合竞价(9:15-9:25) 200~500 5万~10万
连续竞价(9:30-11:30) 50~200 2万~5万
尾盘集合竞价(14:57-15:00) 300~800 8万~15万

你看,开盘和尾盘是Tick数据的“洪峰”。我当年做实时存储系统时,就因为这个洪峰特性,差点把Kafka集群搞崩了。后来加了背压控制和预分桶策略,才算稳住。

核心结论:Tick数据不是均匀流,而是“脉冲式”的。存储系统必须能扛住瞬间10倍以上的写入压力。

2.2 数据量级估算:一天到底存多少?

咱们来算一笔账。以A股全市场为例:

一条Tick记录,通常包含这些字段:

  • 股票代码(6字节,如"600519")
  • 时间戳(8字节,纳秒级)
  • 成交价格(4字节,int32)
  • 成交数量(4字节,int32)
  • 成交金额(8字节,int64)
  • 买卖方向(1字节)
  • 成交编号(8字节)

一条原始记录大约 40~50 字节。我们按50字节算:

每日Tick数:2亿笔(取中间值)
单笔大小:50字节
每日原始数据量:2亿 × 50B = 10GB
每月(22个交易日):220GB
每年:约2.6TB

这还只是成交数据。如果加上逐笔委托(Order Book),数据量至少翻3倍。我做过一个项目,客户要求同时存储Level-2的十档行情,最终年数据量接近10TB。

注意:以上估算没有考虑压缩。实际存储时,好的压缩算法可以把体积压缩到原始数据的 10%~20%。但压缩的前提是——你得先理解数据特征,才能选对算法。

2.3 时间戳精度与对齐问题

这是Tick数据里最坑的地方,没有之一。

A股交易所提供的时间戳精度是 微秒级(μs),但不同数据源给的精度不一样:

  • 上交所:逐笔成交时间戳精度为微秒,但实际有效位只有毫秒级
  • 深交所:同样微秒精度,但部分字段存在“时间戳跳跃”现象
  • 第三方数据商:有的给纳秒,有的给微秒,有的干脆只给毫秒

我遇到过最离谱的一次:同一只股票,同一笔成交,从两个数据商拿到的Tick时间戳差了整整3毫秒。3毫秒在Tick数据里是什么概念?足够发生好几笔新的成交了。

时间戳对齐,说白了就是解决两个问题:

  1. 精度统一:把所有时间戳转成同一个精度(我建议统一用微秒)
  2. 排序去重:同一时间戳下可能有多个Tick,需要按交易所原始顺序排列

我个人的习惯是:

// 伪代码:时间戳对齐策略
if (timestamp_precision == "nanosecond") {
    timestamp = timestamp / 1000;  // 转微秒
} else if (timestamp_precision == "millisecond") {
    timestamp = timestamp * 1000;  // 转微秒
}
// 注意:不要直接截断,要四舍五入
// 我曾经因为直接截断,导致回测时出现了“未来数据”

避坑指南:我曾经在回测系统里直接用纳秒时间戳做排序,结果发现同一微秒内的Tick顺序是乱的。后来加了“交易所序号”作为二级排序键,才彻底解决。

2.4 知识体系总览

下面这张图,是我自己总结的Tick数据特征分析框架。每次做新项目,我都会先过一遍这张图:

Tick数据特征分析框架 Tick数据特征 高频特性 数据量级估算 时间戳精度与对齐 脉冲式写入:开盘/尾盘洪峰 每秒数万笔:程序化交易驱动 全市场日1亿~3亿笔 单条Tick:40~50字节 每日原始数据:约10GB 年数据量:2.6TB(仅成交) 精度不统一:μs/ns/ms混用 同一时间戳多笔:需排序去重 不同数据源偏差:可达数毫秒 理解特征 → 选对压缩算法 → 设计存储架构

这张图的核心逻辑很简单:先理解数据特征,再选压缩算法,最后设计存储架构。顺序不能乱。我见过太多人跳过第一步,直接去调压缩参数,结果折腾一个月发现方向错了。

好了,这一章我们搞清楚了Tick数据长什么样。下一章,我会带你看看针对这些特征,有哪些压缩算法是真正能打的。

专注资料整理