继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

手记|巧用 Tick 数据,还原任意时间点完整订单簿

kelos
关注TA
已关注
手记 40
粉丝 0
获赞 1

大家好,本篇是我的量化交易学习与实践手记。在做量化策略、行情复盘的过程中,我经常有一个需求:回看历史某一时刻的盘口订单簿状态。但市面上多数行情接口只提供快照和成交数据,想要精准复刻当时的买卖盘,就必须吃透Tick 数据。接下来结合实操经验,一步步和大家分享完整的实现思路、流程与代码。


一、先搞懂:Tick 数据到底是什么?

Tick 是金融行情里最小粒度的数据单元,市场里每一次挂单、撤单、改价、成交,都会生成一条 Tick 记录。想要还原订单簿,核心逻辑很简单:按照时间顺序,逐条回放所有 Tick 事件

只看最终成交价,我们完全不清楚各个价位的挂单分布;但把整条时间线上的 Tick 数据串联起来,就能完整复现盘口的每一次变动。常见的 Tick 事件分为四类,我整理如下:

事件类型简单说明
成交对应价格档位的挂单数量因交易撮合成交发生变动
新增挂单新委托单挂入买卖盘对应价位
撤单已存在的委托单被撤销,档位数量减少
改价原有挂单调整价格,引发盘口档位变更


二、数据存储与基础处理规则

在代码实现中,我一般会用字典、数组来存储盘口数据,用来映射价格挂单数量。以最常用的五档盘口为例,会分开维护买盘和卖盘:买盘价格从高到低排列,卖盘价格从低到高排列。

这里有一个非常关键的细节:所有 Tick 必须严格按时间戳顺序处理。哪怕只差几毫秒,最终还原出的盘口都会出现偏差。如果是处理本地历史 Tick 文件,不建议一次性全部加载,逐条解析更新,不仅逻辑好理解,后续排查 bug 也更方便。


三、手把手梳理订单簿还原全流程

我以还原10:15:30这一刻的订单簿为例,把整套流程拆解为 3 个步骤,不管是实时行情还是历史数据回放,都可以套用这套逻辑:

  1. 初始化订单簿:创建空的盘口结构,将买卖所有档位的挂单数量初始化为 0。

  2. 逐笔更新盘口:按时间顺序读取每一条 Tick,区分事件类型执行操作:新增挂单就累加数量,撤单就扣减数量;成交会消耗挂单,大额成交甚至会一次性吃掉多个档位的订单。

  3. 截取目标时间:持续更新盘口状态,当读取到的 Tick 时间超过目标时间,立刻停止执行。此时程序里保存的盘口数据,就是我们想要的完整订单簿。

不同数据源的输出格式略有区别,有的直接返回盘口深度变化,有的仅返回成交记录,处理逻辑会稍有不同,但最终目标都是还原指定时间的买卖盘。


四、实战代码演示

我日常使用 AllTick API 的 WebSocket 接口获取实时 Tick 数据,下面是可直接运行的完整代码,能够实时监听行情,并在指定时间点输出完整订单簿,大家可以动手测试:

import websocket
import json

# 初始化订单簿,分别存储买盘、卖盘:key为价格,value为挂单量
order_book = {'buy': {}, 'sell': {}}

def on_message(ws, message):
    # 解析推送的tick数据
    tick = json.loads(message)
    # 遍历五档买卖盘,更新本地订单簿
    for i in range(5):
        buy_price = tick['bidPrice'][i]
        buy_qty = tick['bidQty'][i]
        order_book['buy'][buy_price] = buy_qty

        sell_price = tick['askPrice'][i]
        sell_qty = tick['askQty'][i]
        order_book['sell'][sell_price] = sell_qty
    # 到达目标时间,输出订单簿并断开连接
    if tick['time'] >= '10:15:30':
        print(order_book)
        ws.close()

# 建立WebSocket长连接
ws = websocket.WebSocketApp("wss://example.alltick.co/realtime",
                            on_message=on_message)
ws.run_forever()

小提醒:编写代码时一定要注意买卖盘的排序规则,同时根据事件类型正确增减挂单数量,这两处出错会导致盘口数据和实际行情不符。


五、实用优化技巧(应对海量数据场景)

如果大家需要批量处理大量历史 Tick 文件,内存占用和运行效率会成为问题,结合我的实操经验,分享几个实用优化方法:

  1. 精简存储档位:根据自身需求只保留前 N 档盘口,不用存储全量价格数据,减少内存消耗。

  2. 采用增量更新:每条 Tick 只修改对应变动的档位,不整体重建订单簿,提升运行速度。

  3. 增加时间索引:给历史 Tick 文件建立时间索引,快速定位目标时间段,避免无效遍历。

另外还有一个常见问题:部分数据源会缺失撤单类 Tick 数据。遇到这种情况,我一般会沿用前一时刻的盘口状态做合理推算,虽然无法做到百分百精准,但完全能满足策略回测、行情分析的使用需求。


六、学习小结

复盘整个实践过程不难发现,还原订单簿其实就是对 Tick 数据做一次完整回放。对比 K 线图、简单成交记录,还原后的盘口能让我们清晰看到买卖双方的力量变化,捕捉市场里细微的行情信号。

对于学习量化交易、开发交易策略的同学来说,掌握 Tick 数据解析和订单簿还原,是必备的基础能力。盘口里一次小小的挂单、撤单变动,都可能影响后续行情走势,用好这份微观数据,能让我们的策略分析和复盘更加细致、精准。


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP