作者:Siddharth M翻译:王可汗校对:欧阳锦本文约1300字,建议阅读6分钟
本文教你如何利用LSTM网络预测股价走势,并对开盘和收盘价进行可视化。

一、介绍

长短时记忆(LSTM)是一种能增加递归神经网络(RNN)记忆的模型。递归神经网络保留短期记忆,因为它们允许在当前神经网络中更早地确定信息。对于即时任务,RNN使用早期的数据,但我们可能没有利用神经元所有的早期信息。在RNN中,LSTM得到了广泛的应用。视频、自然语言处理、地理空间和时间序列等多个应用领域中,都证实了LSTM的有效性。

RNN的一个主要问题是梯度消失问题,它是由于在RNN块中重复使用相同的参数而产生的。我们必须在每个时间步中尝试使用不同的参数来克服这个问题。

我们努力在这样的情况下找到平衡。 在生成变长序列的同时,我们在每一步引入新的参数,同时保持可学习参数的总数量不变。我们引入了基于门控机制的RNN单元,如LSTM和GRU。

门控单元保存内部变量,即利用其中的门。每个时间步的每个门的值取决于该时间步的信息,包括早期状态。然后,门的值乘以不同的权重变量来影响它们。时间序列数据是在一段时间内收集的一系列数据值,允许我们跟踪一段时间内的差异。时间序列数据可以以毫秒、天和年为单位跟踪进程。

早期,我们把时间序列数据视为静态的;每天气温下的高点和低点,股市的开盘价和收盘价。现在我们将进入编码部分。我们将在股票数据集上实现LSTM。

数据集:

https://github.com/PacktPublishing/Learning-Pandas-Second-Edition/blob/master/data/goog.csv

二、利用LSTM实现股票的时间序列预测

读取数据:

gstock_data = pd.read_csv('data.csv')
gstock_data .head()

数据集探索:

该数据集包含14列与时间序列(如日期)和不同的变量(如close、high、low和volume)相关。我们将使用开盘价和收盘价来用LSTM进行时间序列预测。

gstock_data = gstock_data [['date','open','close']]
gstock_data ['date'] = pd.<a onclick="parent.postMessage({'referent':'.pandas.to_datetime'}, '*')">to_datetime(gstock_data ['date'].apply(lambda x: x.split()[0]))
gstock_data .set_index('date',drop=True,inplace=True)
gstock_data .head()

我们在这里进行了一些特征提取。我们从整个日期变量中单独取日期。现在,我们可以使用matplotlib来可视化可用数据,并查看数据中的价格值是如何显示的。如下所示的价格-日期图中绿色表示开盘价,红色表示收盘价。

fg,ax=plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.subplots'}, '*')">subplots(1,2,figsize=(20,7))
ax[0].plot(gstock_data ['open'],label='Open',color='green')
ax[0].set_xlabel('Date',size=15)
ax[0].set_ylabel('Price',size=15)
ax[0].legend()
ax[1].plot(gstock_data ['close'],label='Close',color='red')
ax[1].set_xlabel('Date',size=15)
ax[1].set_ylabel('Price',size=15)
ax[1].legend()
fg.show()

数据预处理:  

我们必须在使用LSTM应用在股票价格之前对这些数据进行预处理。在fit_transform函数的帮助下转换数据中的值。Min-max scaler用于缩放数据,以便我们可以对所有的价格值归一化 然后,我们使用80%的数据进行训练,其余20%用于测试,并将它们分配到单独的变量中。

from sklearn.preprocessing import MinMaxScaler
Ms = MinMaxScaler()
gstock_data [gstock_data .columns] = Ms.fit_transform(gstock_data )
training_size = round(len(gstock_data ) * 0.80)
train_data = gstock_data [:training_size]
test_data  = gstock_data [training_size:]

训练数据的划分:

创建一个函数,以便我们可以创建用于训练和测试的序列。

