【项目实战】Python实现循环神经网络RNN-LSTM回归模型项目实战(股票价格预测)
说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取。
1.项目背景
金融一直是现代社会非常热门的一个研究方向,随着社会的发展,越来越多的数学方法被应用于金融领域的描述中。我们寄希望于用一种更客观地表达来研究金融。而股票市场作为一个看似门槛极低的金融市场,参与者众多,与利益直接挂钩,是金融市场的一个大热研究方向。
中国股市于 1989 年开始试运行,自此,开始了中国股市近30年的起起伏伏。中国股市虽相较于美国股市还没有很成熟,但是经过30年的发展,也在逐渐向一个成熟的市场发展。截至2019年,沪深A股交易股票已有3589只,如何在其中筛选出有潜力的股票,或者说如何对股票价格进行短期的预测,这在深度学习日趋兴起的背景下,成为了我们想要尝试解决的一个问题。
2.数据获取
本次建模数据来源于网络(本项目撰写人整理而成),数据项统计如下:
数据详情如下(部分展示):
3.数据预处理
3.1 用Pandas工具查看数据
使用Pandas工具的tail()方法查看后十行数据:
关键代码:
3.2查看AAPL公司股票数据的描述性统计分析
使用Pandas工具的describe()方法AAPL公司的描述性统计分析信息:
从上图可以看到,AAPL公司股票数据开盘价、最高价、最低价、收盘价、成交量的平均值、标准差、最小值、中位数、最大值。
关键代码:
3.3查看AAPL公司股票数据的摘要信息
通过Pandas工具的info()方法来查看AAPL公司股票数据的摘要信息:
通过上图可以看到,总共有6个数据项,1259条数据,数据时间范围为2013到2018年,数据中无缺失值。
关键代码如下:
4.探索性数据分析
4.1 绘制股票收盘价曲线图
用Pandas工具的plot()方法进行绘图,图形如下:
通过上图可以看到,4家公司的股票收盘价格基本每年呈上升趋势。
4.2 绘制股票成交量曲线图
从上图中可以看到,每家公司股票的成交量基本都是在一定的范围内进行波动。
4.3 绘制股票收盘价10天、20天、50天累计曲线图
从上图中可以看到,APPLE公司股票收盘价10天、20天、50天内累计收盘价呈上升趋势,而APPLE公司股票收盘价比较稳定。
关键代码:
4.4 绘制股票日收益曲线图
从上图中可以看到,每家股票的日收益都存在一定的波动,同时也说明了股票有风险、入市需谨慎。
关键代码如下:
4.5 绘制股票日收益直方图
从上图中可以看到,4家公司的日收益均集中在-0.05-0.05之间。
关键代码:
4.6 相关性分析
通过Pandas工具的corr()方法进行相关性分析:
从上图可以看到,除成交量外其它数据项之间相关性比较高。
5.特征工程
5.1 建立特征数据和标签数据
close为标签数据,除 close之外的为特征数据。关键代码如下:
5.2 数据集拆分
训练集拆分,分为训练集和验证集,70%训练集和30%验证集,关键代码如下:
5.3 数据归一化
通过MinMaxScaler工具进行数据的归一化,把数据缩放到0-1区间,关键代码如下:
6.构建LSTM回归模型
Hochreiter 等学者(1997)[21]提出了长短时记忆单元(Long Short-Term Memory,LSTM)用于改进传统的循环神经网络模型(RNN),该模型通过门的开关实现时间上的记忆功能,并反之梯度小时,实验结果表明,LSTM 能有效地解决 RNN 训练时的梯度爆炸和梯度消失问题。2005 年,Alex Graves,Jürgen Schmidhuber[22]提出了使用完全的后向传播方式训练 LSTM 模型,使得LSTM 的实现过程更加可靠。2015 年,Chung 等学者提出了简化版本的LSTM,门控反馈 RNN(GF-RNN)通过允许和控制从上部复现层流向下层的信号,使用每对层的全局选通单元,扩展了堆叠多个复现层的现有方法。层之间交换的递归信号基于先前的隐藏状态和当前输入自适应地选通。相比于传统的神经网络模型。LSTM 神经网络模型对于神经组织的认知过程的模拟更为准确。
6.1建模
关键代码如下:
6.2查看模型信息
通过模型的summary()方法查看模型的信息,如下图所示:
7.模型评估
7.1评估指标及结果
评估指标主要包括可解释方差值、均方误差、R方值等等。
从上表可以看出,R方为100% 可解释方差值为100%,LSTM回归模型比较优秀,效果非常好。
关键代码如下:
7.2 真实值与预测值对比图
从上图可以看出真实值和预测值波动基本一致,模型拟合效果非常棒。
8.结论与展望
综上所述,本文采用了LSTM回归模型,最终证明了我们提出的模型效果良好。可用于日常金融中股票价格的预测。
sns.set_style('whitegrid') plt.style.use("fivethirtyeight") tech_list = ['AAPL', 'GOOG', 'MSFT', 'AMZN'] df = pd.read_excel('data.xlsx', index_col='date') # 本次机器学习项目实战所需的资料,项目资源如下: 链接:https://pan.baidu.com/s/1fi4YFKZk1bHWKHdgxUHQEA 提取码:m36g # 用Pandas工具查看数据 print(df.tail(10)) df_AAPL = df[df['Name'] == 'AAPL'] print(df_AAPL.head()) # 查看AAPL公司股票数据的描述性统计分析 print(df_AAPL.describe()) # 查看AAPL公司股票数据的摘要信息 print(df_AAPL.info()) plt.figure(figsize=(15, 6)) plt.subplots_adjust(top=1.25, bottom=1.2) company_list = ['AAPL', 'GOOG', 'MSFT', 'AMZN'] # 绘制股票收盘价曲线图