卷積神經網路 - 預測股票買賣時機點

研究動機
大學實習期間,有存下一筆錢,曾經有嘗試自己研究並進行投資,但成效不佳,為此才為我這個研究的想法萌芽
研究目的
不想花太多時間盯股票走勢
有朋友花了許多時間去進行研究股票研究的部分了解到,要是自己執行會需要投入很多時間,於是想把這些時間交給機器,自己有自己的規劃
想了解這種方式可不可行
過去就有已有耳聞,CNN的辨識圖像,很廣泛的應用在市面上,於是想嘗試使用這種方式來代替人工看盤的部分
研究方法
資料簡介和來源
股票的選擇上是使用0050當中的前五名權值股,原因是這5支股票是台灣相對優質的股票,在風險上有一定的保障。
資訊方面是從台灣證交所中獲取該檔股票的:
殖利率、本益比、股價淨值比、成交股數、成交金額、開盤價、最高價、最低價、收盤價、漲跌價差、成交筆數等11項並以每11天為一個單位的資料來輸入模型。

模型簡介 - 模型上的選擇是使用CNN 模型

CNN在影像辨識上,是眾所皆知的強大,近幾年不斷地應用在影像辨識上,於是我思考,能否把這種方式應用在股市上面。

畢竟股市中,技術面也是可以從K線上來分析股票趨勢,把一個時段某檔股票的資訊,當成一張圖,來給CNN做辨識的動作。
研究過程
爬蟲
要從台灣證交所上的個股日本益比、殖利率及股價淨值比欄位,獲取資訊我使用的方式是找到該網站的Json網址,並找到其規律調整網址,使我可以獲得某一日我所需要的資訊。
爬下來之後,先轉成json格式再利用Python並依照從過去到現在的順序寫入CSV 供下一個資料分析的部分來進行讀取,時間的範圍是使用爬取的當日到過去三年。


資料處理-1
把爬取到的資料與進行合併,整理轉型後進行歸一化的動作 ,再調整資料維度,每11天和11個維度整理成一張資料(11x11)資料表。
接下來因為他有三個類別,分別是持平,買入和賣出,所以作上標記0,1,-1 ,這邊標記的根據是依據當日的前後五日最高點或最低點來進行標記的操作。
(0:持平,1:買入,-1:賣出)

資料處理-2
將結果進行獨熱編碼,以滿足模型假設
利用灰度化得到示意圖,並為每一張圖片標上標記
數據籌備完成後,將其存成PKL檔以便模型使用

模型搭建
模型上的選擇是使用CNN 2D模型並使用兩層3*3捲機層數量是32與64,中間夾一層3*3池化層,64卷積層後面一層展平層(Flatten),一層全連階層。
最後是三個結果,前面都是使用relu函數,最後結果產出是使用softmax 機率分佈函數
優化器的部分是使用亞當優化器,損失函數式是使用交叉熵函數。
使用這個損失函數原因在於結果會預測出三個,買進、持平、或是賣出,如此這般是多分類結果,需要計算三個損失所以使用該損失函數。

模型過程

回測系統
回測系統是把預測的當日價錢進行買入或賣出的操作計算出若是照著模型預測結果操作會有如何的收益,時間範圍設定在今年一月至資料當前最新的價格,顯示內容大致為買入或賣出的價格,股票持有檔數出清日賣出的股價總數,以及最後的收益,收益指的是每一股的收益。

模型驗證
除了使用70%資料當成訓練集30%資料當成驗證集,還有使用F1-score 和回測的方式來驗證模型是否準確符合預期。
下圖是F1 Score 調整前與調整後的區別,調整原因在於由於模型較敏感,相似的幾天都會有相同的預測結果,所以將輸出調整成買入過後,要等到下次賣出過後,才可以在進行買入的動作,這樣的動作也大幅提高了F1 Score 的準確度。

研究結果
研究結果如下圖驗證結果準確率大概是60%上下
買賣位置也大致與真實值接近或相同F1 score 的準確度是落在79%左右
回測程式基本上也都有獲利只是預測結果的獲利會比實際獲利來得低。


結論
模型可行雖然模型較為敏感會偵測重複連續的買賣時機點
但經過我們回測系統的校正可以預測相對高低點!
但如果所獲利金額會比實際點的回測整體來得低...
原因是買入的前後五日的最低點,預測的位置有可能預測會錯過那波谷底反彈的峰值,而是在峰值附近
但基本上結果都會是非常接近前後五日最高最低點
若是要進行最高最低點的輔助判對這這個模型是可行的!

專案心得 & 教學回饋
感覺很扎實,上完全部的課程後,可以了解到,各式各樣程式,或是網站,背後的原理
而我自己有機會可以將其構築起來實際運作,有種學以致用的感受
相信不管是在未來工作上,有需要用到,或是生活上有需要,都可以運用,實用性非常高
專題時間老師也非常用心教導,耐心指導方向,鼓勵學生獨立思考
非常感謝專題老師Mike
Comments