def create_sequence(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..dataset'}, '*')">dataset):<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..sequences'}, '*')">sequences = []<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..labels'}, '*')">labels = []<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..start_idx'}, '*')">start_idx = 0for <a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..stop_idx'}, '*')">stop_idx in range(50,len(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..dataset'}, '*')">dataset)):<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..sequences'}, '*')">sequences.append(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..dataset'}, '*')">dataset.iloc[<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..start_idx'}, '*')">start_idx:<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..stop_idx'}, '*')">stop_idx])<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..labels'}, '*')">labels.append(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..dataset'}, '*')">dataset.iloc[<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..stop_idx'}, '*')">stop_idx])<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..start_idx'}, '*')">start_idx += 1return (np.<a onclick="parent.postMessage({'referent':'.numpy.array'}, '*')">array(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..sequences'}, '*')">sequences),np.<a onclick="parent.postMessage({'referent':'.numpy.array'}, '*')">array(<a onclick="parent.postMessage({'referent':'.kaggle.usercode.22406117.81090952.create_sequence..labels'}, '*')">labels))train_seq, train_label = create_sequence(train_data)
test_seq, test_label = create_sequence(test_data)

LSTM模型的实现:

在下一步中,我们创建LSTM模型。在本文中,我们将使用从Keras导入的Sequential模型,并导入所需的库。

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

我们在模型中使用了两个LSTM层,并在层与层之间使用dropout以实现正则化。在LSTM参数中分配的单元数是50个。Dropout为10%。损失函数是均方误差并使用Adam优化器优化问题的损失函数。平均绝对误差是我们在LSTM网络中使用的评估度量,因为它与时间序列数据相关。

model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape = (train_seq.shape[1], train_seq.shape[2])))model.add(Dropout(0.1))
model.add(LSTM(units=50))model.add(Dense(2))model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_absolute_error'])model.summary()model.fit(train_seq, train_label, epochs=80,validation_data=(test_seq, test_label), verbose=1)
test_predicted = model.predict(test_seq)
test_inverse_predicted = MMS.inverse_transform(test_predicted)


可视化:

将数据与我们的模型拟合后,我们用它进行预测。 我们必须用逆变换使得变换后的函数返回原值。现在我们可以使用这些数据来可视化预测 。

# Merging actual and predicted data for better visualization
gs_slic_data = pd.concat([gstock_data .iloc[-202:].copy(),pd.DataFrame(test_inverse_predicted,columns=['open_predicted','close_predicted'],index=gstock_data .iloc[-202:].index)], axis=1)
gs_slic_data[['open','close']] = MMS.inverse_transform(gs_slic_data[['open','close']])
gs_slic_data.head()gs_slic_data[['open','open_predicted']].plot(figsize=(10,6))
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.xticks'}, '*')">xticks(rotation=45)
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.xlabel'}, '*')">xlabel('Date',size=15)
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.ylabel'}, '*')">ylabel('Stock Price',size=15)
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.title'}, '*')">title('Actual vs Predicted for open price',size=15)
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.show'}, '*')">show()gs_slic_data[['close','close_predicted']].plot(figsize=(10,6))
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.xticks'}, '*')">xticks(rotation=45)
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.xlabel'}, '*')">xlabel('Date',size=15)
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.ylabel'}, '*')">ylabel('Stock Price',size=15)
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.title'}, '*')">title('Actual vs Predicted for close price',size=15)
plt.<a onclick="parent.postMessage({'referent':'.matplotlib.pyplot.show'}, '*')">show()


三、结论

在本文中,我们利用LSTM研究了股票价格并将开盘和收盘价可视化。

参考:

https://the-learning-machine.com/article/dl/long-short-term-memory

https://www.kaggle.com/amarsharma768/stock-price-prediction-using-lstm/notebook

原文标题:

Stock price using LSTM and its implementation

原文链接:

https://www.analyticsvidhya.com/blog/2021/12/stock-price-prediction-using-lstm/

编辑:黄继彦

校对:林亦霖

译者简介

王可汗,清华大学机械工程系直博生在读。曾经有着物理专业的知识背景,研究生期间对数据科学产生浓厚兴趣,对机器学习AI充满好奇。期待着在科研道路上,人工智能与机械工程、计算物理碰撞出别样的火花。希望结交朋友分享更多数据科学的故事,用数据科学的思维看待世界。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”查看原文

