利用 Python 繪製股票管制圖:結合類神經網路與統計分析

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

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

統計上常用的管制圖(control chart)是透過標準差的計算來檢視資料的健康性;在上篇文章中,我們已經可以利用 pyTorch 以及 yfinance 這兩個 python 的工具透過股票資料來建立類神經網路模型,找到資料的趨勢;並且加上兩倍標準差及三倍標準差的計算,觀察資料的分佈,以得到有效的圖形作為資料健康判斷的依據;這樣的作法跟管制圖的使用,其實相當地接近。

為了可以更方便地使用上次發展出來的三層式類神經網路模型,可以先將程式作一些整理:

  • 引入類別庫

在這個程式分別使用了「pyTorch」用來建立類神經網路以及作為 GPU 平行運算使用;「yfinance」作為擷取股票資料使用;「tqdm」用來顯示類神經網路訓練時疊代計算的進度。

import torch
from torch import nn
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
import matplotlib.font_manager as fontManger
from tqdm import tqdm
  • 定義類神經網路

依照上篇文章的作法,定義一個三層式的類神經網路。

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)
  • 定義呼叫函式

整理上一篇文章中發展出來的程式,依序分成「擷取資料及資料前處理」「建立並訓練類神經網路」「取得模型預測值」「繪製管制圖」幾個部份;這個函式可以單獨依照輸入的股票代號及名稱,完整完成一支股票或指標以一年為區間的管制圖。

def stockModel(idName, idLabel):
#------------- read stock data
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)
#-------------- normalized
train_x=(x-np.mean(x))/(np.max(x)-np.min(x))
train_y=(y-np.mean(y))/(np.max(y)-np.min(y))
#-------------- transfer to GPU data
X_train=torch.tensor(train_x.astype('float32')).unsqueeze(dim=1).to(device)
Y_train=torch.tensor(train_y.astype('float32')).to(device)
#------------- setup neural network training model
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
#------------- training neural network model
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()
#------------- predict from trained model
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)))
#------------- plot control chart
offset=np.std(y_pred-y)
upperBound1=y_pred+offset
lowerBound1=y_pred-offset
upperBound2=y_pred+offset*2
lowerBound2=y_pred-offset*2
#--------------
zhfont=fontManger.FontProperties(fname='NotoSansTC-VariableFont_wght.ttf')
labelX=dataYahoo.index.strftime('%Y/%m/%d')
showTick=np.arange(0,nData,20)

plt.plot(x,y,'b.',label=idLabel+'收盤資料')
plt.plot(x,upperBound1,'g--')
plt.plot(x,lowerBound1,'g--')
plt.plot(x,upperBound2,'r--')
plt.plot(x,lowerBound2,'r--')

plt.grid()
plt.legend(fontsize=12,prop=zhfont)
plt.ylabel(idLabel,fontproperties=zhfont)
plt.xlabel('日期',fontproperties=zhfont)
plt.xticks(ticks=showTick,labels=labelX[showTick],
fontsize=8,rotation=45)
plt.show()
  • 撰寫主程式

最後我們定義程式所執行的 GPU 以及要繪製出來的股票或加權指標的圖形;可以提供綜合的判斷依據。

device=torch.device('cpu')
if torch.cuda.is_available():
device=torch.device('cuda')
elif torch.backends.mps.is_available():
device=torch.device('mps')

stock=[]
stock.append({'id':'^SOX','name':'費城半導體指數'})
stock.append({'id':'^TWII','name':'台灣加權指數'})
stock.append({'id':'2330.TW','name':'台積電'})
stock.append({'id':'2303.TW','name':'聯電'})
stock.append({'id':'0050.TW','name':'元大台灣五十(0050)'})
stock.append({'id':'0056.TW','name':'元大高股息(0056)'})

#-----------
for i in range(len(stock)):
stockModel(stock[i]['id'],stock[i]['name'])
  • 輸出結果

其實本來一直以來就有很多各式各樣的圖表提供股票或財經的分析及判斷;類神經網路的好處是在於不限定於一個固定公式,而能從資料面找到接近的模型;透過這樣型的建立,再加上統計計算,建立一個可以使用般常管制圖的使用方法的圖形,作為資料判斷的依據。當然,在建立模型的過程當中,會有一些參數的設定都會影響到輸出的結果;這就有賴股票財經方面知識的累積來取得最佳參數的設定。

vocus|新世代的創作平台


vocus|新世代的創作平台


vocus|新世代的創作平台


vocus|新世代的創作平台


vocus|新世代的創作平台


vocus|新世代的創作平台


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

留言
avatar-img
甘果的沙龍
12會員
39內容數
作者從國內主要的半導體公司退休,重回校園教學研究;開始第三人生。分享退休投資規劃、科技產業經驗以及校園學習點滴。
甘果的沙龍的其他內容
2025/08/24
本文介紹如何使用 PyTorch 建立一個三層式反饋類神經網路模型來預測股價。文章涵蓋了資料取得 、資料預處理 (正規化)、GPU 資料轉換、模型訓練、模型預測以及結果評估等步驟。透過將模型預測結果與原始股價資料繪製比較圖表,並結合統計指標例如「95%區間」來分析模型的準確性和可靠性。
Thumbnail
2025/08/24
本文介紹如何使用 PyTorch 建立一個三層式反饋類神經網路模型來預測股價。文章涵蓋了資料取得 、資料預處理 (正規化)、GPU 資料轉換、模型訓練、模型預測以及結果評估等步驟。透過將模型預測結果與原始股價資料繪製比較圖表,並結合統計指標例如「95%區間」來分析模型的準確性和可靠性。
Thumbnail
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
看更多
你可能也想看
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
本文介紹如何用Python繪製散布圖與迴歸線
Thumbnail
本文介紹如何用Python繪製散布圖與迴歸線
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這篇文章介紹如何使用Python整理資料成百分比資料以及繪製百分比堆疊直條圖。
Thumbnail
這篇文章介紹如何使用Python整理資料成百分比資料以及繪製百分比堆疊直條圖。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News