LSTM择时+StockRanker选股的可视化策略实现

策略分享
量化研究每周精选
标签: #<Tag:0x00007f20c2fa20f0> #<Tag:0x00007f20c2fa1f38>

(iQuant) #1

一、LSTM算法简介

LSTM Networks是递归神经网络(RNNs)的一种,该算法由Sepp Hochreiter和Jurgen Schmidhuber在Neural Computation上首次公布。后经过人们的不断改进,LSTM的内部结构逐渐变得完善起来(图1、图2)。在处理和预测时间序列相关的数据时会比一般的RNNs表现的更好。目前,LSTM Networks已经被广泛应用在机器人控制、文本识别及预测、语音识别、蛋白质同源检测等领域。

image

$$图1 LSTM层结构$$

image

$$图2 典型LSTM层结构$$ 这里$ht$ 代表神经元的输出,而$Ct$ 代表神经元的状态。系统的运行分为以下步骤:

A.计算需要被细胞丢弃的信息:

image

B.计算需要添加到细胞中的信息:

image

C.更新细胞状态:

image

D.计算输出信息:

image

LSTM模型构建:作为循环层的一种神经网络结构,只使用LSTM并不能构建出一个完整的模型,LSTM还需要与其他神经网络层(如Dense层、卷积层等)配合使用。此外,还可以构建多层LSTM层来增加模型的复杂性,学习描述更高层次的时域特征(如图3)。

image

$$图3 LSTM的组合运用$$

二、LSTM在股票预测中的应用

经济学家靠ARMA 模型预测的时间序列模型。该模型对小数据集效果很好,可容纳时间序列的记忆效应,如持久性、均值回归、季节性等。在深入学习中,长短期记忆(Long short-term memory,LSTM)可类比于ARIMA长期短期记忆模型。LSTM 对RNN 进行了结构上的修改,来避免长期依赖问题。LSTM在股票预测中通常分为两类应用:一是直接将LSTM输出结果作为做单信号在个股上进行回测,二是将LSTM的预测结果作为一种择时信号,再配合其他选股模型(如BigQuant平台的StockRanker)进行回测。社区中已经在LSTM Networks应用于股票市场探究一文中提到LSTM更适用于处理个股/指数,将LSTM作为择时模型与其他选股模型配合使用效果较好。

三、策略流程

本文策略在bigquant平台AI可视化模板的基础上建立,使用stockranker作为选股器,针对沪深300指数采用LSTM构建择时模型作为仓位风控控制,流程图见图4。

关于LSTM模型中涉及的参数含义可以参考《[量化学堂-机器学习]基于LSTM的股票价格预测模型》一文中的描述。

  • 开始时间:2017-07-01
  • 结束时间:2018-04-30
  • 选股策略:stockranker
  • 优质股数量:10只
  • 换仓周期:每日
  • 止盈止损:使用沪深300指数LSTM的涨跌预测值进行仓位控制

LSTM的模型参数:

  • 每段input预测数据的长度seq_len: 5日数据
  • 输入特征:[‘close’,‘open’,‘high’,‘low’,‘amount’,‘volume’]
  • 预测集长度:10*seq_len
  • 神经网络结构: 1层LSTM层+3层Dense层
  • 模型训练:优化器adam,损失函数mse
  • 模型输出: 涨跌预测值(正数为持仓信号,负数为空仓信号)

image

image

$$图4 策略流程图$$

四、回测结果

回测时间是2017年7月以来,总收益接近30%,超过沪深300基准指数近27.5%。从图5可以看出,在2017年12月以及2018年2月中旬在大盘指数下跌期间,策略的净值回撤明显小于沪深300基准指数,这说明LSTM算法的仓位管理起到了作用。策略源代码在附录,欢迎大家克隆研究。

image

$$图5 模型预测结果$$

五、参考文献

1.《LSTM Networks应用于股票市场探究
2.《LSTM Networks应用于股票市场之Functional Model
3.《LSTM Networks应用于股票市场之Sequential Model
4.《[量化学堂-机器学习]基于LSTM的股票价格预测模型
5.《2018/03/08 中信建投证券:零基础python 代码策略模型实战:——大数据人工智能研究之七

六、附录

策略完整代码:可视化策略—LSTM大盘择时+Stockranker选股

代码示例: LSTM模型典型构建流程

# 构建模型
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 训练模型
model.fit(X, Y, epochs=150, batch_size=10)

# 评估模型
scores = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

(Jiansen) #4

Cool!


(gongdonghui) #5

如果将策略用作实盘交易, 每天难道不需要调用模型来预测吗?


(达达) #6

此例中选股的Stockranker是训练好的不变了,只是LSTM预测大盘的时候用的数据LSTM模型在随时间的变化更新


(gongdonghui) #7

好的 谢谢 策略代码里我看 lstm的训练只出现里 回测准备中 每次调用的时候也是按按日期从数组里取出预测值,所以比较怀疑每天调用lstm模型进行预测了吗?


(iQuant) #8

回测的时候只有第一天运行回测准备函数,
模拟实盘的机制是每天运行一次数据准备函数,保证了每日更新


(gongdonghui) #9

好的谢谢啊