专栏首页量化投资与机器学习使用LSTM模型预测股价基于Keras

使用LSTM模型预测股价基于Keras

本期作者:Derrick Mwiti

本期翻译:HUDPinkPig

未经授权,严禁转载

者按:本文介绍了如何使用LSTM模型进行时间序列预测。股票市场的数据由于格式规整和非常容易获得,是作为研究的很好选择。但不要把本文的结论当作理财或交易建议。

本文将通过构建用Python编写的深度学习模型来预测未来股价走势。

虽然预测股票的实际价格非常难,但我们可以建立模型来预测股票价格是上涨还是下跌。本文使用的数据可以在https://github.com/mwitiderrick/stockprice下载。另外,本文将不考虑诸如政治氛围和市场环境等因素对股价的影响。。

介绍

LSTM在解决序列预测的问题时非常强大,因为它们能够存储之前的信息。而之前的股价对于预测股价未来走势时很重要。

本文将通过导入NumPy库来进行科学计算、导入Matplotlib库来绘制图形、以及导入Pandas库来加载和操作数据集。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

加载数据集

模型选择开盘价(Open)和最高价(High)两列。我们查看数据集的表头,可以大致了解数据集的类型。

dataset_train = pd.read_csv('NSE-TATAGLOBAL.csv')
training_set = dataset_train.iloc[:, 1:2].values

Open列是股票交易的开盘价,Close列是收盘价,High列是最高价,Low列是最低价。

特征归一化

从以前使用深度学习模型的经验来看,我们需要进行数据归一化以获得最佳的测试表现。本文的例子中,我们将使用Scikit- Learn的MinMaxScaler函数将数据集归一到0到1之间。

from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_set_scaled = sc.fit_transform(training_set)

按步长创建数据

LSTM要求数据有特殊格式,通常是3D数组格式。初始按照60的步长创建数据,并通过Numpy转化到数组中。然后,把 X_train的数据转化到3D维度的数组中,时间步长设置为60,每一步表示一个特征。

X_train = []
y_train = []
for i in range(60, 2035):
    X_train.append(training_set_scaled[i-60:i, 0])
    y_train.append(training_set_scaled[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)

X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

构建LSTM

我们需要导入Keras的一些模型来构建LSTM

1、顺序初始化神经网络

2、添加一个紧密连接的神经网络层

3、添加长短时记忆层(LSTM)

4、添加dropout层防止过拟合

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout

为了防止过拟合,我们添加了LSTM层和Dropout层,其中LSTM层的参数如下:

1、50 units 表示输出空间是50维度的单位

2、return_sequences=True 表示是返回输出序列中的最后一个输出,还是返回完整序列

3、input_shape 训练集的大小

在定义Dropout层时,我们指定参数为0.2,意味着将删除20%的层。然后,我们指定1个单元的输出作为全连接层(Dense layer)。接着,我们使用目前流行的adam优化器编译模型,并用均方误差(mean_squarred_error)来计算误差。最后,模型运行100epoch,设置batch大小为32。这个参数是根据电脑的配置来设定的,并且将耗费几分钟时间来完成实验。

regressor = Sequential()

regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))

regressor.add(Dense(units = 1))

regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')

regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)

在测试集上预测股价

先导入我们要做股价预测的测试集:

dataset_test = pd.read_csv('tatatest.csv')
real_stock_price = dataset_test.iloc[:, 1:2].values

为了预测未来的股票价格,我们需要在测试集加载后做如下几个工作:

1、在0轴上合并训练集和测试集

2、将时间步长设置为60(如前面所介绍的)

3、使用MinMaxScaler函数转换新数据集

4、按照前面所做的那样重新规整数据集

在做出预测之后,我们用inverse_transform函数处理,以返回正常可读格式的股票价格。

dataset_total = pd.concat((dataset_train['Open'], dataset_test['Open']), axis = 0)
inputs = dataset_total[len(dataset_total) - len(dataset_test) - 60:].values
inputs = inputs.reshape(-1,1)
inputs = sc.transform(inputs)
X_test = []
for i in range(60, 76):
    X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
predicted_stock_price = regressor.predict(X_test)
predicted_stock_price = sc.inverse_transform(predicted_stock_price)

展示结果

最后,我们用Matplotlib库可视化显示真实股价和预测股价的对比。

plt.plot(real_stock_price, color = 'black', label = 'TATA Stock Price')
plt.plot(predicted_stock_price, color = 'green', label = 'Predicted TATA Stock Price')
plt.title('TATA Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('TATA Stock Price')
plt.legend()
plt.show()

从图中我们可以看到,股票实际价格出现上涨时,模型也预测股价会上涨,较为吻合。这清晰地显示了LSTMs在分析时间序列和序列数据等方面的强大作用。

结论

预测股价的方法还有很多,比如移动平均线、线性回归、k近邻、ARIMA和Prophet。读者可以自行测试这些方法的准确率,并与Keras LSTM的测试结果进行比较。

本文分享自微信公众号 - 量化投资与机器学习(Lhtz_Jqxx)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 弯曲文字检测之SPCNet

    文字检测在深度学习的推动下,最近几年取得了长足的进步。由于多媒体检索,工业自动化,视力障碍人士辅助设备等应用的需求日益增长,场景文本检测是的计算机视觉的热门研究...

    SIGAI学习与实践平台
  • 机器学习第3天:多元线性回归

    简单线性回归:影响Y的因素唯一,只有一个。 多元线性回归:影响Y的因数不唯一,有多个。

    明天依旧可好
  • 分隔百度百科中的名人信息与非名人信息

    像错误提示说的那样需要的是字节类型而不是字符串类型,需要注意一下的是bytes-like翻译为字节。

    明天依旧可好
  • Random Forest

    随机森林还是没有脱离聚合模型这块,之前学过两个aggregation model,bagging和decision tree,一个是边learning边unif...

    西红柿炒鸡蛋
  • k-近邻算法

    从今天开始,与大家分享我学习《Machine Learning In Action》这本书的笔记与心得。我会将源码加以详细的注释,这是我自己学习的一个过程,也是...

    TheOneGIS
  • 第一章(1.2) 机器学习算法工程师技能树

    - 单机开发工具(numpy、sk-learn、pandas、libsvm、xgboost)

    两只橙
  • Learning ROS for Robotics Programming Second Edition学习笔记(一) indigo v-rep

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865

    zhangrelay
  • 放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较

    在辞旧迎新的时刻,大家都在忙着回顾过去一年的成绩(或者在灶台前含泪数锅),并对2019做着规划,当然也有不少朋友执行力和工作效率比较高,直接把2018年初...

    beyondGuo
  • 大数据工程师需要学习哪些必备知识和技能呢?

    大数据这个行业在科学发展的潮流中也变得越来越火了,来带你看看大数据工程师需要学习哪些必备知识和技能呢?

    用户2292346
  • 基于Keras的DCGAN实现

    生成对抗网络(Generative Adversarial Network,简称GAN)是非监督式学习的一种方法,通过让两个神经网络相互博弈的方式进行学习。

    TheOneGIS

扫码关注云+社区

领取腾讯云代金券