【DS】利用Keras长短期记忆(LSTM)模型预测股票价格

笔者邀请您,先思考:

1 您如何处理时间序列数据?

LSTMs在序列预测问题中非常强大,因为它们能够存储过去的信息。这在我们的案例中很重要,因为股票的前一个价格对于预测其未来的价格是至关重要的。

编者按:本教程演示了如何开始使用LSTM模型预测时间序列。股票市场数据是一个很好的选择,因为它是相当常规的和广泛地提供给每个人。请不要把这当作理财建议,也不要用它来做你自己的交易。

在本教程中,我们将构建一个Python深度学习模型,用于预测股票价格的未来行为。我们假设读者熟悉Python中的深度学习概念,特别是LSTM。

虽然预测股票的实际价格是一个上坡路,但是我们可以建立一个模型来预测股票的价格是涨是跌。本教程使用的数据和notebook可以在这里找到。需要注意的是,影响股价的因素总是存在的,比如政治氛围和市场。然而,在本教程中,我们不会关注这些因素。

简介

LSTMs在序列预测问题中非常强大,因为它们能够存储过去的信息。这在我们的案例中很重要,因为股票的前一个价格对于预测其未来的价格是至关重要的。

我们将导入用于科学计算的NumPy、用于绘制图形的Matplotlib和用于加载和操作数据集的Pandas。

1import numpy as np
2import matplotlib.pyplot as plt
3import pandas as pd

加载数据集

下一步是加载我们的训练数据集,并选择我们将在建模中使用的Open和High列。

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

我们检查数据集的头部,以便让我们对正在使用的数据集有一个大致的了解。

1dataset_train.head()

某只股票在特定交易日的开盘价是是Open列,收盘价是Close列。最高和最低价分别是High列和Low列。

特征缩放

从以前使用深度学习模型的经验中,我们知道我们必须缩放数据以获得最佳性能。在我们的例子中,我们将使用Scikit- Learn的MinMaxScaler,并将数据集缩放到0到1之间的数字。

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

使用Timesteps创建数据

LSTMs期望我们的数据具有特定的格式,通常是一个3D数组。我们首先在60个时间步骤中创建数据,然后使用NumPy将其转换为数组。接下来,我们将数据转换为具有X_train示例、60个时间戳和每个步骤一个特征的3D维度数组。

1X_train = []
2y_train = []
3for i in range(60, 2035):
4    X_train.append(training_set_scaled[i-60:i, 0])
5    y_train.append(training_set_scaled[i, 0])
6X_train, y_train = np.array(X_train), np.array(y_train)
7
8X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

构建LSTM

为了构建LSTM,我们需要从Keras中导入几个模块:

  • Sequential用于初始化神经网络
  • Dense用于添加密集连接的神经网络层
  • LSTM用于添加长短期内存层
  • Dropout用于添加防止过拟合的dropout层
1from keras.models import Sequential
2from keras.layers import Dense
3from keras.layers import LSTM
4from keras.layers import Dropout

我们添加LSTM层,然后添加一些Dropout层以防止过拟合。我们使用以下参数添加LSTM层:

  • 50个单元,也就是输出空间的维度
  • return_sequence =True,它决定是否返回输出序列中的最后一个输出,还是返回完整的序列
  • input_shape作为训练集的shape

在定义Dropout层时,我们指定0.2,这意味着20%的层将被删除。然后,我们添加指定1个单元的输出的Dense层。在此之后,我们使用流行的adam优化器编译模型,并将损失设置为mean_squarred_error。这会计算平方误差的均值。接下来,我们将模型设置为在批大小为32的100个epochs上运行。请记住,根据您的计算机的规格,这可能需要几分钟来完成运行。

 1regressor = Sequential()
 2
 3regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
 4regressor.add(Dropout(0.2))
 5
 6regressor.add(LSTM(units = 50, return_sequences = True))
 7regressor.add(Dropout(0.2))
 8
 9regressor.add(LSTM(units = 50, return_sequences = True))
10regressor.add(Dropout(0.2))
11
12regressor.add(LSTM(units = 50))
13regressor.add(Dropout(0.2))
14
15regressor.add(Dense(units = 1))
16
17regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
18
19regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)

