2. Tick数据基础:概念、结构与采集规范
Tick数据是金融市场最细粒度的交易记录,每一笔逐笔成交或每一次盘口变动都会生成一条Tick记录。在坏账率哨兵模型中,Tick数据直接决定了回放验证的时间分辨率与信号捕捉精度。本节从概念、数据结构、数据源与采集规范三个层面建立Tick数据的基础认知。
2.1 Tick数据的概念
Tick数据(逐笔数据)是指交易所或做市商系统在连续交易过程中,对每一笔成交或每一次买卖盘口变化进行实时记录的最小数据单元。与分钟线、日线等聚合K线不同,Tick数据保留了交易发生时的完整微观结构。
| 对比维度 | Tick数据 | 分钟K线 | 日K线 |
|---|---|---|---|
| 时间粒度 | 毫秒/微秒级 | 1分钟/5分钟 | 1个交易日 |
| 记录方式 | 逐笔成交/逐笔盘口 | 聚合统计 | 日终统计 |
| 信息量 | 完整微观结构 | 丢失盘口细节 | 丢失日内波动 |
| 坏账哨兵价值 | 可还原每笔挂单与成交 | 无法定位具体坏账时刻 | 仅用于日终归因 |
关键认知:坏账率哨兵模型依赖Tick数据还原“挂单→成交→撤单→坏账”的完整链路。分钟级数据会丢失盘口瞬间变化,导致坏账事件被聚合掩盖。
2.2 Tick数据结构
一条完整的Tick记录通常包含以下核心字段。根据数据用途(成交Tick vs 盘口Tick),字段组合略有差异。
2.2.1 核心字段清单
| 字段名 | 类型 | 说明 | 哨兵模型用途 |
|---|---|---|---|
| 时间戳 | datetime / int64 | 交易所撮合时间,精度通常为毫秒或微秒 | 回放对齐、事件排序 |
| 最新成交价 | float64 | 当前Tick的成交价格 | 计算滑点、坏账损失 |
| 成交量 | int64 | 当前Tick的成交数量(股/手) | 流动性判断、大单识别 |
| 买一价 | float64 | 最优买入报价 | 盘口深度、挂单成本 |
| 买一量 | int64 | 最优买入报价对应的挂单量 | 流动性深度、冲击成本 |
| 卖一价 | float64 | 最优卖出报价 | 盘口深度、挂单成本 |
| 卖一量 | int64 | 最优卖出报价对应的挂单量 | 流动性深度、冲击成本 |
| 成交方向 | char / int | 主动买/主动卖/未知 | 识别资金流向、坏账方向 |
| 成交编号 | string / int64 | 交易所唯一成交流水号 | 去重、关联订单 |
2.2.2 数据结构示例(JSON格式)
{
"symbol": "600519.SH",
"timestamp": 1712563200123, // 毫秒级时间戳
"price": 172.50,
"volume": 200,
"bid_price": 172.48,
"bid_volume": 1500,
"ask_price": 172.52,
"ask_volume": 800,
"trade_direction": "BUY",
"trade_id": "T2024040812345678"
}
实践建议:在哨兵模型回放中,建议同时保留成交Tick和盘口Tick。成交Tick用于计算实际坏账损失,盘口Tick用于还原挂单排队与撤单行为。
2.3 Tick数据源与采集规范
不同数据源提供的Tick数据在精度、覆盖范围、延迟和成本上差异显著。选择数据源时需综合考虑回放场景的精度要求与预算约束。
2.3.1 主流Tick数据源对比
| 数据源 | 时间精度 | 覆盖市场 | 典型延迟 | 成本 | 适用场景 |
|---|---|---|---|---|---|
| 交易所直连 | 微秒级 | 单一交易所 | <1ms | 极高 | 高频做市、实时风控 |
| 专业数据商 | 毫秒级 | 多市场 | 10-100ms | 中高 | 量化回测、哨兵模型 |
| 券商API | 秒级 | 单一券商 | 1-5s | 低 | 个人回测、教学 |
| 开源数据 | 秒级或聚合 | 有限 | 非实时 | 免费 | 原型验证、学习 |
2.3.2 采集规范要点
- 时间同步:所有Tick记录必须使用交易所撮合时间戳,禁止使用本地接收时间。本地时间与交易所时间偏差超过1ms时,回放顺序可能错乱。
- 去重机制:同一成交编号只保留第一条记录。网络重传或数据商冗余推送会导致重复Tick,必须在入库前完成去重。
- 缺失处理:盘口Tick在无成交时仍可能更新(如撤单、改价)。采集程序应持续监听盘口变化,不能仅依赖成交事件触发。
- 存储格式:推荐使用列式存储(Parquet/Arrow)或时序数据库(InfluxDB/ClickHouse),避免CSV逐行读写带来的性能瓶颈。
- 校验规则:每条Tick必须满足:
bid_price <= ask_price,volume >= 0,price > 0。异常数据应标记并隔离,不直接丢弃。
常见陷阱:部分数据商将“无成交时的盘口快照”与“成交Tick”合并为同一时间戳。哨兵模型回放时需区分两类事件,否则会错误地将盘口变化归因为成交行为。
2.4 Tick数据采集架构
下图展示了一套典型的Tick数据采集与存储架构,适用于哨兵模型回放场景。架构分为数据源层、采集层、存储层和回放层四个部分。
2.5 Tick数据质量检查清单
在将Tick数据接入哨兵模型前,建议按以下清单逐项检查数据质量。任何一项不满足都可能导致回放结果失真。
| 检查项 | 合格标准 | 不合格处理 |
|---|---|---|
| 时间戳单调递增 | 无逆序、无跳跃 | 按时间戳重排序,标记异常段 |
| 盘口价差非负 | bid_price ≤ ask_price | 剔除或修正该Tick |
| 成交量非负 | volume ≥ 0 | 剔除负值,记录缺失 |
| 成交编号唯一 | 无重复trade_id | 保留首条,删除重复 |
| 连续交易时段完整 | 无超过5秒的盘口空白 | 插值或标记为“数据中断” |
| 价格波动范围合理 | 涨跌幅不超过交易所限制 | 标记异常,人工复核 |
哨兵模型特别要求:坏账率计算对盘口深度敏感。如果Tick数据中买一量/卖一量长期为0或异常偏小,应优先排查数据源是否提供了完整的盘口快照,而非仅提供成交Tick。