Python/pyTorch 如何建立股價趨勢模型:一個三層式類神經網路模型

甘果-avatar-img
發佈於程式
更新 發佈閱讀 10 分鐘

[本文內容僅就一般性之證券投資公開資訊進行統計程式教學之範例,作者並不針對特定有價證券買賣提供建議]

一般我們會使用類神經網路來建立系統模型的原因,通常是因為無法用固定的方程式來描述系統,另一則是希望能夠透過建立的模型來更瞭解系統的變化。股票市場的變化,其實就是一個很典型的例子。

  • 建立類神經網路類別

我們可以先利用「pyTorch」來建立一個類神經網路,作為股票資料的模型;模型的輸入為時間,而輸出則為股價。在這裏使用簡單的三層式反饋式類神經網路。

import torch
from torch import nn

#--------
# 取得 GPU device
#--------
device=torch.device('cpu')
if torch.cuda.is_available():
device=torch.device('cuda')
elif torch.backends.mps.is_available():
device=torch.device('mps')
#-----------
class classNeural(nn.Module):
def __init__(self,n_input,n_hidden,n_output):
super().__init__()
self.n_input=n_input
self.n_hidden=n_hidden
self.n_output=n_output
#--------
self.layer1=nn.Linear(n_input,n_hidden)
self.layer2=nn.Linear(n_hidden,n_output)
self.active=nn.Sigmoid()
#--------
def forward(self,x):
x=self.active(self.layer1(x))
return self.layer2(x)
  • 取得線上股市資料庫

再來,依照之前文章的例子,我們可以透過「yfinance」 提供的股市資料庫來取得台北股市的資料;

import yfinance as yf
from datetime import date
from datetime import timedelta
from dateutil.relativedelta import relativedelta

import numpy as np
import matplotlib.pyplot as plt
# Google Chinese Font
# https://fonts.google.com/noto/specimen/Noto+Sans+TC?subset=chinese-traditional&script=Hant
import matplotlib.font_manager as fontManger
zhfont=fontManger.FontProperties(fname='NotoSansTC-VariableFont_wght.ttf')

#--------
# read Stock values
idName='^TWII'
# idName='^DJI'
endDate=date.today()
beginDate=endDate-relativedelta(months=12)
dataYahoo=yf.download(idName,start=beginDate,end=endDate,auto_adjust=True)
#---------------
  • 訓練資料處理

取得資料之後,利用收盤價為模式學習的目標;不過要注意的是,股價或指數的數字必須要經過「正規化」的步驟,才能交給類神經綱路作訓練。

#---------------
y=dataYahoo['Close'].values
nData=len(y)
x=np.arange(0,nData,1.0)
#--------------
train_x=(x-np.mean(x))/(np.max(x)-np.min(x))
train_y=(y-np.mean(y))/(np.max(y)-np.min(y))
  • GPU 資料轉換

同時,由於我們是在使用「pyTorch」透過 GPU 來進行訓練,所以資料要轉換成「pyTorch」要求的「Tensor」的型態來進行運算。

#--------------
X_train=torch.tensor(train_x.astype('float32')).unsqueeze(dim=1).to(device)
Y_train=torch.tensor(train_y.astype('float32')).to(device)
#-------------
  • 類神經網路模型訓練

接下來,就是進行類神經網路的訓練,我們以 2000 次的疊代訓練為例。不過,訓練過程可能會花費一些時間;所以可以利用「tqdm」這個函數來輸出訓練的過程,可以看到實際訓練的進度。

from tqdm import tqdm
torch.manual_seed(13)
stockModel=classNeural(1,10,1).to(device)
loss_fn=nn.MSELoss() # MSE
optimizer=torch.optim.AdamW(stockModel.parameters(),lr=0.01)
stockModel.train()
n_epoche=2000