使用测试集预测未来的股票

首先,我们需要导入用于预测的测试集。

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

为了预测未来的股票价格,我们需要在加载测试集之后做一些事情:

  1. 在0轴上合并训练集和测试集。
  2. 将时间步长设置为60(如前所述)
  3. 使用MinMaxScaler转换新数据集
  4. 如前所述,重新塑造数据集

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

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

可视化结果

最后,我们使用Matplotlib将预测股价和实际股价的结果可视化。

1plt.plot(real_stock_price, color = 'black', label = 'TATA Stock Price')
2plt.plot(predicted_stock_price, color = 'green', label = 'Predicted TATA Stock Price')
3plt.title('TATA Stock Price Prediction')
4plt.xlabel('Time')
5plt.ylabel('TATA Stock Price')
6plt.legend()
7plt.show()

从图中我们可以看到,股票的实际价格上升了,而我们的模型也预测了股票的价格会上升。这清楚地显示了LSTMs在分析时间序列和顺序数据方面的强大功能。

总结

有一些其他的技术来预测股票价格,如移动平均线,线性回归,k近邻,ARIMA和Prophet。这些技术可以单独测试,并与Keras LSTM进行性能比较。如果你想更多地了解Keras和深度学习,你可以在这里找到我的文章。

作者:Derrick Mwiti 原文链接: https://heartbeat.fritz.ai/using-a-keras-long-shortterm-memory-lstm-model-to-predict-stock-prices-a08c9f69aa74

本文分享自微信公众号 - 数据科学与人工智能(DS_AI_shujuren)

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏磐创AI技术团队的专栏

TensorFlow系列专题(二):机器学习基础

数据预处理的方式较多,针对不同类型的数据,预处理的方式和内容也不尽相同,这里我们简单介绍几种较为常用的方式:

13540
来自专栏量子位

姚期智院士亲自讲授,一文读懂量子计算

但如果你对量子计算深怀兴趣,或者对量子计算的前世今生、未来前景等充满好奇,这可能是最深入浅出的授受文章。

14320
来自专栏AI研习社

博客 | ACM MM最佳论文全文:通过多对抗训练,从图像生成诗歌

雷锋网 AI 科技评论按:多媒体信息处理领域顶级学术会议 ACM MM 2018(ACM International Conference on Multime...

25430
来自专栏生信小驿站

生存分析①R语言

生存分析(Survival analysis)是指根据试验或调查得到的数据对生物或人的生存时间进行分析和推断,研究生存时间和结局与众多影响因素间关系及其程度大小...

38640
来自专栏机器学习算法与Python学习

机器人在 GitHub 上“卧底”数月,伪装成人类贡献修复补丁

据 MIT Technology Review 报道,一位名为“Repairnator”机器人在 GitHub 上“卧底”数月,查找错误并编写和提交修复补丁,结...

14660
来自专栏CreateAMind

AI尝试做判断题和填空题的效果

code: https://github.com/createamind/keras-cpcgan

15430
来自专栏AI研习社

论文推荐 | Cycle-GAN:通过双向循环实现一个超棒的图像风格转换器

Zhu Jun-Yan /Park Taesung /Isola Phillip /Efros Alexei A.

40620
来自专栏智能算法

【深度学习】深度多目标跟踪算法综述

基于深度学习的算法在图像和视频识别任务中取得了广泛的应用和突破性的进展。从图像分类问题到行人重识别问题,深度学习方法相比传统方法表现出极大的优势。与行人重识别问...

44220
来自专栏SIGAI学习与实践平台

深度多目标跟踪算法综述

基于深度学习的算法在图像和视频识别任务中取得了广泛的应用和突破性的进展。从图像分类问题到行人重识别问题,深度学习方法相比传统方法表现出极大的优势。与行人重识别问...

37830
来自专栏AI科技大本营的专栏

朴素贝叶斯分类器详解及中文文本舆情分析(附代码实践)

作者 | 杨秀璋(笔名:Eastmount),贵州财经大学信息学院老师,硕士毕业于北京理工大学,主要研究方向是Web数据挖掘、知识图谱、Python数据分析、图...

1.3K30

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励