众所周知,股票预测是一个玄学问题,没有经验和方法,一不留神就可能被割韭菜了。当然本文仅针对单纯的数据进行预测,不具备实际操作性,主要用于学习技术。如果想将预测数据用于实际操作,则仅供娱乐,不要太注重结果。

为方便下载和应用,本文涉及的全部代码和数据集放在这里:https://github.com/Stevengz/Stock_predict。


需要用到的库:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import RobustScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout
from datetime import timedelta# 画图中避免中文乱码的设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

数据预处理

因为股票的数值波动比较大,在一整年内,一支股票的价格所经历的最高值和最低值的差距会非常大。

而训练所需数据量要足够多,因此数据的分布会非常不均匀,在这个情况下不利于得出优秀的模型。因此需要对数据进行归一化/标准化,不仅能节约时间,还利于得出更好的结果。

导入数据
df = pd.read_excel('股票数据.xlsx', sheet_name='Sheet1')
# 索引
df.set_index('时间', inplace=True)
# 删除其它数据
df.drop(['开盘', '最高', '最低', '成交量'], axis=1, inplace=True)
# 按比例调整收盘价用于反向转换
close_robust = RobustScaler()
close_robust.fit(df[['收盘']])
# 归一化
scaler_robust = RobustScaler()
df = pd.DataFrame(scaler_robust.fit_transform(df),columns=df.columns,index=df.index)

RobustScaler()缩放数据使极端异常值几乎没有影响,并能提高训练时间和整体模型性能。


数据分割

将数据分成两个序列,适当地格式化数据,一个是已知值,另一个是预测值,当然预测值是空的。

先设置一个函数:

def split_series(seq, in_num, out_num):X, y = [], []for i in range(len(seq)):# 查找当前序列的结尾end = i + in_numo_end = end + out_num# 超出长度则跳出循环if o_end > len(seq):break# x 过去的价格和指标,y 未来的价格seq_x, seq_y = seq[i:end, :], seq[end:o_end, 0]X.append(seq_x)y.append(seq_y)return np.array(X), np.array(y)

通过这个函数,就可以随意更改序列的长度。

例如使用过去100天的值来预测未来15天的价格, split_sequence()函数会将数据格式转化为适当的 X 和 y 变量,其中 X 包含过去100天的收盘价和指标,y 包含接下来15天的收盘价。

代码如下:

# 过去天数
real_day = 100
# 预测的天数
predict_day = 15
# 特征
shape = df.shape[1]
# 将数据分成适当的顺序
X, y = split_series(df.to_numpy(), real_day, predict_day)

模型构建

这里使用 LSTM(长短时记忆网络)进行预测,相比一般的神经网络来说,它能够处理序列变化的数据,且解决了长序列训练过程中的梯度消失和梯度爆炸问题。

定义了两个隐藏层:

# 实例化模型
model = Sequential()
# 输入层
model.add(LSTM(90,activation="tanh",return_sequences=True,input_shape=(real_day, shape)))
# 隐藏层
model.add(LSTM(30, activation="tanh", return_sequences=True))
model.add(LSTM(60, activation="tanh"))
# 输出层
model.add(Dense(predict_day))
# 模型汇总
model.summary()
# 使用选定的规范编译数据
model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])
# 适配与训练
res = model.fit(X, y, epochs=50, batch_size=128, validation_split=0.1)

进行预测

接下来就是带入数据进行预测

这里需要将数据的维度进行变化,增加一个维度,形如(samples,timesteps,input_dim)的3D张量,这三部分的解释:假如我们输入有10个句子,每个句子都由5个单词组成,而每个单词用64维的词向量表示。那么 samples=10,timesteps=5,input_dim=64。

因此需要增加一个 samples,数据不是太多,因此设定为 1 批就行了,下面第一行代码的 reshape 就是将数据划分。

# 进行预测
y_pre = model.predict(np.array(df.tail(real_day)).reshape(1, real_day, shape))
# 预测值转回原始格式
y_pre = close_robust.inverse_transform(y_pre)[0]
# 创建预测价格
preds = pd.DataFrame(y_pre,index=pd.date_range(start=df.index[-1] +timedelta(days=1),periods=len(y_pre),freq="B"),columns=[df.columns[0]])
# 实际值转为原始价格
actual_data = pd.DataFrame(close_robust.inverse_transform(df[["收盘"]].tail(real_day)),index=df.收盘.tail(real_day).index,columns=[df.columns[0]]).append(preds.head(1))

画图

将真实值和预测值用不同颜色表示:

