基于LSTM模型的智能选股策略
由clearyf创建,最终由qxiao 被浏览 1311 用户
旧版声明
本文为旧版实现,供学习参考。
https://bigquant.com/wiki/doc/demos-ecdRvuM1TU
\
导语
这是本系列专题研究的第五篇:基于长短期记忆网络LSTM的深度学习因子选股模型。LSTM作为改进的RNN(循环神经网络),是一种非常成熟的能够处理变化的序列数据的神经网络。此算法在keras, tensorflow上都有可以直接调用的api,在BigQuant平台中也有封装好的可视化模块。本文首先大致介绍了RNN和LSTM的原理,然后以一个可视化实例展示LSTM模型在因子选股方面的应用。
LSTM原理介绍
什么是RNN
RNN,顾名思义,是包含循环的神经网络。它与传统神经网络模型最大不同之处是加入了对时序数据的处理。以股票多因子为例,传统神经网络在某一时间截面的输入因子数据,输出下期超额收益预测;而RNN是将某支股票的长期因子数据作为时间序列,取过去一段时间内的数据作为输入值。资本市场的信息有着一定持久性,使用RNN可以充分把握“历史重演”的机会。
如图表1 左侧所示,RNN读取某个输入x,并输出一个值o,循环可以使得信息从当前步传递到下一步。从表面看,这样的网络结构较难理解,因此将其展开为图表1 右侧。对于从序列索引1 到T 的时间序列数据,如果关注t 时刻附近的网络结构,𝑥_𝑡代表了在序列索引号t 时刻训练样本的输入,同理𝑥_{𝑡−1}和𝑥_{𝑡+1}代表了在序列索引号t-1 时刻和t+1 时刻训练样本的输入;ℎ_𝑡代表在t 时刻模型的隐藏状态,不仅由𝑥_𝑡决定,也受到h_{𝑡−1}的影响;𝑜_𝑡代表在t 时刻模型的输出,𝑜_𝑡只由模型当前的隐藏状态ℎ_𝑡决定;𝑦_𝑡是t时刻样本序列的真实值;𝐿_𝑡是t 时刻模型的损失函数,通过𝑜_𝑡和y_𝑡计算得出;U、V、W 这三个矩阵是模型的参数,它们在整个模型中是共享的。 RNN 模型本质上也是采用BP(Back Propagation)算法进行权值和阈值的调整优化,只是增加了时间序列,叫做BPTT(Back Propagation Through Time)。公式如下: 其中C_t表示t时刻模型输出与真实值之间的交叉熵。对于上述公式中,如果sigma为sigmoid 函数或者 tanh 函数,根据delta的递推式,当时间跨度较大时,delta就会很小,从而使 BP 的梯度很小,产生“梯度消失”。
另外,对于参数W_{hh}:由于RNN 中W_{hh}在每个时刻都是指的相同参数,所以delta中会出现W_{hh}的累乘。而多次累乘后,数值的分布有明显的趋势:要么趋近于0,要么趋近于绝对值很大的值。而这两种情况,就很可能会分别造成“梯度消失”和“梯度爆炸”。
什么是LSTM
传统RNN 模型容易产生梯度消失的问题,难以处理长序列的数据。因此Hochreater 和Schmidhuber 在1997 年提出了长短期记忆网络LSTM,通过用精心设计的隐藏层神经元缓解了传统RNN的梯度消失问题。
LSTM V.S. RNN
在RNN 模型中,在每个序列索引位置都有一个隐藏状态ℎ_𝑡,如果我们略去每层都有的o_𝑡,𝑦_𝑡和 𝐿_𝑡,那么模型可以简化为如图表4 的形式,通过线条指示的路径可以清晰地看出隐藏状态ℎ_𝑡由ℎ_{𝑡−1}和𝑥_𝑡共同决定。ℎ_𝑡将一方面用于计算当前层模型的损失,另一方面用于计算下一层的ℎ_{𝑡+1}。
LSTM 模型中,每个序列索引位置t时刻被向前传播的,除了和RNN 一样的隐藏状态ℎ_𝑡,还多了另一个隐藏状态,如图表6中的标黑横线。这个隐藏状态被我们称为细胞状态𝐶_𝑡(Cell State),细胞也就是LSTM的一个单元。𝐶_𝑡在LSTM 中实质上起到了RNN 中隐层状态ℎ_𝑡的作用。
LSTM的单元结构
除了细胞状态,LSTM的单元还有其他许多结构,这些结构一般称之为门控结构(Gate)。LSTM 模型在每个序列索引位置t的门控结构一般包括输入门(Input Gate), 输出门(Output Gate), 忘记门(Forget Gate):这三个 Gate 本质上就是权值,形象地说,类似电路中用于控制电流的开关。当值为1,表示开关闭合,流量无损耗流过;当值为0,表示开关打开,完全阻塞流量;当值介于(0,1),则表示流量通过的程度。而这种[0,1]的取值,其实就是通过激活函数实现的。
由上述的结构分析可知,LSTM 只能避免RNN 的“梯度消失”。“梯度膨胀”虽然不是个严重的问题,但它会导致参数会被修改的非常远离当前值,使得大量已完成的优化工作成为无用功。当然,“梯度膨胀”可以采用梯度裁剪(gradient clipping)来优化(如果梯度的范数大于某个给定值,将梯度同比收缩)。
LSTM小结
总结而言,LSTM内部主要有三个阶段:
- 忘记阶段。这个阶段主要是对上一个节点传进来的输入进行 选择性 忘记。简单来说就是会 “忘记不重要的,记住重要的”。通过忘记门进行判断。
- 选择记忆阶段。这个阶段将对输入有选择性地进行“记忆”。哪些重要则着重记录下来,哪些不重要,则少记一些。通过输入门控制。
- 输出阶段。将上面两步得到的结果相加,即可得到传输给下一个状态的h_t。这个阶段将决定哪些将会被当成当前状态的输出。主要是通过输出门控制。
实例:LSTM模型选股
LSTM的底层逻辑确实比较复杂,但是在实际使用中,只要能够理解其大致原理和关键参数,通过调用平台上的深度学习相关的各种可视化模块,便能省时省力地构建深度学习网络,从而将精力更多地放在策略逻辑优化上。下面,我们将以一个可视化实例展现如何通过LSTM模型进行选股。
如图所示,LSTM选股策略构建包含下列步骤:
- 获取数据 :A股所有股票。
- 特征和标签提取 :计算7个因子作为样本特征;计算5日个股收益率,极值处理。
- 特征预处理 :进行缺失值处理;去掉特征异常的股票,比如某个特征值高于99.5%或低于0.5%的;标准化处理,去除特征量纲/数量级差异的影响。
- 序列窗口滚动 :窗口大小设置为5,滚动切割。这里的意思是使用过去5天的因子数据作为输入。窗口大小可调整,在“序列窗口滚动”模块中进行。
- 搭建LSTM模型 :构建两个隐含层的LSTM长短期记忆神经网络预测股票收益率(回归模型)。在可视化策略中表现为1个输入层;一个LSTM和一个全连接层作为隐藏层,每构建一层进行dropout断开一些神经元防止过拟合;最后一个全连接层作为输出层(输出维度调整为1)。
- 模型训练与预测 :使用LSTM模型进行训练和预测;可以尝试多种激活函数,策略默认为tanh。
- 策略回测 :利用2010到2016年数据进行训练,预测2016到2019年的股票表现。每日买入预测排名最靠前的30只股票,至少持有5日,同时淘汰排名靠后的股票。具体而言,预测排名越靠前,分配到的资金越多且最大资金占用比例不超过20%;初始5日平均分配资金,之后,尽量使用剩余资金(这里设置最多用等量的1.5倍)。
- 模型评价 :查看模型回测结果。
LSTM模型的参数如下:
- 输入数据:7个因子,使用了过去5天的因子数据,因此输入7*5的一个矩阵。 LSTM层:激活函数采用tanh,recurrent激活函数采用hard_sigmoid。循环核初始化方法Orthogonal,权值使用glorot_uniform初始化方法,偏置向量使用Zeros初始化方法。
- 全连接层:激活函数tanh。权重使用glorot_uniform初始化方法,偏置向量使用Zeros初始化方法。
- 输出层:最后一个全连接层。需要选择“输出空间维度”为1,因为要得到个股的收益率预测结果,这是一个值。 随机断开输入神经元比例dropout:0.2。在不同隐藏层之间使用dropout可以让网络更耐用并且避免过拟合。
- 训练次数率:epochs值为5,共训练5轮,以mae作为评估指标。
- 优化器:RMSProp。
- 损失函数:均方误差MSE。
预测个股下五日的收益率,排序后得到结果如下: 回测结果如下: 可以看到,LSTM的回测结果比较突出,相比于基准收益有着非常突出的表现。在本次的策略中,我们运用了两层的LSTM模型,具体的循环层数、模型参数有非常大的调整空间,欢迎大家尝试。
https://bigquant.com/experimentshare/4bb02b69b09943f7a6a83b2dad8cbef3
参考文献
- 华泰证券 《人工智能选股之循环神经网络》2018-12-13
- 国信证券 《递归神经网络RNN——长短期记忆细胞LSTM的分行业多因子预测》2018-12-28
- 知乎《人人都能看懂的LSTM》
\