前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >验证 | 单纯用LSTM预测股价,结果有多糟(附代码)

验证 | 单纯用LSTM预测股价,结果有多糟(附代码)

作者头像
量化投资与机器学习微信公众号
发布于 2019-02-26 08:32:46
发布于 2019-02-26 08:32:46
14.2K12
代码可运行
举报
运行总次数:2
代码可运行

本期作者:Alexandre Xavier

本期翻译:Remedios | 公众号翻译部

前言

在这篇文章中,我们会使用神经网络,特别是LSTM模型,来预测时间序列。

尽管预测股价确实是一个老问题,至今仍然没有被解决。事实十分简单:股票的价格由多种因素决定,而股票的历史价格仅仅是众多原因中的一小部分。因此,预测股价走势是一个非常困难的问题

获取全部代码见文末:

摘要

首先,我将使用一些数据可视化工具介绍数据集。然后,我们将大致讨论使用移动平均算法预测股票市场走势有多难并且展示其局限性。接下来,我们将对RNN和LSTM的做一个简短的介绍,并举一个预测单个公司股价的LSTM实例。最后,我们会展示使用LSTM同时预测四个公司的股价,并且比较结果以探究是否预测效果会随着我们预测股价的公司个数的增加而提升。

数据可视化

本文使用的数据集是以CSV格式从雅虎财经下载下来的,其中包括四个公司从2010年1月8日到2019年1月7日的股价。我们将这四个公司分别称为A,B,C和D.

基础步骤是用Pandas打开这个CSV文件。我们先看一下这些数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_A = pd.read_csv(‘data/company_A.csv’)
df_A[‘Date’] = pd.to_datetime(df_A[‘Date’])
df_A.head()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.figure(figsize = (15,10))
plt.plot(df_A['Date'], df_A['Close'], label='Company A')
plt.plot(df_B['Date'], df_B['Close'], label='Company B')
plt.plot(df_C['Date'], df_C['Close'], label='Company C')
plt.plot(df_D['Date'], df_D['Close'], label='Company D')
plt.legend(loc='best')
plt.show()

四个公司的收盘价

移动平均

用于股价预测的一个经典算法是移动平均值(MA)。这个方法主要在于计算过去“m”个观察日的平均值,并且使用此结果作为下一日的预测值。作为举例,使用过去10天和20天的收盘价计算移动平均值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df['MA_window_10'] = df['Close'].rolling(10).mean().shift() 
df['MA_window_20'] = df['Close'].rolling(20).mean().shift()

当我们尝试使用移动平均值对未来10天股票的收盘价进行预测时,结果如下:

获取全部代码,见文末

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window_size = 10
forward_days = 10 # > 1, ou seja, 2,3,4,5,...
for index in range(window_size, len(df), forward_days):
    for i in range(0,forward_days):
        if index+i >= len(df):
            break
        window_close = make_window(window_size-i, index+i-window_size)
        #print(window_close)
        window_MA = make_window(i, index)
        #print(window_MA)
        mean = pd.concat([ df['Close'].iloc[window_close], df['MA_window_10_forward_10'].iloc[window_MA] ]).mean(axis=0)
        df.iat[index+i, df.columns.get_loc('MA_window_10_forward_10')] = mean

plt.figure(figsize = (15,10))

size = len(df)-limit - (len(df)-limit)%forward_days

for index in range(size, len(df), forward_days):
    plt.plot(df['MA_window_10_forward_10'][index:index+forward_days], color='r')
    
plt.plot(df['Close'][-limit:], color='b', label='Close')
#plt.legend(loc='best')
plt.show()

使用移动平均对公司A股票的十日收盘价预测

注意每条红线代表一个基于过去十天数据的10日股价预测。因此,红线是不连续的。

使用一个稍微更好一点的算法,指数移动平均(EMA),我们可以对预测实现一点点改善:

使用指数移动平均对公司A股票收盘价进行提前一天预测结果

对比MA和EMA:

提前一天使用移动平均和指数移动平均对股票收盘价进行预测结果对比

这个方法过于简单。我们真正想要的是提前“n”天预测未来的走势,这个任务MA和EMA都无法做到。

