2. Tick数据基础
在构建任何量化交易或行情分析系统之前,理解Tick数据的本质是第一步。Tick数据是市场在最小时间粒度上产生的原始记录,它描述了某只标的在某一瞬间发生的成交或委托变化。与K线不同,Tick数据不经过聚合,保留了市场微观结构的全部细节,因此它既是高频策略的燃料,也是回测精度和滑点建模的基础。
一、Tick数据的定义与核心原理
Tick数据通常指交易所行情网关推送的逐笔消息,主要包括两类:逐笔成交(Trade)和逐笔委托(Order)。逐笔成交记录“谁在什么时间以什么价格成交了多少”,逐笔委托记录“谁在什么时间提交或撤销了什么价位的订单”。两者共同构成订单簿重建的输入。
核心原理在于:市场状态由订单簿驱动,而订单簿的每一次变化都对应一条Tick消息。通过按时间顺序回放这些消息,可以精确还原任意时刻的盘口深度、成交分布和买卖压力。这也是Tick数据工程流水线需要解决的核心问题——如何高效地采集、清洗、存储和回放这些消息。
关键认知:Tick数据不是“每秒一条”,而是“每笔一条”。同一毫秒内可能有多条成交,也可能长时间没有成交。因此,Tick数据的行数并不等于时间长度,不能用固定频率假设来处理。
二、字段结构与时间戳精度
不同交易所的Tick字段命名和数量差异很大,但核心字段可以归纳为以下几类:
| 字段类别 | 典型字段 | 说明 |
|---|---|---|
| 标识 | symbol、exchange、channel | 标的代码、交易所、频道 |
| 时间 | timestamp、exchange_time、local_time | 交易所时间与本地接收时间 |
| 价格 | price、last_price、bid/ask | 成交价或盘口价 |
| 数量 | volume、size、qty | 成交数量或委托数量 |
| 方向 | side、direction、bs_flag | 买/卖,主动/被动 |
| 订单 | order_id、bid_order_id、ask_order_id | 委托编号,用于订单簿重建 |
| 类型 | type、event_type | 成交、委托、撤单等 |
时间戳精度是Tick数据工程中最容易被忽视却影响最大的参数。常见精度包括:
- 秒级:早期行情或部分外汇数据,同一秒内多笔成交无法区分顺序。
- 毫秒级:多数股票和期货交易所的逐笔数据,如沪深交易所的逐笔委托和逐笔成交。
- 微秒级:部分期货交易所和加密货币交易所,适合高频策略。
- 纳秒级:少数交易所或托管环境,用于极低延迟场景。
在工程实现中,必须明确区分交易所时间和本地接收时间。交易所时间是事件发生的真实时间,本地接收时间包含网络延迟和排队延迟。回测时应优先使用交易所时间,而实盘监控中两者都需要记录,用于延迟分析。
# 典型Tick数据结构示例(JSON)
{
"symbol": "BTCUSDT",
"exchange": "BINANCE",
"event_type": "trade",
"exchange_time": 1710000000123456, # 微秒
"local_time": 1710000000125678, # 微秒
"price": 65000.5,
"qty": 0.12,
"side": "BUY",
"trade_id": "123456789"
}
三、交易所差异与常见应用场景
不同交易所的Tick数据在字段、推送频率、时间戳格式和订单簿机制上存在显著差异。以下对比几个典型市场:
- 沪深股票:逐笔成交和逐笔委托分开推送,时间戳为毫秒,包含买卖订单号,支持订单簿重建。存在集合竞价和连续竞价阶段,字段含义不同。
- 国内期货:多数交易所提供毫秒级快照和逐笔成交,部分品种有逐笔委托。时间戳精度和字段命名因交易所而异,如郑商所和大商所的字段结构不同。
- 加密货币:通常提供WebSocket推送的逐笔成交和增量深度,时间戳为微秒或纳秒,7×24小时运行,数据量极大。
- 外汇:多为报价流(Quote),包含买卖价和量,时间戳精度高,但无统一交易所,数据源分散。
工程建议:在流水线设计初期就建立统一的内部Tick Schema,将不同交易所的字段映射到标准字段,并保留原始字段用于排查。时间戳统一转换为微秒或纳秒整数,避免浮点误差。
Tick数据的常见应用场景包括:
- 高频回测:基于逐笔成交和订单簿重建,模拟真实成交和滑点。
- 市场微观结构分析:研究买卖价差、订单流不平衡、成交分布。
- 实时风控:监控异常成交、撤单率和盘口变化。
- 交易信号生成:利用Tick级特征构建短周期预测模型。
- 数据质量监控:检测丢包、乱序、重复和时间戳异常。
四、常见误区与复盘要点
误区一:把快照当Tick。很多数据源提供的是500ms或1s的快照,而非真正的逐笔。快照会丢失同一时间窗口内的多笔成交和撤单,回测结果会严重失真。
误区二:忽略时间戳精度转换。将毫秒时间戳直接当微秒使用,会导致时间轴错乱。必须在入库前统一单位并校验单调性。
误区三:不处理乱序和重复。网络抖动和重连可能导致Tick乱序或重复。流水线中应加入序列号校验和去重逻辑。
误区四:用本地时间做回测。本地时间包含网络延迟,不同机器差异大,回测应统一使用交易所时间。
复盘时建议检查以下清单:
- 时间戳单位是否统一?是否单调递增?
- 字段映射是否覆盖所有交易所?缺失字段如何处理?
- 是否区分了成交和委托?订单簿重建逻辑是否正确?
- 数据中是否存在重复、乱序、丢包?监控指标是否到位?
- 回测使用的Tick数据是否与实盘采集精度一致?
掌握Tick数据的定义、字段结构、时间戳精度和交易所差异,是后续数据采集、清洗、存储和回放工程的基础。只有在源头把数据理解清楚,才能构建出可靠、可复现的Tick数据流水线。