量化paper读书笔记(一)——DeepLOB深度学习订单簿

    本栏目主要目的是寻找最新发布或经典的量化文献,一方面督促自己去研究消化,另一方面分享自己在研读过程中的心得和理解,无论是方法论层面还是代码层面。欢迎各位踊跃提出自己的看法和建议,共同进步!

    这次是阅读的订单簿经典论文《DeepLOB: Deep Convolutional Neural Networks for Limit Order Books》,本文主要运用CNN+LSTM对限价订单簿(LOB)的变化进行预测,我从中收获良多的一方面是作者对于数据处理过程中打标签的方式,另一方面是CNN模型的设计。本文的代码地址:https://github.com/zcakhaa/DeepLOB-Deep-Convolutional-Neural-Networks-for-Limit-Order-Books

图片

本文的创新点如下:

1. 提出了新颖的深度学习模型:提出结合了卷积滤波器+LSTM模块的深度学习模型,在捕捉LOB(限价订单簿)的空间结构和时序依赖关系上优于其他算法,该模型在各种工具的样本外预测准确性方面表现出了显著的稳定性。

2. 通用特征提取:上述DeepLOB模型能够泛化到未参与训练的数据集,展示出提取通用/普适特征的能力。

3. 灵敏度分析:本文进行了灵敏度分析(LIME方法),以了解模型预测背后的基本原理,并确定限价单簿中最相关的组成部分,针对所谓“黑匣子”模型作出解释。
4. 交易模拟:本文利用交易模拟来展示该模型的实用性,以相对较低的风险提供显著的正回报,强调该模型在交易环境中的价值(实际在作者另一篇文献中有更详细回测)。

    下文的顺序为数据获取–>数据处理–>数据输入(代码)–>模型。 首先是数据获取。数据集从LSE获取的1年时间,5只股票LOB数据,交易时间控制在8:30到16:00之间(仅考虑正常交易的行为)。LOB数据包含两个维度即价格和成交量,而每个维度包含双边(ask、bid)、10档,因此每组LOB数据包含的特征数量为2*10*2一共40个特征。最终在作者公开的代码和数据集中能发现原始dec_train训练数据是有149个特征+label维度,这是因为作者参考了自己上一篇论文《Modelling highfrequency limit order book dynamics with Support Vector Machines》构建了其他特征,但是在本文后面的模型部分实际使用的也只是上面提到的最原始40个特征。6个月为训练集,3个月为验证集,3个月为测试集,中间不重叠。

图片

    下面是数据处理部分,包括标准化和打label。标准化部分作者使用前5天的数据进行Z_score,比较重要的是下面标签的构建。众所周知label的构建对于模型非常重要,在金融领域应当是按照交易思路进行构建,也就是模型label的设计与实盘交易的逻辑链条应该是顺畅的。例如对于盘中多次调仓的策略,流动性的影响应该被着重考虑,则应该使用vwap来构建label;对于收盘区间调仓的策略,则应当使用原始收盘价进行构建;对于日内的高频策略非常重要的一点是标的的交易量,这不仅会影响到策略容量(滑点)而且如果标的交易量极小,在几个tick之间买1、卖1没有任何变动,这样如果使用常见的mid_price构建label让模型学习是没有意义的,模型会失去泛化能力。

图片

    在本文中作者使用了两种构建label的方式,本文间接否定了直接使用mid_price算pct_change的方式,因为金融数据较低的信噪比。而是去构建当前t时刻之前k个时间步的mid_price均值m-,与k个时间步之后的mid_price均值m+;用这种方法去计算收益率l,此处分成两种方式,第一种是根据m+与mid_price算pct_change,第二种是根据m+、m-计算pct_change。最后本文对上述两种收益率l做了离散化处理,即根据一个固定阈值a将收益率l区分为上涨、下跌、震荡的三分类。

图片

图片

    下图展示了一段时间的打标签结果,上下两张图分别对应两种计算pct_change方法,x轴为一段时间k,两张图的固定阈值相同;白色(无背景色)区域为震荡/静止(label为0),红色区域为下跌(label为-1),绿色区域为上涨(label为1)。

