LSTM股票价格预测

LSTM股票价格预测,第1张

ID:399899
注: 这里使用的数据源是Tushare

LSTM股票价格预测实验 实验介绍

使用LSTM进行股票价格的预测,用到的框架主要包括:TensorFlow2.0,主要用于深度学习算法的构建,本实验以Tushare平台的601398股票历史数据为基础,基于Keras深度学习库股票价格进行预测。

算法原理:

这里就不对模型原理进行介绍了 这里引用一下别人的 需要的朋友去看一下https://juejin.cn/post/6973082167970627620

搭建思路:

使用LSTM模型对股票数据的’open’, ‘high’, ‘low’, ‘close’, ‘pre_close’, ‘change’, ‘pct_chg’, ‘vol’, 'amount’九个特征进行训练预测收盘价。

准备工作

环境准备:python3.7;Tensorflow**;Keras**

数据准备:https://www.tushare.pro/ ;原始数据取得是由tushare平台提供的股票日线行情历史数据。

实验步骤 导入实验环境

导入相应的模块

import pandas as pd
import tensorflow as tf
import numpy as np
import tushare as ts
import matplotlib.pyplot as plt

#解决中文显示问题

plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体

plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
导入实验数据集

步骤 1 获取数据


ts.set_token('这里填写自己的token码在个人主页可以获取')
pro = ts.pro_api()
data = pr.daily(ts_code='601398.SH')

data = data.iloc[::-1,]

data1 = data.copy(deep=True)

tushare主页:https://tushare.pro/document/2

步骤 2 检测是否有缺失值

data.isna().any()

输出结果:

ts_code False

trade_date False

open False

high False

low False

close False

pre_close False

change False

pct_chg False

vol False

amount False

步骤 3 异常值检测

data1 = data

# 异常值处理  

mean1 = data1['vol'].quantile(q=0.25)#下四分位差

mean2 = data1['vol'].quantile(q=0.75)#上四分位差

mean3 = mean2-mean1#中位差

topnum21 = mean2+1.5*mean3

bottomnum21 = mean2-1.5*mean3

# print(data1.head(10))

print("正常值的范围:",topnum21,bottomnum21)

print("是否存在超出正常范围的值:",any(data1['vol']>topnum21))

print("是否存在小于正常范围的值:",any(data1['vol']<bottomnum21))

输出结果:

正常值的范围: 4625919.582500001 -113825.70250000013

是否存在超出正常范围的值: True

是否存在小于正常范围的值: False

检测存在超出正常范围的值,对该部分值进行替换

replace_value=data1['vol'][data1['vol']<topnum21].max()

data1.loc[data1['vol']>topnum21,'vol']=replace_value
mean1 = data1['amount'].quantile(q=0.25)#下四分位差

mean2 = data1['amount'].quantile(q=0.75)#上四分位差

mean3 = mean2-mean1#中位差

topnum21 = mean2+1.5*mean3

bottomnum21 = mean2-1.5*mean3

# print(data1.head(10))

print("正常值的范围:",topnum21,bottomnum21)

print("是否存在超出正常范围的值:",any(data1['amount']>topnum21))

print("是否存在小于正常范围的值:",any(data1['amount']<bottomnum21))

输出结果:

正常值的范围: 2558165.1642500004 -167064.92425000016

是否存在超出正常范围的值: True

是否存在小于正常范围的值: False

检测存在超出正常范围的值,对该部分值进行替换

replace_value=data1['amount'][data1['amount']<topnum21].max()

data1.loc[data1['amount']>topnum21,'amount']=replace_value

步骤 4 归一化处理

这里采用的最大最小归一化 归一化可以使模型得到更好的鲁棒性

data = data.iloc[:,2:]

data_max = data.max()

data_min = data.min()

data = (data-data_min)/(data_max-data_min)

步骤 5 数据划分并查看数据集信息

dataset_st = np.array(data)

 

def data_set(dataset, lookback):  # 创建时间序列数据样本

    dataX, dataY = [], []

    for i in range(len(dataset)-lookback):

        a = dataset[i:(i+lookback)]

        dataX.append(a)

        dataY.append(dataset[i+lookback][3])

    return np.array(dataX), np.array(dataY)

 

#划分训练集和测试集

train_size = int(len(dataset_st)*0.7)

test_size = len(dataset_st)-train_size

train, test = dataset_st[0:train_size], dataset_st[train_size:len(dataset_st)]

print(len(train))

print(len(test))

 

#根据划分的训练集测试集生成需要的时间序列样本数据

lookback = 60

trainX, trainY = data_set(train, lookback)

testX, testY = data_set(test, lookback)

print('trianX:,trianY', trainX.shape, trainY.shape)

输出结果:

trianX:,trianY (2560, 60, 7) (2560,)

LSTM回归预测 建模

步骤 1 初始化神经网络

数据集准备完成,接下来我们就需要构建训练模型,我们首先需要建立初始化的神经网络。

model=tf.keras.Sequential([tf.keras.layers.LSTM(120,input_shape=(trainX.shape[1],

trainX.shape[2]),return_sequences=True),

    tf.keras.layers.Dropout(0.2),

    tf.keras.layers.LSTM(60),

    tf.keras.layers.Dropout(0.2),

    tf.keras.layers.Dense(30,activation='relu'),

    tf.keras.layers.Dense(1)

    ])

步骤 2 定义学习率更新规则

设置模型的学习率参数。

#给出学习率(步长)进行更新

model.compile(

    optimizer=tf.keras.optimizers.Adam(0.001),

    loss='mean_squared_error',  # 损失函数用交叉熵

    metrics=["mse"]

)

步骤 3 构建模型训练

神经网络的模型参数更新是一个迭代的过程,所以我们可以将模型训练的过程定义成一个函数,从而进行模型的训练。

history = model.fit(trainX, trainY,

                    batch_size=64, epochs=25, validation_data=(testX, testY),

                    validation_freq=1)

步骤 4 构建绘图函数

绘制train loss与epoch的关系图,这样我们就可以查看模型训练的每一步损失值。

def plot_learning_curves(history):

    pd.DataFrame(history.history).plot(figsize=(10,6))

    plt.grid(True)

#     plt.gca().set_ylim(0,)

    plt.title('训练情况')

    plt.savefig('./训练情况.jpg')

plt.show()
## **3实验结果及分析******

### **3** **.1 实验结果******

评价指标:

MSE: tf.Tensor(25.45738, shape=(), dtype=float32)

MAE: tf.Tensor(5.0175276, shape=(), dtype=float32)

MAPE: tf.Tensor(93.39253, shape=(), dtype=float32)
![在这里插入图片描述](http://www.kaotop.com/file/tupian/20220509/a9dfb111dc9146a3b49369a5a6226a92.png)
![在这里插入图片描述](http://www.kaotop.com/file/tupian/20220509/c99ce8b6792e41e6959dba58bd30d09a.png)




### **实验** **分析**

从评价指标可以看出整体误差较小,可以预测效果图上来看,预测情况与实际情况的走势基本一致,但是价格有所偏差,这是值得提升的地方。

整体来说,LSTM模型股票价格预测有一定效果,对证券投资市场具有一定的指导作用。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/874991.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存