pytorch-20_1 LSTM在股價數據集上的預測實戰

LSTM在股價數據集上的預測實戰

  • 使用完整的JPX賽題數據,并向大家提供完整的lstm流程。

導包

import numpy as np #數據處理
import pandas as pd #數據處理
import matplotlib as mlp
import matplotlib.pyplot as plt #繪圖
from sklearn.preprocessing import MinMaxScaler #·數據預處理
from sklearn.metrics import mean_squared_error
import torch 
import torch.nn as nn #導入pytorch中的基本類
from torch.autograd import Variable
from torch.utils.data import DataLoader, TensorDataset
import torch.optim as optim
import torch.utils.data as data
# typing 模塊提供了一些類型,輔助函數中的參數類型定義
from typing import Union,List,Tuple,Iterable
from sklearn.preprocessing import LabelEncoder,MinMaxScaler
from decimal import ROUND_HALF_UP, Decimal

一、數據加載與處理

# 一、數據加載與處理
# 1、查看數據集信息
stock= pd.read_csv('stock_prices.csv')          # (2332531,12) 
stock_list = pd.read_csv('stock_list.csv')      # (4417,16)stock["SecuritiesCode"].unique().__len__()      #2000支股票# 2、為了效率我們抽取其中的10支股票
selected_codes = stock['SecuritiesCode'].drop_duplicates().sample(n=10)
stock = stock[stock['SecuritiesCode'].isin(selected_codes)]     # (9833,12)
stock["SecuritiesCode"].unique().__len__()      #只有10支股票了stock.isnull().sum() #查看缺失值# 3、預處理數據集
#將Target名字修改為Sharpe Ratio
stock.rename(columns={'Target': 'Sharpe Ratio'}, inplace=True)#將Close列添加到最后
close_col = stock.pop('Close')
stock.loc[:,'Close'] = close_col#填補Dividend缺失值、刪除具有缺失值的行
stock["ExpectedDividend"] = stock["ExpectedDividend"].fillna(0)
stock.dropna(inplace=True)#恢復索引
stock.index = range(stock.shape[0])

二、數據分割與數據重組

# 二、數據分割與數據重組
# 1、數據分割
train_size = int(len(stock) * 0.67)
test_size = len(stock) - train_size
train, test = stock[:train_size], stock[train_size:] # train (6580,12) test(3242,12)# 2、帶標簽滑窗
def create_multivariate_dataset_2(dataset, window_size, pred_len):  # """將多變量時間序列轉變為能夠用于訓練和預測的數據【帶標簽的滑窗】參數:dataset: DataFrame,其中包含特征和標簽,特征從索引3開始,最后一列是標簽window_size: 滑窗的窗口大小pred_len:多步預測的預測范圍/預測步長"""X, y, y_indices = [], [], []for i in range(len(dataset) - window_size - pred_len + 1):                      # (len-ws-pl+1) --> (6580-30-5+1) = 6546# 選取從第4列到最后一列的特征和標簽feature_and_label = dataset.iloc[i:i + window_size, 3:].values              # (ws,fs_la) --> (30,9)# 下一個時間點的標簽作為目標target = dataset.iloc[(i + window_size):(i + window_size + pred_len), -1]   # pred_len --> 5# 記錄本窗口中要預測的標簽的時間點target_indices = list(range(i + window_size, i + window_size + pred_len))   # pl*(len-ws-pl+1) --> 5*6546 = 32730 X.append(feature_and_label)y.append(target)#將每個標簽的索引添加到y_indices列表中y_indices.extend(target_indices)X = torch.FloatTensor(np.array(X, dtype=np.float32))y = torch.FloatTensor(np.array(y, dtype=np.float32))return X, y, y_indices# 3、數據重組
window_size = 30        #窗口大小
pred_len = 5            #多步預測的步數X_train_2, y_train_2, y_train_indices = create_multivariate_dataset_2(train, window_size, pred_len)     # x(6546,30,9) y(6546,5) (32730,)
X_test_2, y_test_2, y_test_indices = create_multivariate_dataset_2(test, window_size, pred_len)         # x(3208,30,9) y(3208,5) (16040,)

三、網絡架構與參數設置

