股票Level2高频因子数据篇(三):重构高频订单簿

财富   2024-07-02 19:23   美国  

什么是订单簿?

上图所示就是一个订单簿,买一卖一的量与价也经常被称为盘口。它具备3个关键信息,价格,委托数量和深度(5档)。各大股票软件APP上基本都免费提供L1行情,也就是上述这种形式的数据。L1的3s刷新一次。各大软件也都提供付费的L2行情,L2行情相比于L1的区别在于,L2是0.01s刷新一次(也就是用了逐笔委托和逐笔成交的数据),L2的深度有10档,即买一到买十。

不管是L1,还是L2,每个价格的对应的委托数量是该价格下的所有委托单的数量之和,并不清楚是由多少笔委托单组成。有些股票APP还提供十档委托队列,可以在盘中实时展示买一最佳买入价和卖一最佳卖出价档的前50笔委托单明细

什么是重构订单簿?

沪深交易所是不提供L2十档行情订单簿数据的,所谓重构,就是用逐笔成交和逐笔委托构建出上述提到的L2十档行情订单簿,当然可以自主决定深度,20档,30档都可以。

为什么要重构订单簿?

沪深交易所提供的现成的3s快照数据就是订单簿的形式,如果想要获得更高频的订单簿数据,比如1s,甚至0.01s的订单簿,就必须利用逐笔数据二次加工,目前市面上也有三方供应商提供加工好的付费数据。

本文就教你如何一步一步构建订单簿数据

我们的目标如下:

这其中细节繁琐的地方在于:

1)不同板块和交易所的规则不一样,要分类处理。有差异的是创业板,科创板,以及主板上市首日和平时不同。在这里我们先不考虑不同板块交易规则的不同,以沪深A股主板非上市首日为例。

2)交易时间使用事件时间还是机器时间。事件时间指的是真实逐笔订单发生的时间(交易所的数据的原始时间戳),机器时间指的是本机的网络时间。在历史回测中,两个时间戳一样的逐笔委托单可以认为一定是同时到达的,但是在实盘中,对于交易所时间戳一样的逐笔委托单到达投资者机器的时间可能是不一样的,那么就必须按照逐笔委托单到达本机的时间,即机器时间来实时计算和出信号。在本文,全部根据历史回测,所以按照事件时间来确认交易时间。

3)委托单和成交单到达时间错位的处理。逐笔委托和逐笔成交是分开两个通道到达投资者的机器,如果逐笔成交比对应的逐笔委托先到达,按到达顺序处理,先处理成交再处理委托则会得到错误的订单簿结果。所以需要按照唯一的BizIndex编号排序处理(上交所)。

这其中技术困难的地方在于:

1)如何实现批流一体

2)如何提高计算性能

这两个问题都是庞大的工程问题,对于个人投资者和机构投资者,对于不同需求的投资者都有不同的解决方案,对于要深耕高频信号的量化投资者来说,这是必须要解决的问题,能否批流一体,计算性能的快慢不仅会影响实盘,也影响研究工作的效率。细节决定成败。本文对此不展开。

最后我们希望能够生成的数据格式如下:和3s快照数据字段一样。包括N档的委托量和价格,该时间节点的高开低收(前闭后开)和累计成交额成交量。

如何确认每一笔订单的先后顺序

上交所

1. 逐笔成交有多个通道,同支股票代码的逐笔委托消息与逐笔成交消息在同一个通道中发布。通道数量是有限的,远远少于股票数量

2. TradeIndex(SubSeqNo)是连续的,从1 开始,如果不连续,则发生了丢包,每天重新从1开始计数

3. BizIndex(SeqNo)是逐笔委托和成交合并后的连续编号,从1开始,每天重新计数

竞价逐笔委托消息与竞价逐笔成交消息属于不同的消息,没有固定的到达先后次序关系。BizIndex 字段为竞价逐笔委托消息和竞价逐笔成交消息合并后的连续编号,故可以通过 BizIndex 字段判断竞价逐笔委托消息与竞价逐笔成交消息产生的先后顺序。

深交所

深交所order数据一定会先于与其关联的trade被发送(意味着一定会先接收到order,然后才会接收到与其关联的trade)。

流处理订单簿引擎示例

我们用上交所一只股票一天的逐笔数据做流处理合成高频订单簿案例演示。Python创建一个叫做createOrderbookSnapshotEngine的类,这个类的数据存储采用字典。这个类必须包括的功能如下:

处理的逻辑:当收到新增委托订单时,记录委托单的价格和量,当收到成交和撤单时,从记录中减去对应委托单的价格和量,通过记录委托单信息可以计算出每个报价的委托量、委托笔数;另外单独记录逐笔成交的价格和量,用来计算窗口内的高开低收和累计成交额成交量。从开盘9:30:00.000开始,按照固定时间窗口参数,比如1s,3s,前开后闭,比如9:30:01.000的保单会计算在9:30:01这一秒的截面中,而不会计算在9:30:02这一秒的截面中。(暂不考虑集合竞价和盘后定价)
代码样例:

订单逐笔数据以csv形式保存,一只股票一天的逐笔委托和逐笔成交在一个csv中7MB。逐条读取,循环传给class,模拟流式过程。


用Python Socket 模拟订单簿的数据流

【关注公众号,打赏19.9元, 后台留言即可获得完整Python代码和实验数据】

人工智能与量化交易算法知识库
黄含驰的人工智能、优化与量化交易算法知识库,干货满满,不容错过!
 最新文章