RNN

要理解LSTM网络,我们首先需要理解RNN。这种网络被用于过去结果对目前结果有影响时的模式识别。时间序列函数是RNN的一个运用实例。在这个函数中,数据顺序极其重要。

在这个网络架构中,神经元不仅使用普通的输入(即前一层的输出),也使用它之前的状态作为输入。

RNN结构

需要注意的是,“H”代表神经元的状态。因此,在状态H1,神经元使用参数X1和H0(它之前的状态)作为输入。这个模型的主要问题是记忆的损失。之前的网络状态将会被更快地遗忘。在我们需要记忆前序信息之前的信息的序列中,RNN无法记忆。

LSTM

LSTM源于RNN,但是它能够通过改变神经元架构解决记忆的损失。

LSTM结构

新的神经元有三个门,每一个有不同的功能。这些门分别是:

  • 输入门
  • 输出门
  • 遗忘门

每个LSTM神经元依然将它之前的状态作为输入:

LSTM神经元让它之前状态的参数通过

使用LSTM预测单个公司股价

最后,让我们使用一个LSTM来预测公司A单个公司股价的走势。

首先来看以下这些参数。我们想要利用m日过去的数据(look_back)对未来n天(forward_days)的股价进行预测。所以,如果我们有m天过去数据的输入值,这个网络的输出值会是之后n天股价的预测值。我们将数据集划分为训练集和测试集。训练集将由k个周期组成(num_periods),每个周期中有一系列的n日预测。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
look_back = 40
forward_days = 10
num_periods = 20

现在,让我们用Pandas打开这个CSV文件并且只保留我们会用到的日期和收盘价两列。公司A初始的收盘价作图如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.figure(figsize = (15,10))
plt.plot(df)
plt.show()

我们依次衡量输入值的比例,将数据划分成训练集/验证集和测试集,并进行格式化来反馈给模型。详细过程可以在文末代码上找到

现在,我们建立并训练这个模型。

获取全部代码,见文末

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NUM_NEURONS_FirstLayer = 128
NUM_NEURONS_SecondLayer = 64
EPOCHS = 220
#Build the model
model = Sequential()
model.add(LSTM(NUM_NEURONS_FirstLayer,input_shape=(look_back,1), return_sequences=True))
model.add(LSTM(NUM_NEURONS_SecondLayer,input_shape=(NUM_NEURONS_FirstLayer,1)))
model.add(Dense(foward_days))
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(X_train,y_train,epochs=EPOCHS,validation_data=(X_validate,y_validate),shuffle=True,batch_size=2, verbose=2)

结果得到:

看看测试集:

注意每条红线代表基于过去40天的十日预测。我们选择在20个周期上测试,因而有20根红线。这就是为什么红色的预测线不连续。

通过对所有公司重复以上相同的流程,测试集的最好结果出现在对公司C的预测。

尽管这是这之间最好的模型,结果还远远不够优秀。可能导致这个结果的理由有很多,其中的一些可能是:

  • 仅仅用收盘价历史数据不足以预测股价走势
  • 这个模型还能被进一步改善

使用LSTM预测四个公司的股价

最后,我们将用LSTM模型来一起预测所有四个公司的股价走势,并将结果与LSTM预测单个公司的结果进行对比。目标是分析是否使用来自几个不同公司的数据能够提高对个个公司股价的预测。

需要指出的是,所有四个CSV文件有相同的日期。这样以来,网络不会从一家公司接收未来讯息来预测另一家公司的价值。

在数据正则化并格式化,反馈给模型之后,这个模型被训练:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NUM_NEURONS_FirstLayer = 100
NUM_NEURONS_SecondLayer = 50
EPOCHS = 200
#Build the model
model = Sequential()
model.add(LSTM(NUM_NEURONS_FirstLayer,input_shape=(look_back,num_companies), return_sequences=True))
model.add(LSTM(NUM_NEURONS_SecondLayer,input_shape=(NUM_NEURONS_FirstLayer,1)))
model.add(Dense(foward_days * num_companies))
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(X_train,y_train,epochs=EPOCHS,validation_data=(X_validate,y_validate),shuffle=True,batch_size=1, verbose=2)

