什么是订单簿?
上图所示就是一个订单簿,买一
不管是L1,还是L2,每个价格的对应的委托数量是该价格下的所有委托单的数量之和,并不清楚是由多少笔委托单组成
什么是重构订单簿?
沪深交易所是不提供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的类,这个类的数据存储采用字典。这个类必须包括的功能如下:
订单逐笔数据以csv形式保存,一只股票一天的逐笔委托和逐笔成交在一个csv中,7MB。逐条读取,循环传给class,模拟流式过程。
【关注公众号,打赏19.9元, 后台留言即可获得完整Python代码和实验数据】