3. 时间序列与事件驱动:Tick级数据特征、逐笔成交与逐笔委托的解析
做量化交易的朋友,尤其是做高频或者日内策略的,一定绕不开一个东西——Tick级数据。
说白了,Tick数据就是市场最原始的脉搏。每一笔成交、每一次挂单的变动,都记录在里面。我刚开始接触这个领域的时候,觉得K线图就够了,直到有一次我在回测一个短线策略,用1分钟K线跑出来的夏普比率高达3.5,结果实盘一跑,亏得我头皮发麻。后来一查,问题就出在K线把微观结构的信息给抹平了。
嗯,从那以后,我再也不敢轻视Tick数据了。
3.1 Tick级数据到底长什么样?
先看一个最基础的Tick数据样例。这是我从某交易所拉到的真实逐笔成交数据,脱敏处理过:
# 逐笔成交数据示例(CSV格式)
Timestamp,Price,Volume,BuySell,OrderID
09:30:00.123,10.25,100,B,123456
09:30:00.456,10.26,200,S,123457
09:30:00.789,10.25,50,B,123458
每一行代表一笔真实的成交。注意那个时间戳,精确到了毫秒甚至微秒。我见过有些交易所的Tick数据,时间精度能到纳秒级——当然,那通常是做市商才用得上的东西。
逐笔委托数据呢?它记录的是每一笔挂单的变动:
# 逐笔委托数据示例
Timestamp,Price,Volume,Type,OrderID
09:30:00.100,10.25,500,Add,123450
09:30:00.200,10.26,300,Add,123451
09:30:00.300,10.25,-100,Cancel,123450
这里Type字段有Add(新增挂单)、Cancel(撤单)、Execute(成交)等。我个人习惯把这两类数据结合起来看,才能还原出完整的订单簿演化过程。
核心要点:Tick数据是事件驱动的,每一笔事件都改变了市场的微观状态。K线是“切片”,Tick是“录像”。
3.2 逐笔成交 vs 逐笔委托:谁更重要?
这个问题我经常被问到。我的回答是:都重要,但用途不同。
逐笔成交数据,告诉你的是“已经发生的事”。比如大单买入、主动卖出、成交量的分布等等。你可以用它来识别主力资金的动向。
逐笔委托数据,告诉你的是“正在发生的事”。比如挂单的堆积、撤单的异常、价格的支撑阻力位等等。它比成交数据更提前一步。
举个例子。我在做一只小盘股的策略时,发现成交数据里突然出现一笔1000手的买单,价格是10.00元。但如果你只看成交,你会觉得“哇,有大资金进场了”。
但如果你同时看委托数据,你会发现:在10.00元这个价位上,原本有2000手的卖单,但在成交前1秒,这2000手卖单突然撤掉了800手。然后那笔1000手的买单才成交。
这说明什么?说明有人在配合演戏。撤单是为了让买单更容易成交,或者是为了制造一个虚假的“大单买入”信号。
避坑指南:我曾经因为只看成交数据,被这种“假大单”坑过好几次。后来我养成了一个习惯:任何大单成交,都必须去核对委托数据,看看挂单有没有异常变动。
3.3 Tick级特征工程:从原始数据到有效信号
原始Tick数据太嘈杂了,直接拿来用基本等于自杀。我们需要做一些特征提取。我个人常用的几个特征:
3.3.1 成交方向与主动买卖
每一笔成交都有买卖方向。如果一笔成交的价格高于当前卖一价,那它就是主动买入(Buyer Initiated)。反之则是主动卖出。
# 判断主动买卖的伪代码
if trade_price >= ask_price:
direction = 'Buy'
elif trade_price <= bid_price:
direction = 'Sell'
else:
direction = 'Mid' # 中间价成交,少见
这个特征非常关键。主动买入占比高,说明买方力量强。我习惯用主动买入成交量 / 总成交量这个比值,作为市场情绪的实时指标。
3.3.2 订单簿不平衡度
这个指标衡量的是买卖挂单的力量对比。公式很简单:
OrderImbalance = (BidVolume - AskVolume) / (BidVolume + AskVolume)
值越接近1,说明买方挂单越强;越接近-1,卖方挂单越强。我在实盘中发现,这个指标对短期价格反转有很好的预测效果。
小技巧:不要只看一档的挂单。我建议看前五档甚至前十档的加权不平衡度。因为有些大资金会把单子挂在较远的价位,用来“压阵”。
3.3.3 成交量的时间分布
把每一笔成交量按时间切片,比如每100毫秒统计一次。你会发现,成交量往往不是均匀分布的。有时候几秒钟内密集成交,然后突然安静下来。
这种“爆发-沉寂”的模式,我称之为成交量簇。它往往预示着大资金的进出节奏。
3.4 事件驱动:把Tick数据变成交易信号
有了特征,下一步就是怎么用。我个人喜欢用事件驱动的方式来做。
什么意思呢?就是我不去预测未来的价格,而是等待某个“事件”发生,然后做出反应。
举个例子,我设计过一个策略:
- 监控逐笔委托数据,当某一价位出现超过平均挂单量3倍的大单时,触发“大单挂出”事件。
- 然后观察接下来的3秒内,这个价位是否有主动成交。
- 如果有主动成交吃掉这个大单,说明买方力量强,我跟着买入。
- 如果这个大单被撤掉,说明可能是虚晃一枪,我选择观望。
这个策略听起来简单,但实盘效果还不错。核心就在于:事件本身不重要,事件引发的后续行为才重要。
3.5 知识体系总览
为了让你更直观地理解这一章的内容,我画了一张图:
这张图把整个流程串起来了。从最底层的逐笔成交和委托数据开始,提取特征,然后基于事件驱动的方式生成交易信号。每一步都有坑,但也都有机会。
3.6 实战中的几个坑
最后,分享几个我在实战中踩过的坑:
- 数据延迟:Tick数据量巨大,处理速度一定要快。我曾经用Python的pandas逐行处理,结果延迟到了秒级,策略完全失效。后来改用C++或者用Python的numba加速,才把延迟降下来。
- 数据对齐:成交数据和委托数据的时间戳可能不同步。有些交易所的成交时间戳是撮合时间,委托时间戳是挂单时间。直接按时间戳对齐会出问题。我一般会用顺序编号来对齐,而不是时间戳。
- 回测陷阱:用Tick数据回测时,一定要注意未来信息。比如你用当前时刻的委托数据去预测下一秒的成交,但如果你在回测中不小心用了下一秒的数据,结果就会虚高。我建议用严格的事件回测框架,确保每一笔交易只基于历史信息。
一句话总结:Tick级数据是微观结构的金矿,但挖矿需要耐心和工具。逐笔成交告诉你“发生了什么”,逐笔委托告诉你“正在发生什么”,两者结合,你才能看到市场的全貌。
公众号:蓝海资料掘金营,微信deep3321