# 三、網絡架構與參數設置
# 1、定義架構
class MyLSTM(nn.Module):def __init__(self,input_dim, seq_length, output_size, hidden_size, num_layers):super().__init__()self.lstm = nn.LSTM(input_size=input_dim, hidden_size=hidden_size, num_layers=num_layers, batch_first=True)self.linear = nn.Linear(hidden_size, output_size)def forward(self, x):x, _ = self.lstm(x)#現在我要的是最后一個時間步,而不是全部時間步了x = self.linear(x[:,-1,:])return x# 2、參數設置
input_size = 9          #輸入特征的維度
hidden_size = 20        #LSTM隱藏狀態的維度
n_epochs = 2000         #迭代epoch
learning_rate = 0.001   #學習率
num_layers = 1          #隱藏層的層數
output_size = 5#設置GPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)# 加載數據,將數據分批次 
loader = data.DataLoader(data.TensorDataset(X_train_2, y_train_2), shuffle=True, batch_size=8) # 3、實例化模型
model = MyLSTM(input_size, window_size, pred_len,hidden_size, num_layers).to(device)
optimizer = optim.Adam(model.parameters(),lr=learning_rate) #定義優化器
loss_fn = nn.MSELoss() #定義損失函數
loader = data.DataLoader(data.TensorDataset(X_train_2, y_train_2)#每個表單內部是保持時間順序的即可,表單與表單之間可以shuffle, shuffle=True, batch_size=8) #將數據分批次

四、實際訓練流程

# 四、實際訓練流程
# 初始化早停參數
early_stopping_patience = 3  # 設置容忍的epoch數,即在這么多epoch后如果沒有改進就停止
early_stopping_counter = 0  # 用于跟蹤沒有改進的epoch數
best_train_rmse = float('inf')  # 初始化最佳的訓練RMSEtrain_losses = []
test_losses = []for epoch in range(n_epochs):model.train()for X_batch, y_batch in loader:y_pred = model(X_batch.to(device))loss = loss_fn(y_pred, y_batch.to(device))optimizer.zero_grad()loss.backward()optimizer.step()#驗證與打印if epoch % 10 == 0:model.eval()with torch.no_grad():y_pred = model(X_train_2.to(device)).cpu()train_rmse = np.sqrt(loss_fn(y_pred, y_train_2))y_pred = model(X_test_2.to(device)).cpu()test_rmse = np.sqrt(loss_fn(y_pred, y_test_2))print("Epoch %d: train RMSE %.4f, test RMSE %.4f" % (epoch, train_rmse, test_rmse))# 將當前epoch的損失添加到列表中train_losses.append(train_rmse)test_losses.append(test_rmse)# 早停檢查if  train_rmse < best_train_rmse:best_train_rmse = train_rmseearly_stopping_counter = 0  # 重置計數器else:early_stopping_counter += 1  # 增加計數器if early_stopping_counter >= early_stopping_patience:print(f"Early stopping triggered after epoch {epoch}. Training RMSE did not decrease for {early_stopping_patience} consecutive epochs.")break  # 跳出訓練循環

結果顯示:

Epoch 0: train RMSE 1470.9308, test RMSE 1692.0652
Epoch 5: train RMSE 1415.7896, test RMSE 1639.1147
Epoch 10: train RMSE 1364.8196, test RMSE 1590.2207
......
Epoch 100: train RMSE 654.3458, test RMSE 904.7958
Epoch 105: train RMSE 638.2536, test RMSE 886.3511
Epoch 110: train RMSE 625.7336, test RMSE 870.9800
......
Epoch 200: train RMSE 598.3364, test RMSE 820.4078
Epoch 205: train RMSE 598.3354, test RMSE 820.3406
Epoch 210: train RMSE 598.3349, test RMSE 820.2874
......
Epoch 260: train RMSE 598.3341, test RMSE 820.1312
Epoch 265: train RMSE 598.3341, test RMSE 820.1294
Early stopping triggered after epoch 265. Training RMSE did not decrease for 3 consecutive epochs.

五、可視化結果

# 五、可視化結果
# 1、損失曲線
plt.figure(figsize=(10, 5))
plt.plot(train_losses, label='Train RMSE')
plt.plot(test_losses, label='Test RMSE')
plt.xlabel('Epochs')
plt.ylabel('RMSE')
plt.title('Train and Test RMSE Over Epochs')
plt.legend()
plt.show()

在這里插入圖片描述
結果分析:預測效果不是很好,考慮進行數據預處理和特征工程

【擴展】股票數據的數據預處理與特征工程(后續更新~)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14467.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14467.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14467.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人類交互4 感覺輸入和運動輸出

人類感覺系統概述 人類感覺系統是由多個感覺器官和神經系統組成&#xff0c;負責感知外部世界的各種刺激和信息。人類感覺系統包括以下幾個主要部分&#xff1a; 視覺系統&#xff1a;視覺系統由眼睛、視神經和大腦視覺皮層組成&#xff0c;負責感知光線、顏色和形狀&#xff…

datasheet芯片數據手冊—新手入門學習(二)【8-18】

參考芯片手冊已經上傳&#xff0c;可自行下載 因為芯片參考手冊內容比較多&#xff0c;故再一次介紹本文內容主要講解章節。 目錄 8、內容介紹 命令真值表 9、Command Definitions 10、READ Operations &#xff08;1&#xff09;頁面讀取操作 &#xff08;2&#xff…

YTM32的flash應用答疑-詳解寫保護功能

YTM32的flash應用答疑-詳解寫保護功能 文章目錄 YTM32的flash應用答疑-詳解寫保護功能IntroductionPrincipleOperation & DemonstrationDemo #1 驗證基本的寫保護功能Demo #2 編程CUS_NVR設定EFM_ADDR_PROT初值Demo #3 啟用寫保護后試試塊擦除操作 Conclusion Introduction…

報名倒計時兩周|2024 OpenTiny 開源之夏項目直播解讀回顧

5月16日&#xff0c;OpenTiny 開源社區成功舉辦了以《OpenTiny 開源之夏項目解讀直播》為主題的直播活動。此次直播中&#xff0c;華為云的高級前端工程師曾令卡、華為云的高級前端工程師伍其和與10位開源之夏技術專家攜手組成項目導師團&#xff0c;面向廣大開發者一同深入探討…

Java類和對象(五)—— 抽象類、接口、Object類和內部類

抽象類 在繼承體系下&#xff0c;父類有些方法可能是要被重寫的&#xff0c;如果我們事先就知道某些方法需要重寫的話&#xff0c;我們可以不用在父類里面具體實現這個方法&#xff0c;這時候我們會用到抽象方法&#xff0c;這時候我們會用到關鍵字abstract關鍵字來修飾 publ…

BatBot智慧能源管理平臺,更加有效地管理能源

隨著能源消耗的不斷增加&#xff0c;能源管理已成為全球面臨的重要問題。BatBot智慧能源管理作為一種的能源管理技術&#xff0c;促進企業在用能效率及管理有著巨大的提升。 BatBot智慧能源管理是一種基于人工智能技術的能源管理系統&#xff0c;通過智能分析和優化能源使用&…

【JAVA |再談接口、Object、內部類】Object類中子類重寫,Cloneable 接口、比較器、內部類

??謝謝大家捧場&#xff0c;祝屏幕前的小伙伴們每天都有好運相伴左右&#xff0c;一定要天天開心哦&#xff01;?? &#x1f388;&#x1f388;作者主頁&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ?? 帥哥美女們&#xff0c;我們共同加油&#xff01;一起…

Internet動態路由選擇—RIP與OSPF

剛做完網絡層動態路由選擇的實驗&#xff0c;寫下此篇記錄實驗過程&#xff0c;鞏固學習成果。 參考書目&#xff1a;《計算機網絡》北京理工大學出版社-劉陽老師編 路由選擇可分為兩種策略&#xff1a; - 靜態路由選擇策略 - 動態路由選擇策略 靜態路由即管理員手動配置路由…

Java 商品入庫系統 案例

測試類 package 練習.商品入庫系統;import java.util.ArrayList; import java.util.Scanner; public class Test {public static final int Enrool 1;public static final int Search 2;public static final int Delect 3;public static final int Exit 4;public static…

在docker上部署postgresSQL主從

文章目錄 一、主從規劃二、創建PostgresSQL的Docker鏡像三、主庫部署1、建立pgsql主庫的data地址2、啟動docker鏡像3、docker內操作4、修改配置文件 四、部署從數據庫1、建立psql備庫的data地址2、啟動docker鏡像3、備庫從主庫同步4、檢查是否同步 五、測試主從數據庫 一、主從…

#2495. 滑動窗口 /【模板】單調隊列

題目描述 有一個長為 ( n ) 的序列 ( a )&#xff0c;以及一個大小為 ( k ) 的窗口。現在這個窗口從左邊開始向右滑動&#xff0c;每次滑動一個單位&#xff0c;求出每次滑動后窗口中的最大值和最小值。例如&#xff1a; 數組是 ([1, 3, -1, -3, 5, 3, 6, 7])&#xff0c; ( …

【深度強化學習】關于同一設備上cuda和gpu計算結果不一致問題

文章目錄 問題描述關于seed: 跟原文一致補充:萬能seed 問題結論cpu和gpu差異來源分析浮點數精度的差異補充報錯&#xff1a;Expected all tensors to be on the same device&#xff01;常見運算上的差異累加運算的差異exp運算的差異matmul運算的差異 forward上的差異&#xff…

【LeetCode 隨筆】面試經典 150 題【中等+困難】持續更新中。。。

文章目錄 189. 輪轉數組122. 買賣股票的最佳時機 II55. 跳躍游戲45. 跳躍游戲 II274. H 指數 &#x1f308;你好呀&#xff01;我是 山頂風景獨好 &#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01; &#x1f49d;希望您在這里可以感受到一份輕松…

機器學習云環境搭建

在 https://support.huaweicloud.com/browsertg-obs/obs_03_1003.html 下載對應版本的 OBS Broswer 軟件&#xff0c;如圖&#xff0c;紅框內的為安裝文件&#xff0c;藍色框內的為對應安裝文件的校驗文件&#xff08;無需下載&#xff09; 以 64 位機為例&#xff0c;下載完…

景源暢信電商:抖店需要的成本高嗎?

在數字化時代的浪潮中&#xff0c;短視頻平臺迅速崛起&#xff0c;成為連接用戶與商家的新橋梁。抖音作為其中的佼佼者&#xff0c;不僅改變了人們的娛樂方式&#xff0c;也催生了新型的電商模式——抖店。許多人好奇&#xff0c;入駐這樣一個充滿活力的平臺&#xff0c;需要承…

618知識狂歡,挑本好書,點亮智慧生活!

618精選編程書單&#xff1a;提升你的代碼力 一年一度的618又到啦&#xff01;今年的618就不要亂買啦&#xff0c;衣服買多了會被淘汰&#xff0c;電子產品買多了會過時&#xff0c;零食買多了會增肥&#xff0c;最后怎么看都不劃算。可是如果你購買知識&#xff0c;堅持閱讀&a…

第N2周:Embeddingbag與Embedding詳解

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制&#x1f680; 文章來源&#xff1a;K同學的學習圈子 目錄 什么是詞嵌入&#xff1f; Embedding與EmbeddingBag詳解 Embedding Embeddi…

代碼隨想錄算法訓練營第十七天|LeetCode110 平衡二叉樹、LeetCode257 二叉樹的所有路徑

題1&#xff1a; 指路&#xff1a;LeetCode110 平衡二叉樹 思路與代碼&#xff1a; 左右子樹的高度差小于等于1。對于這個題&#xff0c;遞歸比迭代方便太多&#xff0c;我也想過迭代&#xff0c;但是我沒有寫出來&#xff0c;大家可以自己試一下。遞歸代碼如下&#xff1a;…

如何為ChatGPT編寫有效的提示詞:軟件開發者的指南

作為一名軟件開發者&#xff0c;特別是使用Vue進行開發的開發者&#xff0c;與ChatGPT等AI助手高效互動&#xff0c;可以極大地提升你的開發效率。本文將深入探討如何編寫有效的提示詞&#xff0c;以便從ChatGPT中獲取有用的信息和幫助。 1. 明確目標 在編寫提示詞之前&#…