還沒有看過上一篇的可以點擊下面連結
什麼?!AI也看得懂k線圖?利用機器學習來判斷股票漲跌。(1)論文解析。
這一篇會把注意力放在論文提到的技術並套用在台股市場,也會使用論文中的方法進行驗證,看看是否在台股也有一樣的超額報酬。
第一步也是最難的一步-資料生成。
這裡使用到的資料為股票的開盤價、收盤價、最高價、最低價、成交量。需要先把這些資料標準化,再轉換成0和1的二維陣列,最後將二維陣列轉換成黑白的像素線圖。
我使用finlab的python套件獲取開高低收量的資料後,就能夠轉換成以下不同週期的線圖。
可以看到,除了依照周期區分之外,也可以依照是否使用均線/成交量,產生不同的線圖資料,進而訓練不同的模型。
同時也可以注意到,線圖中沒辦法得知是哪隻股票、股價、成交量為何,所呈現的都是標準化後的資訊。
finlab的資料集橫跨2007-2023年,依照論文的方式,拿前三分之一作為訓練及驗證,最後三分之二做測試。
2007-2011年的資料轉換成線圖後,會隨機打亂,並切割成訓練集(90%)和驗證集(10%)。2012-2023年的資料則會在模型訓練好後,作為實測的測試集。
這裡選擇訓練的模型是I5/R5,也就是拿五日的線圖去預測五日後的漲跌,而使用的線圖是包含均線以及成交量的。
會選擇這個模型當作實驗是因為他在論文中的表現是最好的。然而,在接下來的finlab實際回測中,我會使用不同模型進行回測。這將包含使用不同的時間週期、不同的線圖變化(如有無均線及成交量)。這些模型在不同量化策略下會有不同的效果,這裡就先賣個關子了。
模型的架構以及參數都比照論文的設定,如下圖。
訓練會持續直到驗證集的loss持續兩個epochs都沒辦法進步為止。
這裡會使用到2012-2023年的資料進行實驗。
首先是十等分的實驗。將模型預測出來的結果依照分數進行排序,並切成十等分。第一分位代表預測的數字越低,而第十分位則最高。結果如下圖
可以發現,隨著預測的分數越高,報酬率也跟著上升。紅色的線代表0050的平均報酬,從第五分位開始打敗0050的報酬。
論文中的第一分位平均報酬為負的,在這樣的條件下作多空對沖非常適合。然而在台股市場上並沒有這樣的條件,做多空對沖的話反而會拉低報酬,不過如果想要更平滑的報酬曲線的話仍然可以使用多空對沖。
上圖為實際操作的流程。首先會將股價資訊轉換成線圖,接著會透過CNN模型預測上漲下跌機率,根據上漲的機率進行排序後,買入前n檔股票,每五日做一次換股。
假設n=20。則買進前20檔、多空對沖(買進前20同時放空後20檔)、以及0050的走勢比較圖如下。
可以看到只買進前二十檔的績效遠超過0050的報酬,而多空對沖則和0050相當,不過曲線更為平滑一些。
假設n=10%。則買進前10%、多空對沖(買進前10%同時放空後10%)、以及0050的走勢比較圖如下。
可以發現只買進前10%的報酬雖然下降,但仍然很明顯的大敗大盤,而多空對沖的策略則更加平滑,但報酬也跟著降低了。
上一篇主要在介紹論文中的方法,這一篇則是把論文中的方法套用在台股上實驗。可以發現這個方法(或說這個因子)在台股上也是十分顯著有用的,下一篇我將把這個因子結合finlab上的策略進行優化。
覺得有幫助或是有趣的歡迎點贊關注,也歡迎贊助~。🙇