独家 | 利用LSTM实现股价预测相关推荐

  1. 利用LSTM进行股价预测

    利用LSTM进行股价预测 效果 原理 代码 应用 效果 原理 LSTM即长短记忆网络,是一种很强的RNN,这种网络的特性是以前的输入会影响现在的输出,具体原理请自行搜索. 算法流程: 获取yahoo财 ...

  2. pytorch LSTM的股价预测

    股价预测一直以来都是幻想能够被解决的问题,本文中主要使用了lstm模型去对股价做一个大致的预测,数据来源是tushare,非常感谢tushare的数据!! 为什么要用LSTM? LSTM是一种序列模型 ...

  3. 独家 | 利用深度学习来预测Spotify上的Hip-Hop 流行程度

    作者:Nicholas Indorf翻译:Gabriel Ng校对:zrx本文约10000字,建议阅读13分钟 项目中收集并使用了 Spotify 数据库中最近发布的hip-hop曲目的音频预览样本和 ...

  4. 利用LSTM进行时序预测

    在日常工作过程中,经常会遇到一些需要预测的场景,比如预测商户交易量.预测商品销售额等等.今天给大家分享一波使用 LSTM 进行端到端时间序列预测的完整代码和详细解释. 我们先来了解两个主题: 什么是时 ...

  5. sklearn中lstm_利用LSTM网络进行预测,使用,做,预报,Forecast

    使用LSTM网络做预报(Forecast) 在一次小小的比赛中需要做趋势预测,当时找了很多种方法,最后也对LSTM的使用做出一定的研究,现在大多数能找到的都是Predict,对于Forecast的做法 ...

  6. 基于Informer的股价预测(量化交易综述)

    摘要 股票市场是金融市场中不可或缺的组成部分.准确预测股票趋势对于投资者和市场参与者具有重要意义,因为它们可以指导投资决策.优化投资组合以及降低金融风险.而且可以提升国家国际地位以及金融风险控制能力, ...

  7. MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测

    MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测 摘要 近些年,随着计算机技术的不断发展,神 ...

  8. 独家 | 利用深度学习和机器学习预测股票市场(附代码)

    来源:AISHWARYA SINGH, 2018年10月25日 翻译:赵雪尧 校对:车前子 本文约8000字,建议阅读15+分钟. 本文介绍了如何运用深度学习法预测股票市场. 简介 预测股市将如何变化 ...

  9. DL之LSTM:基于《wonderland爱丽丝梦游仙境记》小说数据集利用LSTM算法(层加深,基于keras)对单个character字符预测

    DL之LSTM:基于<wonderland爱丽丝梦游仙境记>小说数据集利用LSTM算法(层加深,基于keras)对单个character字符预测 目录 基于<wonderland爱丽 ...

  10. TF之LSTM:利用LSTM算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)

    TF之LSTM:利用LSTM算法对Boston(波士顿房价)数据集[13+1,506]进行回归预测(房价预测) 相关文章 DL之LSTM:利用LSTM算法对Boston(波士顿房价)数据集[13+1, ...

最新文章

  1. ajax的auto是true,一个AJAX自动完成功能的js封装源码[支持中文]
  2. 如何修改uboot的环境变量env的值来指定uImage的名字
  3. 【2019第十届蓝桥杯省赛C/C++B组题解】(非官方题解)
  4. python中的zip模块
  5. ASP.NET教程5
  6. H264参数SPS(序列参数集)和PPS(图像参数集)说明
  7. scala的运算符(四)
  8. 苹果HomePod mini出现连接不上Wi-Fi怎么办?解决办法来啦!
  9. SuperMap GIS 10i大数据GIS 技术白皮书
  10. 图解 Paxos 算法
  11. 【2023】上海交通大学计算机考研信息汇总
  12. 美国公布自动驾驶新政AV4.0;微软Access数据库出现漏洞,或致8.5万家企业面临风险;苹果谈论隐私问题……...
  13. 百度没有文化(转载)
  14. 蛋白和肽测序仪销量、收入、价格、毛利率及市场份额
  15. 蟠桃会(递推逆序求解)
  16. 视频教程-爱上axure之 交互制作-Axure
  17. 自动化立体库抗震解决方案
  18. 模拟语音加密的置乱技术简介
  19. 【图】广度与深度遍历
  20. 《计算机网络自顶向下方法-第七版》第一章总结

热门文章

  1. SPI 读取不同长度 寄存器_几种常用的总线设计:UART/SPI/I2C
  2. React新手入门学习
  3. WEBTIMER控件研究的心得:WebTimer的启示
  4. 全民投资人游戏服务器维护,欢乐园《全民仙战》3月5日14时合服公告
  5. 【操作系统】知识梳理(十一)多媒体操作系统
  6. WIN10中程序以管理员身份运行的解决方法
  7. [WUSTCTF2020]alison_likes_jojo
  8. 台式计算机硬盘的尺寸通常为多少英寸,电脑硬件参数之硬盘
  9. 赛博朋克!灵感来自枫树种子荚的多翼滑翔机,空中可分体
  10. 什么样的运动耳机比较好、跑步运动耳机推荐