LSTM多输入时间序列预测之股价预测

时间序列预测问题

根据输入与输出数量的关系,时间序列预测文题可大致分为:一对一(即单输入单输出),多对一(多输入单输出),多对多(多输入多输出)。

查验数据

本文面对的任务为多对一,即利用股价的相关数据,预测某股开盘价,以交通银行数据为例,数据源自tushare:

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

ts.set_token('my token')#个人序列号
pro = ts.pro_api()
data = pro.daily(ts_code='601328.SH')

data如下
原数据
前两列无用,舍弃。查看数据趋势:

cols = list(data1.columns)
fig = plt.figure(figsize=(16,6))
for i in range(len(cols)):
    ax = fig.add_subplot(2,5,i+1)
    ax.plot(data1.iloc[:,i])
    ax.set_title(cols[i])

显示各列趋势为
columns

改造数据

接下来改造数据,利用一段时间的数据预测下一时间的值,时间窗口自拟,需要保持一个恰当的长度,本文选择10个点。由于目标为开盘价(open),故第一列为目标,其余列为特征。设计改造函数如下:

def load_data_list_head(data, n_prev = 10): 
	docX, docY = [], []
	for i in range(len(data)-n_prev):
		docX.append(data[i:i+n_prev,1:])
		docY.append(data[i+n_prev,0])
	return np.array(docX), np.array(docY)

为取得较为理想结果,对数据进行归一化,注意量纲差异巨大,所以考虑分开做归一化:

import sklearn
from sklearn.preprocessing import MinMaxScaler as MMS
data = data1.values

scaler_price = MMS(feature_range=(0,1)).fit(data[:,:-4])
scaler_change = MMS(feature_range=(0,1)).fit(data[:,-4].reshape(-1,1))
scaler_pct_change = MMS(feature_range=(0,1)).fit(data[:,-3].reshape(-1,1))
scaler_vol_amount = MMS(feature_range=(0,1)).fit(data[:,-2:])

data_price = scaler_price.transform(data[:,:-4])
data_change = scaler_change.transform(data[:,-4].reshape(-1,1))
data_pct_change = scaler_pct_change.transform(data[:,-3].reshape(-1,1))
data_vol_amount = scaler_vol_amount.transform(data[:,-2:])

指定缩放器scaler后留存,用于生成预测值后反变换回原始量纲。重新捏合数据,指定目标、特征以及划分训练集和测试集:

feature_data = np.c_[
	data_price[:,1:],
	data_change,
	data_pct_change,
	data_vol_amount]
target_data = data_price[:,0]
full_data = np.c_[target_data,feature_data]
n_prev = 10#窗口长度10
xx,yy = load_data_list_head(full_data,n_prev)#改造数据
test_size = .25#测试集比例
test_length = round(xx.shape[0]*test_size)#测试集长度
x_train, x_test = xx[:-test_length], xx[-test_length:]
y_train, y_test = yy[:-test_length], yy[-test_length:]

使用TensorFlow中的LSTM

使用tensorflow建模,堆叠模式:

import tensorflow
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dropout, Dense
def build_model():
    model = Sequential()# 序列堆叠  
    model.add(# LSTM层
        LSTM(
            32,
            activation='relu',
            input_shape=(x_train.shape[1],x_train.shape[2]))
        )  
    model.add(Dense(1))# 全连接层
    model.summary()# 查看模型
    return model
model = build_model()
# 损失函数 mse,优化器 adam
model.compile(loss="mse", optimizer="adam")# 编译模型
# 模型训练
history = model.fit(
    x_train,
    y_train,
    batch_size=16,
    epochs=32,
    validation_split=0.25
)

查看训练过程MSE变化:

plt.figure(figsize=(8,4))
plt.plot(history.history['loss'],label='train loss')
plt.plot(history.history['val_loss'],label='validation loss')
plt.legend()

training
在早期就已收敛,查看预测结果:

y_predict = model.predict(x_test)
plt.figure(figsize=(8,4))
plt.plot(y_predict,label='prediction')
plt.plot(y_test,label='original')
plt.legend()

prediction

返回原始量纲

差异很小,性质上而言预测成功,但需要返回到原始量纲检验:

inv_y_test = scaler_price.inverse_transform(
    np.tile(
        np.r_[y_train,y_test],(5,1)
        ).T
    )[-y_test.shape[0]:,0]
inv_y_predict = scaler_price.inverse_transform(
    np.tile(
        np.r_[y_train,y_predict[:,0]],(5,1)
        ).T
    )[-y_predict.shape[0]:,0]

plt.figure(figsize=(8,4))
plt.plot(inv_y_predict,label='prediction')
plt.plot(inv_y_test,label='original')
plt.title('100 last points')
plt.legend()

在这里插入图片描述
查看最后100个点做最后检验:

plt.figure(figsize=(8,4))
plt.plot(inv_y_predict[-100:],label='prediction')
plt.plot(inv_y_test[-100:],label='original')
plt.title('100 last points')
plt.legend()

在这里插入图片描述
本文关于窗口长度、训练参数、模型参数等未作细致调整,后续可以依托optuna等框架作进一步优化。仅为实验,慎重参考。

  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
LSTM是一种循环神经网络模型,常用于序列数据的预测任务。时序预测多对一是指通过前面的多个时间步来预测单个时间步的输出。下面将简要介绍LSTM时序预测多对一的过程。 首先,我们需要准备用于训练LSTM模型的数据集。对于时序预测多对一任务,数据集应包含多个时间步作为输入序列和对应的单个时间步作为输出。每个时间步的输入可以是多个特征的组合,比如历史若干个时间步的数值或者其他数据。输出则是要预测的目标值。 接下来,我们可以设计LSTM模型的架构。LSTM模型由多个LSTM单元组成,每个单元通过记忆单元、输入门、遗忘门和输出门来控制信息的流动。通过定义适当的LSTM单元个数、隐藏层神经元数量和激活函数,我们可以构建一个适合该任务的LSTM模型。对于时序预测多对一任务,最后一个LSTM单元的输出可以通过连接一个全连接层来获得最终的预测结果。 接下来,我们使用数据集来训练LSTM模型。在训练过程中,我们通过反向传播算法调整模型的权重和偏差,以最小化预测结果与实际输出之间的误差。可以使用梯度下降等优化算法来实现此目标。 训练完成后,我们可以使用已训练好的LSTM模型来进行预测。给定历史若干个时间步的输入序列,我们可以通过前向传播算法得到输出序列的预测值。这些预测值可以与实际的目标值进行比较,从而评估模型的预测准确性。 总的来说,LSTM时序预测多对一任务需要准备数据集,设计模型架构,训练模型并进行预测。这种方法可以应用于各种时序数据的预测任务,如股票价格预测、天气预测等。需要注意的是,模型的性能可能受到多个因素的影响,例如数据质量、模型参数的选择等。因此,在实践中需要进行适当的调优和验证工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fanshaoliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值