基于LSTM模型的智能选股策略

LSTM作为改进的RNN(循环神经网络),是一种非常成熟的能够处理变化的序列数据的神经网络。此算法在keras, tensorflow上都有可以直接调用的api,在BigQuant平台中也有封装好的可视化模块。本文介绍了RNN和LSTM的原理,以一个可视化实例展示LSTM模型在因子选股方面的应用。

LSTM原理介绍

1.1 什么是RNN

RNN,顾名思义,是包含循环的神经网络。它与传统神经网络模型最大不同之处是加入了对时序数据的处理。以股票多因子为例,传统神经网络在某一时间截面的输入因子数据,输出下期超额收益预测;而RNN是将某支股票的长期因子数据作为时间序列,取过去一段时间内的数据作为输入值。资本市场的信息有着一定持久性,使用RNN可以充分把握“历史重演”的机会。

如图表1 左侧所示,RNN读取某个输入,并输出一个值o,循环可以使得信息从当前步传递到下一步。从表面看,这样的网络结构较难理解,因此将其展开为图表1 右侧。对于从序列索引1 到T 的时间序列数据,如果关注tt时刻附近的网络结构,x𝑡代表了在序列索引号t 时刻训练样本的输入,同理x𝑡−1和x𝑡+1代表了在序列索引号t−1 时刻和t+1 时刻训练样本的输入;h𝑡代表在t 时刻模型的隐藏状态,不仅由x𝑡决定,也受到h𝑡−1的影响;o𝑡代表在t 时刻模型的输出,o𝑡只由模型当前的隐藏状态h𝑡决定;y𝑡是t时刻样本序列的真实值;L𝑡是tt时刻模型的损失函数,通过o𝑡和y𝑡计算得出;U、V、W 这三个矩阵是模型的参数,它们在整个模型中是共享的。

RNN 模型本质上也是采用BP(Back Propagation)算法进行权值和阈值的调整优化,只是增加了时间序列,叫做BPTT(Back Propagation Through Time)。公式如下:

其中Ct表示t时刻模型输出与真实值之间的交叉熵。对于上述公式中,如果σ为sigmoid 函数或者 tanh 函数,根据δ的递推式,当时间跨度较大时,δ就会很小,从而使 BP 的梯度很小,产生“梯度消失”。

另外,对于参数Wℎℎ:由于RNN 中Wℎℎ在每个时刻都是指的相同参数,所以δ中会出现Wℎℎ的累乘。而多次累乘后,数值的分布有明显的趋势:要么趋近于0,要么趋近于绝对值很大的值。而这两种情况,就很可能会分别造成“梯度消失”“梯度爆炸”

1.2 什么是LSTM

传统RNN 模型容易产生梯度消失的问题,难以处理长序列的数据。因此Hochreater 和Schmidhuber 在1997 年提出了长短期记忆网络LSTM,通过用精心设计的隐藏层神经元缓解了传统RNN的梯度消失问题。

1.3 LSTM V.S. RNN

在RNN 模型中,在每个序列索引位置都有一个隐藏状态h𝑡,如果我们略去每层都有的o𝑡,y𝑡和 L𝑡,那么模型可以简化为如图表4 的形式,通过线条指示的路径可以清晰地看出隐藏状态h𝑡由h𝑡−1和x𝑡共同决定。h𝑡将一方面用于计算当前层模型的损失,另一方面用于计算下一层的h𝑡+1。

LSTM 模型中,每个序列索引位置tt时刻被向前传播的,除了和RNN 一样的隐藏状态h𝑡,还多了另一个隐藏状态,如图表6中的标黑横线。这个隐藏状态被我们称为细胞状态C𝑡(Cell State),细胞也就是LSTM的一个单元。C𝑡在LSTM 中实质上起到了RNN 中隐层状态h𝑡的作用。

1.4 LSTM的单元结构

除了细胞状态,LSTM的单元还有其他许多结构,这些结构一般称之为门控结构(Gate)。LSTM 模型在每个序列索引位置tt的门控结构一般包括输入门(Input Gate), 输出门(Output Gate), 忘记门(Forget Gate):这三个 Gate 本质上就是权值,形象地说,类似电路中用于控制电流的开关。当值为1,表示开关闭合,流量无损耗流过;当值为0,表示开关打开,完全阻塞流量;当值介于(0,1),则表示流量通过的程度。而这种[0,1]的取值,其实就是通过激活函数实现的。

由上述的结构分析可知,LSTM 只能避免RNN 的“梯度消失”。“梯度膨胀”虽然不是个严重的问题,但它会导致参数会被修改的非常远离当前值,使得大量已完成的优化工作成为无用功。当然,“梯度膨胀”可以采用梯度裁剪(gradient clipping)来优化(如果梯度的范数大于某个给定值,将梯度同比收缩)。

1.5 LSTM小结

总结而言,LSTM内部主要有三个阶段:

  1. 忘记阶段。这个阶段主要是对上一个节点传进来的输入进行 选择性 忘记。简单来说就是会 “忘记不重要的,记住重要的”。通过忘记门进行判断。
  2. 选择记忆阶段。这个阶段将对输入有选择性地进行“记忆”。哪些重要则着重记录下来,哪些不重要,则少记一些。通过输入门控制。
  3. 输出阶段。将上面两步得到的结果相加,即可得到传输给下一个状态的h𝑡。这个阶段将决定哪些将会被当成当前状态的输出。主要是通过输出门控制。

02

实例: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模型,具体的循环层数、模型参数有非常大的调整空间,可以克隆尝试。

03

策略模板

微信无法克隆模板,请前往社区克隆

宽邦科技
宽邦科技

提供金融行业人工智能平台和服务解决方案,研发了全国首个人工智能量化投资平台BigQuant,拥有全栈人工智能平台和大规模机器学习和深度学习框架与算法,为券商、银行、保险、资管等金融机构以及更多企业提供AI技术方案和业务解决方案,实现机构及企业的AI转型和升级。

理论RNNLSTM
3
暂无评论
暂无评论~