ID:399899
注: 这里使用的数据源是Tushare
使用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,)
步骤 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()
评价指标:
MSE: tf.Tensor(25.45738, shape=(), dtype=float32)
MAE: tf.Tensor(5.0175276, shape=(), dtype=float32)
MAPE: tf.Tensor(93.39253, shape=(), dtype=float32)
从评价指标可以看出整体误差较小,可以预测效果图上来看,预测情况与实际情况的走势基本一致,但是价格有所偏差,这是值得提升的地方。
整体来说,LSTM模型股票价格预测有一定效果,对证券投资市场具有一定的指导作用。