3、Tick数据结构:时间戳、价格、成交量、买卖盘口、标识符等字段解析

做量化交易的朋友都知道,Tick数据是市场最原始的数据形态。说白了,它就是交易所每产生一笔交易或每发生一次报价变动时,记录下来的快照。我刚开始接触Tick数据时,觉得不就是几个字段嘛,后来才发现,每个字段背后都有门道。

今天我们就来拆解一下Tick数据的核心字段。你想想看,如果连数据结构都搞不清楚,后面的去重和排序根本无从谈起。

3.1 时间戳:Tick数据的灵魂

时间戳是Tick数据最重要的字段,没有之一。它记录了这笔数据产生的精确时刻。

常见的精度级别:

  • 秒级:老式行情接口常用,比如YYYY-MM-DD HH:MM:SS
  • 毫秒级:国内大部分期货、股票行情都到毫秒,比如14:30:05.123
  • 微秒级:高频交易场景,比如14:30:05.123456
  • 纳秒级:极少数顶级交易所提供,比如14:30:05.123456789

重要提醒:时间戳的精度直接影响去重效果。精度越低,重复数据越多。我建议至少使用毫秒级时间戳。

我在项目中遇到过一个问题:某家数据商提供的时间戳是字符串格式的"2024-01-15 09:30:05.123",另一家是Unix毫秒时间戳"1705296605123"。合并数据时,必须统一格式。我个人习惯统一转成Unix毫秒整数,排序和比较都方便。

小技巧:Python里用pd.to_datetime()转成datetime类型,再用.timestamp() * 1000转成毫秒整数。注意要处理时区问题。

3.2 价格字段:买价、卖价、成交价

价格字段通常包含以下几项:

字段名 含义 示例
LastPrice 最新成交价 15.68
BidPrice1 买一价(最高买入报价) 15.67
AskPrice1 卖一价(最低卖出报价) 15.69
HighPrice 当日最高价 15.85
LowPrice 当日最低价 15.55

嗯,这里要注意:不同交易所对价格字段的定义略有差异。比如有的交易所把"最新成交价"叫TradePrice,有的叫LastPx。做数据清洗时,一定要先看字段说明文档。

我曾经踩过一个坑:某数据源把买一价和卖一价搞反了,我直接用买一价做策略回测,结果回测收益高得离谱。后来才发现是字段映射错了。所以,拿到数据后先做几分钟的肉眼检查,看看买卖价差是否合理。

3.3 成交量与持仓量

成交量字段也很关键,它反映了市场的活跃程度。

  • Volume:当日累计成交量(从开盘到当前时刻的总和)
  • Turnover:当日累计成交金额
  • OpenInterest:持仓量(期货特有,表示未平仓合约数)

这里有个容易混淆的点:Tick数据里的成交量是累计值,不是单笔成交量。如果你想算某一秒内的成交量,需要用当前Tick的Volume减去上一个Tick的Volume。

避坑指南:我曾经在计算成交量变化时,直接用df['Volume'].diff()。结果发现有些Tick的Volume没变(比如只有报价变动没有成交),diff出来是0。这没问题。但有些数据源会在收盘后重置Volume为0,导致diff出现负数。处理时一定要做异常值过滤。

3.4 买卖盘口:深度数据的核心

买卖盘口,也叫Order Book,是Tick数据里信息量最大的部分。它展示了当前市场上所有未成交的买单和卖单。

常见的盘口字段:

  • BidPrice1~BidPrice5:买一到买五的价格
  • BidVolume1~BidVolume5:买一到买五的挂单量
  • AskPrice1~AskPrice5:卖一到卖五的价格
  • AskVolume1~AskVolume5:卖一到卖五的挂单量

有些交易所提供10档甚至50档的深度数据。但说实话,对于大部分策略来说,前5档已经够用了。盘口数据可以用来计算买卖压力、识别大单异动等。

我个人习惯把盘口数据整理成这样的结构:

# 示例:盘口数据字典
order_book = {
    'bids': [(15.67, 1200), (15.66, 800), (15.65, 3000)],
    'asks': [(15.69, 500), (15.70, 1500), (15.71, 2000)]
}
# 每个元素是 (价格, 数量) 的元组

3.5 标识符:区分不同品种的身份证

标识符字段用来唯一确定一条Tick数据属于哪个品种。常见的标识符有:

字段名 说明 示例
Symbol 品种代码 IF2401, 600519.SH
Exchange 交易所代码 CFFEX, SSE, DCE
SecurityID 证券内部编码 1000001
TradeDate 交易日 2024-01-15

为什么需要这么多标识符?因为不同交易所的品种代码可能重复。比如"IF"在中金所是股指期货,在其他交易所可能代表别的品种。所以,Symbol + Exchange + TradeDate 三个字段组合起来,才能唯一确定一条数据。

核心原则:去重时,标识符 + 时间戳 共同构成唯一键。如果两条数据的标识符和时间戳都相同,那基本可以判定为重复数据。

3.6 其他常见字段

除了上面这些,Tick数据还可能包含:

  • TradeFlag:交易标志,比如"买盘"、"卖盘"、"未知"
  • PreClosePrice:昨收盘价,用于计算涨跌幅
  • UpperLimitPrice:涨停价
  • LowerLimitPrice:跌停价
  • TotalLongPosition:总多头持仓(部分交易所提供)

这些字段虽然不是必须的,但在特定场景下很有用。比如用TradeFlag可以判断一笔成交是主动买还是主动卖,这对分析资金流向很有帮助。

3.7 知识体系总览

下面这张图帮你理清Tick数据结构的整体脉络:

Tick数据结构总览 Tick数据 时间戳 价格字段 成交量/持仓量 买卖盘口 标识符 秒/毫秒/微秒/纳秒 Unix时间戳或字符串格式 LastPrice, BidPrice, AskPrice High, Low, PreClose Volume(累计值) Turnover, OpenInterest Bid/Ask Price 1~5 Bid/Ask Volume 1~5 Symbol, Exchange, SecurityID 精度 多价格 累计值 多档位 唯一性

这张图把Tick数据的五大核心模块串起来了。从上到下依次是时间戳、价格、成交量、盘口、标识符。每个模块都有它的特点和坑点。搞懂了这些,后面的去重和排序算法才能有的放矢。

我的建议:在实际项目中,先把这些字段整理成一个数据字典,标注好每个字段的类型、精度、取值范围。这样后续写代码时,心里有底,不容易出错。


公众号:蓝海资料掘金营,微信deep3321