#绘图
plt.figure(figsize=(16, 6))
plt.plot(actual_data, label="真实值")
plt.plot(preds, label="预测值")
plt.ylabel("价格")
plt.xlabel("时间")
plt.title(f"未来 {len(y_pre)} 天")
plt.legend()
plt.show()

结果:

Keras预测股票走势相关推荐

  1. python 预测算法_通过机器学习的线性回归算法预测股票走势(用Python实现)

    本文转自博客园,作者为hsm_computer 原文链接:https://www.cnblogs.com/JavaArchitect/p/11717998.html在笔者的新书里,将通过股票案例讲述P ...

  2. Python预测股票走势

    最新代码:股票预测配套代码(jupyter版)-机器学习文档类资源-CSDN下载 视频:基于python进行股票趋势预测_哔哩哔哩_bilibili Python的功能可谓相当强大,在很多行业具有相当 ...

  3. 深度学习之利用卷积神经网络预测股票走势

    卷积神经网络项目是我在华泰实习的过程中做的一个项目,主要是用卷积神经网络来预测股票的走势,现在对项目做一个总结. 报告详情: [华泰金工林晓明团队]人工智能选股之卷积神经网络--华泰人工智能系列之十五 ...

  4. python计算股票趋势_通过机器学习的线性回归算法预测股票走势(用Python实现)...

    1 波士顿房价数据分析 安装好Python的Sklearn库后,在安装包下的路径中就能看到描述波士顿房价的csv文件,具体路径是"python安装路径\Lib\site-packages\s ...

  5. 通过机器学习的线性回归算法预测股票走势(用Python实现)

    在本人的新书里,将通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得.这里给出以线性回归算法预测股票的案例,以此讲述通过Python的sklearn ...

  6. pytorch - 深度学习之 - LSTM预测股票走势

    本次数据集采用的是沪深300指数数据,选取每天的最高价格.使用LSTM模型来捕捉最高价格的时序信息,通过训练模型,使之学会使用前n天的数据,来预测当天的数据. 本次数据集可使用 tushare来下载. ...

  7. 【Keras】使用LSTM预测股票走势

    长短期记忆(LSTM) LSTM是一种循环神经网络(RNN),可学习时间步长序列和数据之间的长期依赖关系,与CNN不同,LSTM可以记住预测之间的网络状态. LSTM适用于序列和时序数据分类,此时必须 ...

  8. 【手把手教你基于Keras的AutoEncoder模型拟合预测股票走势】

    基于Keras的MLP_AutoEncoder模型 什么是AutoEncoder 上代码演示 MLP_AutoEncoder核心代码 模型预测代码 效果如何呢? 结语 什么是AutoEncoder 举 ...

  9. python 时间序列预测 币价_python时间序列预测股票走势

    提示:这只是个训练模型,技术不具备实际意义,入市需谨慎. 首先调用tushare包 import tushare as ts import pandas as pd import matplotlib ...

最新文章

  1. SKU表管理之查询获取sku表列表数据
  2. Mongodb 副本集+分片集群搭建
  3. Vxworks信号量分析
  4. dev treeview控件_在winform中怎样实现好看的treeview样式
  5. linux环境下配置虚拟主机域名,Linux下三种虚拟主机的配置方法
  6. mybatis简单案例源码详细【注释全面】——实体层(Role.java)
  7. vim 删除,复制和粘贴
  8. Linux系统性能相关知识学习
  9. php正则获取html中所有的src,php正则提取html图片(img)src地址与任意属性
  10. (十七)用JAVA编写MP3解码器——解码Layer1
  11. 聚类(5)-- Spectral clustering
  12. Kali下的钓鱼工具setoolkit和社工字典工具Cupp
  13. ios、android、h5、小程序等安卓苹果平台终端兼容问题
  14. 关于Bluefish
  15. 永久代,方法区 和 元空间之间的关系
  16. c++ 的绝对值函数
  17. mysql常用知识点
  18. Android拍照,照片会自己旋转
  19. python实现批量变更阿里云DNS解析记录状态
  20. 1162开放英语4 (2)

热门文章

  1. 程序设计类实验辅助c语言,程序设计基础与实验
  2. Infortrend存储性能稳定,吸引南通市智慧交通监控大力采购
  3. 前置++与后置++的不同
  4. 2008最火爆的十大网络流行语:
  5. 你是我最想要的朋友——《天高地厚》
  6. python修炼之pip基本命令
  7. 高中数学知识点;二次函数与幂函数(高考备考)
  8. java 接口,接口的特性,接口实现多态,面向接口编程
  9. 初级Java学习笔记总结
  10. python量化交易:筹码分布(4)_计算方法_依据成交明细及及换手率估算