for epoche in tqdm(range(n_epoche)):
Y_pred=stockModel(X_train)
loss=loss_fn(Y_pred,Y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
#------------
raw-image
  • 類神經網路模型預測

訓練結束之後,就會有一個可以使用的模型。接下來,使用原來的時間資料透過建立好的模型,就可以到正規化的預測結果。

stockModel.eval()
with torch.inference_mode():
Y_pred=stockModel(X_train)
y_cpu=Y_pred.to("cpu").numpy()
y_pred=np.mean(y)+y_cpu*((np.max(y)-np.min(y)))
#-----------
  • 初步模型結果

有了預測結果,我們可以將模型以及原始資料繪製出來作為比較。

labelX=dataYahoo.index.strftime('%Y/%m/%d')
showTick=np.arange(0,nData,20)
#-----------
plt.plot(x,y,'b.',label='原始資料')
plt.plot(x,y_pred,'r-',label='模型')

plt.grid()
plt.legend(fontsize=12,prop=zhfont)
plt.ylabel('台灣加權指數',fontproperties=zhfont)
plt.xlabel('日期',fontproperties=zhfont)
plt.xticks(ticks=showTick,labels=labelX[showTick],
fontsize=8,rotation=45)
plt.show()
raw-image
  • 統計模型結果

在這裏我們可以看得出來,類神經網路確實有將股市資料的趨勢具體建立成一個模型。不過,由於股市資料本身就是不斷變動的資料,所以一般會再使用資料的變動指標,例如「兩倍標準差95%區間」來描述股票的行為;同時可以提供資料與趨勢模型偏移量的判斷依據;例如:

# variation evaluation
offset=np.std(y_pred-y)*2
upperBound=y_pred+offset
lowerBound=y_pred-offset

plt.plot(x,y,'b.',label='原始資料')
plt.plot(x,upperBound,'r--',label='95% 邊限')
plt.plot(x,lowerBound,'r--')
plt.grid()
plt.legend(fontsize=12,prop=zhfont)
plt.ylabel('台灣加權指數',fontproperties=zhfont)
plt.xlabel('日期',fontproperties=zhfont)
plt.xticks(ticks=showTick,labels=labelX[showTick],fontsize=8,rotation=45)
plt.show()
raw-image

[本文內容僅就一般性之證券投資公開資訊進行統計程式教學之範例,作者並不針對特定有價證券買賣提供建議]

留言
avatar-img
留言分享你的想法!
avatar-img
甘果的沙龍
4會員
28內容數
作者從國內主要的半導體公司退休,重回校園唸書;開始第三人生。分享退休投資規劃、科技產業經驗以及校園學習點滴。
甘果的沙龍的其他內容
2025/08/15
本文介紹如何使用yfinance函式庫取得臺灣股票市場資料(例如加權指數或個股),並利用這些資料繪製圖表。同時,也說明如何安裝yfinance函式庫、取得最新版本以及設定圖表顯示中文的方法。
Thumbnail
2025/08/15
本文介紹如何使用yfinance函式庫取得臺灣股票市場資料(例如加權指數或個股),並利用這些資料繪製圖表。同時,也說明如何安裝yfinance函式庫、取得最新版本以及設定圖表顯示中文的方法。
Thumbnail
2025/05/07
蘋果M系列晶片採用統一記憶體架構 (UMA),不同於NVIDIA CUDA常用的獨立顯示卡記憶體架構。本文以PyTorch 撰寫測試M4晶片CPU和GPU矩陣運算效能程式,結果顯示不管GPU或是CPU的結果,運算效能驚人,非常適合教學及小型研究用途。
Thumbnail
2025/05/07
蘋果M系列晶片採用統一記憶體架構 (UMA),不同於NVIDIA CUDA常用的獨立顯示卡記憶體架構。本文以PyTorch 撰寫測試M4晶片CPU和GPU矩陣運算效能程式,結果顯示不管GPU或是CPU的結果,運算效能驚人,非常適合教學及小型研究用途。
Thumbnail
2025/04/26
本文章說明如何在已安裝 Python 3.9 的 iMac mini 上設定 Python 虛擬環境,以及如何使用 venv 工具、安裝常用函式庫(如 numpy、pyTorch 等),並設定 Jupyter 連動不同 Python 虛擬環境。
Thumbnail
2025/04/26
本文章說明如何在已安裝 Python 3.9 的 iMac mini 上設定 Python 虛擬環境,以及如何使用 venv 工具、安裝常用函式庫(如 numpy、pyTorch 等),並設定 Jupyter 連動不同 Python 虛擬環境。
Thumbnail
看更多
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
在進行多層次線性模型(MLM)當中,有時候我們不只會加入層次1的預測變項。我們也會想加入層次2預測變項。本文將介紹加入層次2預測變項的各種模型,並解釋其公式和R語言操作方法。因為內容比較多,所以篇幅比較長。 多層次線性模型(MLM),截距是表示所有學校的平均值。斜率是指模型中自變量的係數,表
Thumbnail
在進行多層次線性模型(MLM)當中,有時候我們不只會加入層次1的預測變項。我們也會想加入層次2預測變項。本文將介紹加入層次2預測變項的各種模型,並解釋其公式和R語言操作方法。因為內容比較多,所以篇幅比較長。 多層次線性模型(MLM),截距是表示所有學校的平均值。斜率是指模型中自變量的係數,表
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
透過這篇文章,我們將瞭解如何使用PyTorch實作圖神經網絡中的訊息傳遞機制,從定義消息傳遞的類別到實作消息傳遞過程。我們也探討了各種不同的消息傳遞機制,並通過對單次和多次傳遞過程的結果,可以看到節點特徵如何逐步傳遞與更新。
Thumbnail
透過這篇文章,我們將瞭解如何使用PyTorch實作圖神經網絡中的訊息傳遞機制,從定義消息傳遞的類別到實作消息傳遞過程。我們也探討了各種不同的消息傳遞機制,並通過對單次和多次傳遞過程的結果,可以看到節點特徵如何逐步傳遞與更新。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
Thumbnail
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
Thumbnail
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
Thumbnail
本文介紹如何用Python繪製散布圖與迴歸線
Thumbnail
本文介紹如何用Python繪製散布圖與迴歸線
Thumbnail
大部分處理影像的神經網路,例如簡單的神經網路、CNN、物件偵測、語義分割、臉部辨識等,都是以像素為輸入特徵,圖神經網路 (GNN) 則是以圖形理論 (Graph Theory) 為基礎,以向量作為輸入,內含節點 (Node) 及邊 (Edge),如下圖,以圖形表達集團交叉持股的關係及持股比例。
Thumbnail
大部分處理影像的神經網路,例如簡單的神經網路、CNN、物件偵測、語義分割、臉部辨識等,都是以像素為輸入特徵,圖神經網路 (GNN) 則是以圖形理論 (Graph Theory) 為基礎,以向量作為輸入,內含節點 (Node) 及邊 (Edge),如下圖,以圖形表達集團交叉持股的關係及持股比例。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News