翼度科技»论坛 编程开发 python 查看内容

基于LSTM的股票价格预测模型【附源码】

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
导语

本文介绍了LSTM的相关内容和在股票价格预测上的应用。
LSTM的股票价格预测
LSTM(Long Short Term Memory)是一种 特殊的RNN类型,同其他的RNNs相比可以更加方便地学习长期依赖关系,因此有很多人试图将其应用于 时间序列的预测问题 上。
汇丰银行全球资产管理开发副总裁Jakob Aungiers在他的个人网站上比较详细地介绍了LSTM在Time Series Prediction上的运用(https://www.jakob-aungiers.com/articles/a/LSTM-Neural-Network-for-Time-Series-Prediction) ,本文以这篇文章的代码为基础,以Bigquant为平台,介绍一下”LSTM-for-Time-Series-Prediction“的流程。
Keras是实现LSTM最方便的python库(Bigquant量化平台已经装好了,不用自己安装了)
  1. from keras.layers.core import Dense, Activation, Dropout
  2. from keras.layers.recurrent import LSTM
  3. from keras.models import Sequential
  4. from keras import optimizers
复制代码
 加载转换数据

例如希望根据前seq_len天的收盘价预测第二天的收盘价,那么可以将data转换为(len(data)-seq_len)(seq_len+1)的数组,由于LSTM神经网络接受的input为3维数组,
因此最后可将input+output转化为(len(data)-seq_len)(seq_len+1)*1的数组
  1. def load_data(instrument,start_date,end_date,field,seq_len,prediction_len,train_proportion,normalise=True):
  2.     data=D.history_data(instrument,start_date,end_date,fields)
  3.     ……
  4.     seq_len=seq_len+1  
  5.     result=[]
  6.     for index in range(len(data)-seq_len):
  7.         result.append(data[index:index+seq_len])
  8.         ……
  9.         # 规范化之后
  10.         x_train = train[:, :-1]
  11.         y_train = train[:, -1]
  12.         x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
  13.         # 测试数据同样处理
复制代码
构建LSTM神经网络
  1. model = Sequential()  
  2. model.add(LSTM(input_dim=layers[0],output_dim=layers[1],return_sequences=True))
  3. model.add(Dropout(0.2))
  4. model.add(LSTM(layers[1],return_sequences=False))
  5. model.add(Dropout(0.2))
  6. model.add(Dense(input_dim=layers[1],output_dim=layers[2]))
  7. model.add(Activation("linear"))
  8. rms=optimizers.RMSprop(lr=conf.lr, rho=0.9, epsilon=1e-06)
  9. model.compile(loss="mse", optimizer=rms)
复制代码
此神经网络共三层,第一层为LSTM层,输入数据维度是1,输出数据维度为seq_len;第二层也为LSTM层,输入和输出维度均为seq_len层;第三层为Dense层,输入数据维度是seq_len,输出数据维度为1,最终将input与output对应起来。
compile:编译用来配置模型的学习过程,可选参数有loss,optimizer等。模型在使用前必须编译,否则在调用fit或evaluate时会抛出异常。
loss为损失函数,可用mse,mae,binary_crossentropy
optimizers为优化器,即优化参数的算法,可供选择为SGD(随机梯度下降法),RMSprop(处理递归神经网络时的一个良好选择),Adagrad等(具体参见http://keras-cn.readthedocs.io/en/latest/ ,网页提供Keras相关函数的详细介绍)。
  1. model.fit(X_train,y_train,batch_size=conf.batch,nb_epoch=conf.epochs,validation_split=conf.validation_split
复制代码
fit为训练函数,batch_size:整数,训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步;nb_epoch:迭代次数;validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集
  1. predicted = model.predict(data)
  2. predicted = np.reshape(predicted, (predicted.size,))
复制代码
模型在test_data集上的预测,根据前seq_len长度预测下一时间的close。
另外,在此基础上,若希望预测prediction_len长度的close,则可在第一个predict_close的基础上,以此predict_close和前seq_len-1个true_close为input,预测下一个close,以此类推,可预测一定长度甚至全部长度的时间序列(predict_sequences_multiple,predict_sequence_full)
回测

(以predict_sequences_multiple为例)
思路是这样:看prediction_len长度内的涨跌,若prediction_len最后一天收盘价大于第一天的收盘价,则下买单;反之,不做单或者平仓
效果不是特别好,可能和我没有优化参数有很大关系,希望能抛砖引玉,完整策略代码如下,欢迎指正和讨论: 
  1. 补充:如果运行出错,请检查M.trade模块是否是最新版本。
复制代码
 
附件:基于LSTM的股票价格预测模型实例(文末策略源码)
 
参考资料:


  • LSTM策略主体参考http://www.jakob-aungiers.com/articles/a/LSTM-Neural-Network-for-Time-Series-Prediction,

    • 在一些地方做了一些更改,使之能在bigquant平台上使用以及能够自己调整更多参数

  • 对keras有兴趣者可参考http://keras-cn.readthedocs.io/en/latest/,这里有对keras每个函数的详细介绍
原码链接含源码:《基于LSTM的股票价格预测模型
From:BigQuant量化知识库
 
 
 

来源:https://www.cnblogs.com/bigquant/p/17867867.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具