基于LSTM的股票价格预测
生活随笔
收集整理的這篇文章主要介紹了
基于LSTM的股票价格预测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言?
本文通過LSTM來對股票未來價格進行預測,并介紹一下數據獲取、處理,pytorch的模型搭建和訓練等等。
數據獲取
這里我使用tushare的接口來獲取平安銀行(000001.SZ)股票的歷史10年的數據
import tushare as tspro = ts.pro_api('your token') df = pro.daily(ts_code='000001.SZ', start_date='20130711', end_date='20220711')由于本文只用到股票的開盤價、收盤價、最高價、最低價,所以只用到了一個接口,tushare除了這個接口以外還有許多數據接口,感興趣的讀者可以去Tushare大數據社區查詢。
用mplfinance庫繪制一下獲取的數據
import pandas as pd import mplfinance as mpf df.index=pd.to_datetime(df.trade_date)#索引轉為日期 df = df.iloc[::-1]#由于獲取的數據是倒序的,需要將其調整為正序 mpf.plot(df[-50:],type='candle')#繪制最近50天的數據繪制結果如下
?數據處理
我們需要使用歷史200天的數據來預測未來7天的數據,所以接下來需要對獲取到的數據進行處理
dataX=[]#屬性 dataY=[]#標簽 k=0 tempX=[]#儲存某個歷史200天數據 tempY=[]#儲存某個未來7天數據 for index, rows in df.iterrows():if k<200:k+=1tempX.append([rows['open'],rows['close'],rows['high'],rows['low']])continueif k<207:k+=1tempY.append([rows['open'],rows['close'],rows['high'],rows['low']])continuedataX.append(tempX[:])dataY.append(tempY[:])tempX=tempX[1:]+tempY[:1]tempY=tempY[1:]tempY.append([rows['open'],rows['close'],rows['high'],rows['low']]) dataX.append(tempX[:])#加上最后一項 dataY.append(tempY[:])#加上最后一項這樣我們就得到兩個一一對應的列表,dataX對應某個時間節點的歷史200天數據,dataY則是該時間節點的未來7天數據,接下來將他們劃分為訓練集和測試集,并轉化為DataLoader
import torch import torch.utils.data as DatadataX=torch.tensor(dataX)#列表轉Tensor dataY=torch.tensor(dataY)#列表轉Tensordataset=Data.TensorDataset(dataX,dataY) train_size=int(0.8*len(dataset)) test_size=len(dataset)-train_size train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, test_size])#以8:2比例劃分訓練集和測試集train_loader = Data.DataLoader(dataset=train_dataset,batch_size=64,shuffle=True) test_loader = Data.DataLoader(dataset=test_dataset,batch_size=64,shuffle=True)模型搭建
我們使用torch.nn中的LSTM來作為預測模型
LSTM參數介紹如下
- input_size:輸入x的特征數量
- hidden_size:隱藏層h的特征數量
- num_layers:隱藏層層數
- bias:是否使用偏置,默認為:True
- batch_first:若為True,則輸入形狀為(batch, seq, feature),否則為(seq, batch,feature),默認為False
- dropout:?如果非零,則在除最后一層之外的每個LSTM層的輸出上引入Dropout層,概率等于dropout
- bidirectional:若為True,則表示該LSTM為雙向的
- proj_size:若大于0,將使用具有相應大小的投影的LSTM,默認為0
搭建的模型如下
from torch.nn import LSTM,Module,Linear class MyModel(Module):def __init__(self):super(MyModel,self).__init__()self.lstm=LSTM(input_size=4,hidden_size=4,num_layers=2,batch_first=True)self.linear=Linear(800,28)#將結果映射到7天的數據def forward(self,x):return self.linear(self.lstm(x)[0].reshape(-1,800))模型訓練
使用均方誤差作為損失函數,Adam為優化器訓練200輪
import torch.nn.functional as F model=MyModel() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) lossList=[]#記錄訓練loss lossListTest=[]#記錄測試loss for epoch in range(200):loss_nowEpoch=[]model.train()for step, (batch_x, batch_y) in enumerate(train_loader):out=model(batch_x)#模型輸入Loss = F.mse_loss(out,batch_y.view(-1,28))#loss計算,將batch_y從(64,7,4)變形為(64,28)optimizer.zero_grad()#當前batch的梯度不會再用到,所以清除梯度Loss.backward()#反向傳播計算梯度optimizer.step()#更新參數loss_nowEpoch.append(Loss.item())breaklossList.append(sum(loss_nowEpoch)/len(loss_nowEpoch))loss_nowEpochTest = []model.eval()for step, (batch_x, batch_y) in enumerate(test_loader):out = model(batch_x)Loss = F.mse_loss(out, batch_y.view(-1, 28)) # 將batch_y從(64,7,4)變形為(64,28)loss_nowEpochTest.append(Loss.item())breaklossListTest.append(sum(loss_nowEpochTest)/len(loss_nowEpochTest))print(">>> EPOCH{} averTrainLoss:{:.3f} averTestLoss:{:.3f}".format(epoch+1, lossList[-1],lossListTest[-1]))繪制loss的下降圖
import matplotlib.pyplot as plt plt.plot(list(range(200)),lossList,label='Train') plt.plot(list(range(200)),lossListTest,label='Test') plt.legend() plt.xlabel('epoch') plt.ylabel('loss') plt.show()loss下降圖如下
可以看到在50輪左右其實就收斂了
再根據最近200天來預測未來7天的數據
X=torch.tensor(df[['open','close','high','low']][-200:].to_numpy()) Y=model(X.view(1,200,4).float()).reshape(7,4) result=pd.DataFrame(torch.vstack((X,Y)).detach().numpy()) result.index=list(df.index[-200:])+[pd.Timestamp('2022-07-12 00:00:00'),pd.Timestamp('2022-07-13 00:00:00'),pd.Timestamp('2022-07-14 00:00:00'),pd.Timestamp('2022-07-15 00:00:00'),pd.Timestamp('2022-07-18 00:00:00'),pd.Timestamp('2022-07-19 00:00:00'),pd.Timestamp('2022-07-20 00:00:00')] result.columns=['open','close','high','low'] mpf.plot(result[-21:],type='candle')?
后七天即為未來七天的預測結果?
總結
以上是生活随笔為你收集整理的基于LSTM的股票价格预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Meet Surprise品牌饰品告诉你
- 下一篇: 巨量引擎创意分类和创意标签使用技巧