结果:

仔细看测试集:

到了比较结果的时候了。单个公司LSTM模型的结果放在左边,四个公司LSTM模型的结果放右边遍。第一条线展示的是测试集中的预测,第二条线是所有数据集的预测。

公司A

公司B

公司C

公司D

总结

仅仅使用股票的历史价格预测证券市场的走势是不可能的。LSTM预测仍然令人不合意。甚至当利用多个公司的历史股价预测时,预测结果更加糟糕。

The original:https://medium.com/infosimples/predicting-stock-prices-with-lstm-349f5a0974d4

参考资料

[1] https://www.datacamp.com/community/tutorials/lstm-python-stock- market

[2] http://colah.github.io/posts/2015-08-Understanding-LSTMs/

[3] https://towardsdatascience.com/train-validation-and-test-sets- 72cb40cba9e7

[4] https://machinelearningmastery.com/diagnose-over12tting-under12tting- lstm-models/

[5] https://machinelearningmastery.com/reshape-input-data-long-short- term-memory-networks-keras/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量化投资与机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
您好,请问可以分享源代码吗
您好,请问可以分享源代码吗
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【视频讲解】LSTM神经网络模型在微博中文文本评论情感分析和股市预测应用附代码数据
本文将通过视频讲解,展示如何用python的LSTM模型对中文文本评论情感分析,并结合一个TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化实例的代码数据,为读者提供一套完整的LSTM模型分类预测的实践数据分析流程(点击文末“阅读原文”获取完整代码数据)。
拓端
2025/04/26
1510
【视频讲解】LSTM神经网络模型在微博中文文本评论情感分析和股市预测应用附代码数据
【2万字干货】利用深度学习最新前沿预测股价走势
在本篇文章中,我们将创建一个完整的程序来预测股票价格的变动。为此,我们将使用生成对抗性网络(GAN),其中LSTM是一种递归神经网络,它是生成器,而卷积神经网络CNN是鉴别器。我们使用LSTM的原因很明显,我们试图预测时间序列数据。为什么我们使用GAN,特别是CNN作为鉴别器?这是一个好问题,后面会有专门的部分介绍。
量化投资与机器学习微信公众号
2019/02/26
5.4K0
是涨是跌?我用Python预测股票价格趋势
要预测股票趋势,通常需要历史的各类交易价格数据来进行模型的搭建。“历史惊人的相似”是股票趋势判断问题的重要假设。通常我们的思维是,股票某一天的交易价格受到该交易日前面的许多交易日的影响,而股价的确定则是由买卖市场双方共同决定的。当我们收盘股票数据集时,应该将多个开盘日归入参考范畴。本文将前 N 个交易日作为一个时间窗口,并设为训练集,将第 N+1 个交易日作为测试集,预测测第 N+2 个交易日的股票趋势情况。通过滑动窗口的方法,设每次滑动窗口移动的距离为 1(即 1 天),则在初始 T 个交易日上能够构造多个训练集和测试集,且训练样本的数据始终等于 N。
数据STUDIO
2021/06/24
6.3K0
用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)
在本文里,将给出若干精彩范例,包括用爬虫获取股市数据,用matplotlib可视化控件绘制K线和均线,以及用sklean库里的方法,通过机器学习预测股价的走势。
用户1153489
2020/08/14
3.3K0
金融数据分析库yfinance,初次使用体验!
今天给大家介绍一个金融数据分析库yfinance,主要是基于该库下的股票数据分析及股价预测(使用LSTM模型)
皮大大
2023/08/29
14.7K2
严谨解决5种机器学习算法在预测股价的应用(代码+数据)
机器学习有很多应用,其中之一就是预测时间序列。一个最有趣(或者可能是最赚钱)的时间序列是股票价格。
量化投资与机器学习微信公众号
2019/02/26
5.8K1
【干货】RNN-LSTM的Keras实现:以预测比特币和以太坊价格为例(附代码)
【导读】本文是Siavash Fahimi撰写的一篇很棒的技术博文,主要讲解了用Keras实现RNN-LSTM,并用来预测比特币和以太坊的价格。在过去的一年,互联网行业最火的名词除了AI以外,就当属区块链了,虽然本文不涉及区块链的技术讲解,但是由于是对比特币价格进行预测,所以在此提及。言归正传,本文首先介绍RNN和LSTM的原理,这是两种应用广泛的时序模型,相信很多读者也都有所了解。本文的重点在于通过一个完整的实例来帮助读者理解RNN-LSTM以及Keras的用法, 并附完整实现代码,相信能给您带来新的感悟
WZEARW
2018/04/16
13.1K1
【干货】RNN-LSTM的Keras实现:以预测比特币和以太坊价格为例(附代码)
独家 | 利用LSTM实现股价预测
作者:Siddharth M翻译:王可汗校对:欧阳锦 本文约1300字,建议阅读6分钟本文教你如何利用LSTM网络预测股价走势,并对开盘和收盘价进行可视化。
数据派THU
2021/12/24
2.6K0
独家 | 利用LSTM实现股价预测
深度学习 | 基于LSTM模型的黄金期货价格预测
本文数据集为黄金期货价格,可从:https://cn.investing.com/commodities/gold-historical-data进行下载。(单位 : 1金衡盎司 = 31.1034768克)
DataCharm
2021/04/16
3.3K0
深度学习 | 基于LSTM模型的黄金期货价格预测
通过支持向量回归和LSTM进行股票价格预测
人工智能(AI)无处不在。机器学习和人工智能正在彻底改变现代问题的解决方式。应用机器学习的一种很酷的方法是使用财务数据。财务数据是机器学习的一个游乐场。
代码医生工作室
2019/09/23
3.8K0
通过支持向量回归和LSTM进行股票价格预测
开什么玩笑?股票价格如何经得起AI的推敲?| 技术头条
【导语】用深度学习预测股票价格不是一个新话题,随着技术的不断发展,大家一直在不断尝试新技术。这次教程中,作者设计了一个强强联合型模型来预测股票价格,为什么这么形容?作者设计了一个 GAN 模型,其生成网络为 LSTM 模型用来预测时间序列数据、CNN 模型作判别网络,用 BERT 模型作为情绪分析模型。带有高斯过程的贝叶斯优化和深度强化学习方法来获得 GAN 的超参数。为什么创建这样的组合?AI科技大本营都将在下面的内容中为大家进行一一解答。
AI科技大本营
2019/05/07
1.2K0
开什么玩笑?股票价格如何经得起AI的推敲?| 技术头条
「数据游戏」:使用 LSTM 模型预测三天后单股收盘价
LSTM模型是RNN的一种,其特点是在单一循环神经网络的基础上,构建出了长短记忆门,也就是可以长时间发现和记忆长依赖关系。本次比赛将使用LSTM模型来预测招商银行三天后的收盘价,也就是利用5月10日前的数据,来预测5月15日的收盘价。
全栈程序员站长
2022/06/30
6530
Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码
股票市场在经济发展中占据重要地位。由于股票的高回报特性,股票市场吸引了越来越多机构和投资者的关注。然而,由于股票市场的复杂波动性,有时会给机构或投资者带来巨大损失。考虑到股票市场的风险,对股价变动的研究与预测能够为投资者规避风险。传统的时间序列模型ARIMA无法描述非线性时间序列,并且在建模前需要满足诸多条件,在股票预测中无法取得显著成果(点击文末“阅读原文”获取完整代码数据)。
拓端
2025/03/11
4650
Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码
基于LSTM的比特币价格预测模型(系列1)
设计并训练由输入/训练数据(比特币价格时间序列/60min)驱动的LSTM,预测一小时内的比特币价格,从而在整个测试数据样本中实现真实价格和预测价格之间的最小均方根误差(RMSE)。
量化投资与机器学习微信公众号
2020/04/13
4K0
Python+AI提示词用LSTM和注意力机制的苹果公司股票价格预测
作为数据科学家,我们深知在瞬息万变的金融市场中,准确的预测就如同珍贵的宝藏。随着技术的不断发展,机器学习成为了我们解读市场趋势的有力工具。在众多机器学习模型中,长短期记忆网络(Long Short-Term Memory, LSTM)因其独特的优势而备受关注。当LSTM与注意力机制相结合时,其在分析时间序列数据方面的能力更是得到了显著提升,尤其适用于像股票价格这样的数据(点击文末“阅读原文”获取完整代码、数据、文档)。
拓端
2025/05/01
1290
Python+AI提示词用LSTM和注意力机制的苹果公司股票价格预测
使用LSTM模型预测股价基于Keras
编者按:本文介绍了如何使用LSTM模型进行时间序列预测。股票市场的数据由于格式规整和非常容易获得,是作为研究的很好选择。但不要把本文的结论当作理财或交易建议。
量化投资与机器学习微信公众号
2019/02/26
4.2K0
独家 | Two Sigma用新闻来预测股价走势,带你吊打Kaggle(附代码)
可以根据历史数据预测股票价格吗?最直接的回答可能是:“不能”。这是因为股市价格波动很大,并且取决于很多因素。量化所有这些因素几乎是不可能的,因此预测股价仍然是一门没人能掌握的艺术。撇开所有的负面因素不谈,有没有什么方法可以尽可能接近股价?有很多方法可以回答这个问题,但是在这里我们将看到机器学习是如何处理这个问题的。
量化投资与机器学习微信公众号
2019/02/26
4K1
基于长短期记忆模型的股价预测及可视化
1、https://easyai.tech/ai-definition/lstm/
皮大大
2024/09/09
2080
TensorFlow深度学习!构建神经网络预测股票价格!⛵
股票价格数据是一个时间序列形态的数据,诚然,股市的涨落和各种利好利空消息更相关,更多体现的是人们的信心状况,但是它的形态下,时序前后是有一定的相关性的,我们可以使用一种特殊类型的神经网络『循环神经网络(RNN)』来对这种时序相关的数据进行建模和学习。
ShowMeAI
2022/11/12
1.1K0
TensorFlow深度学习!构建神经网络预测股票价格!⛵
用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线
我最近出了一本书,《基于股票大数据分析的Python入门实战 视频教学版》,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ等指标图的绘制方法。此外,还可以用价格通道来分析。根据指定股票通道指标的算法,能用过去一定时间段的交易数据绘制出上下两条通道线,即价格通道里的上下轨道。一般来说,当股价向上突破上轨时,即预测后市将涨,反之当股价向下突破下轨时,即预测后市将跌。
用户1153489
2020/08/24
1.8K0
用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线
推荐阅读
【视频讲解】LSTM神经网络模型在微博中文文本评论情感分析和股市预测应用附代码数据
1510
【2万字干货】利用深度学习最新前沿预测股价走势
5.4K0
是涨是跌?我用Python预测股票价格趋势
6.3K0
用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)
3.3K0
金融数据分析库yfinance,初次使用体验!
14.7K2
严谨解决5种机器学习算法在预测股价的应用(代码+数据)
5.8K1
【干货】RNN-LSTM的Keras实现:以预测比特币和以太坊价格为例(附代码)
13.1K1
独家 | 利用LSTM实现股价预测
2.6K0
深度学习 | 基于LSTM模型的黄金期货价格预测
3.3K0
通过支持向量回归和LSTM进行股票价格预测
3.8K0
开什么玩笑?股票价格如何经得起AI的推敲?| 技术头条
1.2K0
「数据游戏」:使用 LSTM 模型预测三天后单股收盘价
6530
Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码
4650
基于LSTM的比特币价格预测模型(系列1)
4K0
Python+AI提示词用LSTM和注意力机制的苹果公司股票价格预测
1290
使用LSTM模型预测股价基于Keras
4.2K0
独家 | Two Sigma用新闻来预测股价走势,带你吊打Kaggle(附代码)
4K1
基于长短期记忆模型的股价预测及可视化
2080
TensorFlow深度学习!构建神经网络预测股票价格!⛵
1.1K0
用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线
1.8K0
相关推荐
【视频讲解】LSTM神经网络模型在微博中文文本评论情感分析和股市预测应用附代码数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验