图片

    接下来是代码层面的数据构建部分。代码中可以看到有train_loader、val_loader、test_loader3个基于torch的数据集,每一个的构建流程基本上一样,所以这里仅以train_loader为例。初始的dec_train维度为(149,44382),其前40行即为x对应特征部分,后5行即为y对应标签。这里作者自定义了继承自torch的Dataset类,属于深度学习模型构建数据集的标准流程,init处理完x、y后定义两个回调函数,__len__获取数据集长度和__getitem__用来迭代训练。

图片

    在这个Dataset类中作者按照模型设定来进一步划分x、y。首先对y,由于上一步划分的x,y长度相同,即特征与label为同一时间的,但模型是预测未来N个时间步的label,因此对y滑动99位作为dataY。对x,上一步得到的x维度为(44382,40),模型训练时为滑动窗口训练(这样也比较符合实盘),每批次训练的大小为(100,40),前者为100个时间步长,后者为特征数量;原时间步为44382,为构建滑动训练应从(100-1)即99位开始添加,即最终dataX维度为(44382-99,100,40)——>(44283,100,40)。接下来就是将上面的到的dataX、dataY转换成pytorch的格式,最终y形状为(44283,1),x形状为(44283,1,100,40)。对于训练集在传入torch中时shuffle参数设置为true即每个epoch打乱训练数据顺序。

    下面是模型构建部分。这里以代码中的具体参数为准(论文和代码中有些数值有出入),同时我会在每一步都列出现在数据的维度。由于实际训练考虑batch,为了方便表征后文默认batch为1。

    首先明确模型input是(1,1,100,40),分别是batch_size,通道数,时序长度,特征长度。

    1. input接入convolution layer卷积层,这部分有三层。第一层,第一个卷积核kernel的size为1*2、stride也是1*2,这里设置的非常巧妙,因为100*40的input每一行都是一个price接一个volume,这样卷积的权重同时考虑了价格和交易量且从1~10档的数据权重是相同的,也就是w1同时用在price1~10档,w2同时用在volume1~10档,此时input维度(1,32,100,20),32为通道数量;第二个卷积核的size和stride均为4*1,这相当于从时序角度提取特征,此时input维度(1,32,94,20),因为卷了两次所以时序维度是100-4+1-4+1。下图为第一层代码:

图片

    可以从代码中看到每卷积一次后都要接入batch_normal进行批次标准化,这是因为在神经网络训练中靠后面层的输入会因为前面层的权重W、偏置bias的更新而持续改变,后层不停适应输入的分布变化会造成训练困难;batch_normal正是为了解决上述问题,其将激活函数的输入值进行标准化然后再次平移和缩放。总结一下第一层,这一层可以看做在时序、截面维度进行特征提取,且由于共享的权重w让整个逻辑链条是顺畅的,唯一的不足是这一层仅考虑level之间的关联,即第一档量价关系的考虑不涉及第2~10档。

    第二层弥补了第一层的不足,其参数设置与第一层并无二致,顺着第一层的逻辑,input维度变化如下(1,32,94,20)——>(1,32,94,10)——>(1,32,88,10);最后的10相当于整合了每个level价格、成交量的信息最终变成10档的特征。下图为第二层代码:

图片

    接下来是第三层进行收尾。上一步的(1,32,88,10)维度首先接入1*10的滤波核即整合10档的信息变成(1,32,88,10),接着是两个4*1的核再次进行时序上卷积,最后input维度变成(1,32,82,1)。下图为第三层代码:

图片

    2. 接下来是inception模块。同样是三个分支进行不同的操作,与卷积层不同的是inception是进行3个并行的操作后进行拼接,同时每一个分支都进行了padding,因此输入与输出的维度相同。第一个分支为1*1加3*1的kernel,由于此处通道数变成64,最终input为(1,64,88,10)。第二个分支为1*1加5*1的kernel,可以看到这两个分支最终都是对时序维度做进一步的特征提取。第三层先进入3*1的maxpooling层,即在时序维度进行重要性的提取,再使用1*1的kernel。最终每个inception分支得到的维度都是(1,64,82,1)

图片

    3. 最后接入lstm后再接入全连接层得到output。lstm的设置为(input_size=192, hidden_size=64, num_layers=1),此处input_size为192是因为上一步inception的3个分支每个都是64个通道数,在该维度进行拼接得到64*3=192

图片

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/111129
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 18小时前
下一篇 18小时前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注