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数据的五大核心模块串起来了。从上到下依次是时间戳、价格、成交量、盘口、标识符。每个模块都有它的特点和坑点。搞懂了这些,后面的去重和排序算法才能有的放矢。
我的建议:在实际项目中,先把这些字段整理成一个数据字典,标注好每个字段的类型、精度、取值范围。这样后续写代码时,心里有底,不容易出错。
公众号:蓝海资料掘金营,微信deep3321