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数据变成交易信号

有了特征,下一步就是怎么用。我个人喜欢用事件驱动的方式来做。

什么意思呢?就是我不去预测未来的价格,而是等待某个“事件”发生,然后做出反应。

举个例子,我设计过一个策略:

  1. 监控逐笔委托数据,当某一价位出现超过平均挂单量3倍的大单时,触发“大单挂出”事件。
  2. 然后观察接下来的3秒内,这个价位是否有主动成交。
  3. 如果有主动成交吃掉这个大单,说明买方力量强,我跟着买入。
  4. 如果这个大单被撤掉,说明可能是虚晃一枪,我选择观望。

这个策略听起来简单,但实盘效果还不错。核心就在于:事件本身不重要,事件引发的后续行为才重要。

3.5 知识体系总览

为了让你更直观地理解这一章的内容,我画了一张图:

Tick级数据解析知识体系 逐笔成交数据 逐笔委托数据 特征提取 主动买卖方向 订单簿不平衡度 成交量时间分布 大单识别 事件驱动:大单挂出 → 主动成交 → 跟随 交易信号 / 策略决策 数据源 → 特征 → 事件 → 信号

这张图把整个流程串起来了。从最底层的逐笔成交和委托数据开始,提取特征,然后基于事件驱动的方式生成交易信号。每一步都有坑,但也都有机会。

3.6 实战中的几个坑

最后,分享几个我在实战中踩过的坑:

  • 数据延迟:Tick数据量巨大,处理速度一定要快。我曾经用Python的pandas逐行处理,结果延迟到了秒级,策略完全失效。后来改用C++或者用Python的numba加速,才把延迟降下来。
  • 数据对齐:成交数据和委托数据的时间戳可能不同步。有些交易所的成交时间戳是撮合时间,委托时间戳是挂单时间。直接按时间戳对齐会出问题。我一般会用顺序编号来对齐,而不是时间戳。
  • 回测陷阱:用Tick数据回测时,一定要注意未来信息。比如你用当前时刻的委托数据去预测下一秒的成交,但如果你在回测中不小心用了下一秒的数据,结果就会虚高。我建议用严格的事件回测框架,确保每一笔交易只基于历史信息。

一句话总结:Tick级数据是微观结构的金矿,但挖矿需要耐心和工具。逐笔成交告诉你“发生了什么”,逐笔委托告诉你“正在发生什么”,两者结合,你才能看到市场的全貌。


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