3、Tick数据字段解析:时间戳、最新价、成交量、成交额、买卖盘口(Bid/Ask)、逐笔成交
Tick数据是金融市场最细粒度的行情快照,每一笔Tick都完整记录了某一时刻的微观市场状态。理解Tick数据各字段的含义、精度与对齐规则,是进行高频策略回测、盘口分析与交易成本估算的基础。本节将逐一解析Tick数据的核心字段,并说明它们在多数据源间的口径差异。
3.1 字段总览与数据类型
标准Tick数据通常包含以下核心字段,各字段的数据类型与精度直接影响存储与计算效率:
| 字段名称 | 英文标识 | 数据类型 | 精度/单位 | 说明 |
|---|---|---|---|---|
| 时间戳 | Timestamp | INT64 / DateTime | 毫秒或微秒 | 行情发生或接收的精确时间 |
| 最新价 | LastPrice | FLOAT64 | 最小变动价位 | 当前最后一笔成交价格 |
| 成交量 | Volume | INT64 | 股/手/张 | 从开盘累计到当前的总成交量 |
| 成交额 | Turnover | FLOAT64 | 元/美元 | 从开盘累计到当前的总成交金额 |
| 买一价 | BidPrice1 | FLOAT64 | 最小变动价位 | 最高买入申报价格 |
| 买一量 | BidVolume1 | INT64 | 股/手/张 | 最高买入申报数量 |
| 卖一价 | AskPrice1 | FLOAT64 | 最小变动价位 | 最低卖出申报价格 |
| 卖一量 | AskVolume1 | INT64 | 股/手/张 | 最低卖出申报数量 |
| 逐笔成交标识 | TradeFlag | INT8 / String | 枚举值 | 标记主动买/卖/未知 |
精度对齐提示:不同交易所对时间戳精度要求不同。沪深交易所Level-2行情时间戳精度为毫秒,而部分期货交易所已支持微秒级时间戳。在跨市场对齐时,必须统一时间精度,否则会导致订单簿重建错位。
3.2 时间戳:Tick数据的锚点
时间戳是Tick数据最重要的字段,决定了数据对齐的先后顺序。实际应用中需关注以下三个时间点:
- 交易所时间(Exchange Time):撮合引擎生成行情的时间,是官方基准。
- 行情网关时间(Gateway Time):券商或数据商收到行情的时间,通常比交易所时间晚几毫秒。
- 本地记录时间(Local Time):用户程序写入数据库的时间,受网络延迟与系统时钟影响最大。
在标签口径对齐时,应优先使用交易所时间作为对齐基准。若数据源仅提供本地时间,需通过NTP同步或延迟校准算法进行修正。
对齐规则:同一笔Tick数据,不同数据源的时间戳差异不应超过100毫秒(股票市场)或10毫秒(期货市场)。超过该阈值的数据应标记为“时间戳异常”并进入清洗流程。
3.3 最新价与成交量/成交额
最新价(LastPrice)与成交量(Volume)、成交额(Turnover)共同描述了当前成交的规模与价格水平。需注意以下口径差异:
- 累计 vs 单笔:多数Tick数据中的Volume为当日累计值,需通过差分计算单笔成交量;少数数据源直接提供单笔成交量。
- 复权影响:最新价通常为实际成交价,不包含复权调整。回测时需额外引入复权因子。
- 成交额计算:成交额 = 最新价 × 单笔成交量,但部分数据源使用撮合时的实际成交金额(可能因费用或四舍五入存在微小差异)。
# 示例:从累计成交量计算单笔成交量
def compute_tick_volume(df):
df['SingleVolume'] = df['Volume'].diff()
# 开盘第一笔或数据中断时,diff可能为负值,需置为NaN
df.loc[df['SingleVolume'] < 0, 'SingleVolume'] = None
return df
3.4 买卖盘口(Bid/Ask):订单簿第一档
买卖盘口数据反映了当前市场最优的买卖意愿。标准Tick数据通常包含买一至买五、卖一至卖五共十档数据,但在标签对齐场景中,最常用的是买一(BidPrice1/BidVolume1)和卖一(AskPrice1/AskVolume1)。
盘口字段的关键对齐点包括:
- 价格档位对齐:不同交易所的最小变动价位不同(如A股0.01元,期货可能为0.2点),对齐时需按目标市场的最小变动价位进行取整。
- 盘口快照 vs 逐笔:盘口数据是某一时刻的静态快照,而逐笔成交是动态事件。在时间戳上,盘口快照通常略早于同一时刻的逐笔成交。
- 买卖价差(Spread):AskPrice1 - BidPrice1,是衡量市场流动性的核心指标。当价差为0时,表示发生了“价格重叠”,常见于撮合瞬间。
常见陷阱:部分数据源在盘口无变化时不推送新Tick,导致时间戳不连续。此时若直接使用差分计算成交量,会遗漏中间累积量,必须进行时间戳插值或重采样处理。
3.5 逐笔成交:交易方向与标识
逐笔成交(Trade)记录了每一笔实际发生的交易,包含成交价格、数量、时间以及主动买卖方向。主动买卖方向通过TradeFlag字段标识:
| 标识值 | 含义 | 判定规则 |
|---|---|---|
| B | 主动买(Buy) | 成交价 ≥ 卖一价 |
| S | 主动卖(Sell) | 成交价 ≤ 买一价 |
| N | 未知/双边 | 成交价在买卖价之间或数据源未提供 |
在标签对齐时,逐笔成交的TradeFlag必须与盘口数据联合校验。若某笔成交标记为主动买,但其价格低于当时的买一价,则该笔数据存在逻辑冲突,应标记为“方向异常”。
3.6 字段关系与对齐流程
下图展示了Tick数据各字段之间的逻辑关系与对齐处理流程:
3.7 字段对齐检查清单
在实际工程中,建议按以下清单逐项检查Tick数据字段的对齐质量:
- 时间戳连续性:检查是否存在超过1秒(股票)或500毫秒(期货)的时间间隔,标记为“数据断层”。
- 价格档位合规:最新价、买一价、卖一价是否均为最小变动价位的整数倍,否则标记为“价格精度异常”。
- 成交量单调性:累计成交量序列是否严格非递减,出现递减时标记为“成交量回退”。
- 买卖价差非负:AskPrice1 - BidPrice1 >= 0,若为负值则标记为“盘口倒挂”。
- 逐笔方向自洽:TradeFlag为B时,成交价应不低于卖一价;为S时,成交价应不高于买一价。
最佳实践:建议在数据入库前编写自动化校验脚本,对上述5项规则进行逐笔扫描。通过校验的数据打上“clean”标签,未通过的进入人工复核队列。这能大幅降低后续策略回测中的“脏数据”风险。