日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于LSTM的股票价格预测

發布時間:2023/12/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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的股票价格预测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。