赞
踩
这是我的第298篇原创文章。
单站点多变量单步预测问题----基于TCN-LSTM实现多变量时间序列预测股票价格。
注:TCN+LSTM是一种将卷积神经网络(CNN)和LSTM结合起来的模型。时间序列卷积(Temporal Convolutional Network, TCN)通过一系列卷积层处理数据,每个层都能捕捉到不同时间范围内的模式。LSTM作为多元预测机制和单元预测机制的优点是可以处理序列数据中的长期依赖关系,从而可以捕捉到数据中的复杂模式和规律。
- df=pd.read_csv("data.csv", parse_dates=["Date"], index_col=[0])
- print(df.shape)
- print(df.head())
- fea_num = len(df.columns)
df:
- # 拆分数据集为训练集和测试集
- test_split=round(len(df)*0.20)
- df_for_training=df[:-test_split]
- df_for_testing=df[-test_split:]
-
- # 绘制训练集和测试集的折线图
- plt.figure(figsize=(10, 6))
- plt.plot(train_data, label='Training Data')
- plt.plot(test_data, label='Testing Data')
- plt.xlabel('Year')
- plt.ylabel('Passenger Count')
- plt.title('International Airline Passengers - Training and Testing Data')
- plt.legend()
- plt.show()
共5203条数据,8:2划分:训练集4162,测试集1041。
训练集和测试集:
- # 将数据归一化到 0~1 范围
- scaler = MinMaxScaler(feature_range=(0,1))
- df_for_training_scaled = scaler.fit_transform(df_for_training)
- df_for_testing_scaled=scaler.transform(df_for_testing)
- def createXY(dataset,n_past):
- pass
-
- window_size = 30
- trainX,trainY=createXY(df_for_training_scaled,window_size)
- testX,testY=createXY(df_for_testing_scaled,window_size)
-
- # 将数据集转换为 LSTM 模型所需的形状(样本数,时间步长,特征数)
- trainX = np.reshape(trainX, (trainX.shape[0], window_size, fea_num))
- testX = np.reshape(testX, (testX.shape[0], window_size, fea_num))
-
- print("trainX Shape-- ",trainX.shape)
- print("trainY Shape-- ",trainY.shape)
- print("testX Shape-- ",testX.shape)
- print("testY Shape-- ",testY.shape)
滑动窗口设置为30:
- # TCN
- my_model = Sequential()
- my_model.add(Input(shape=(window_size, fea_num)))
- my_model.add(TCN(...))
- # LSTM
- my_model.add(LSTM(100, return_sequences=True, input_shape=(trainX.shape[1:], 1)))
- my_model.add(LSTM(100, return_sequences=False))
- my_model.add(Dense(25))
- my_model.add(Dense(1))
- my_model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
- my_model.summary()
- my_model.fit(trainX, trainY)
- prediction_test=my_model.predict(testX)
- prediction_train=my_model.predict(trainX)
- plt.plot(df_for_training.index[window_size:,], original_train, color = 'red', label = '真实值')
- plt.plot(df_for_training.index[window_size:,], pred_train, color = 'blue', label = '预测值')
- plt.title('Stock Price Prediction')
- plt.xlabel('Time')
- plt.xticks(rotation=45)
- plt.ylabel('Stock Price')
- plt.legend()
- plt.show()
训练集真实值与预测值:
- plt.plot(df_for_testing.index[window_size:,], original_test, color = 'red', label = '真实值')
- plt.plot(df_for_testing.index[window_size:,], pred_test, color = 'blue', label = '预测值')
- plt.title('Stock Price Prediction')
- plt.xlabel('Time')
- plt.xticks(rotation=45)
- plt.ylabel('Stock Price')
- plt.legend()
- plt.show()
测试集真实值与预测值:
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。