1個集技術面和籌碼面於一身的AI台股策略
如何用AI製作選股策略?
機器學習是現今人工智慧(AI)浪潮下的代表性技術,
將機器學習演算法應用至股市交易是本次研究著重的重點,
目的是探討在台灣股市中同時使用技術面和籌碼面的資料,
來訓練機器學習模型並預測交易訊號會有怎樣的表現,
希望能找出籌碼面資料與技術面資料哪一個更為重要的答案。
本次機器學習模型的任務是迴歸,迴歸各標的未來一周的報酬率分布,
由於各標的報酬率範圍落差極大,所以在製作標籤時對周報酬率採取了排名運算,
並將其縮放至0~1,因此模型預測出來的數值也會介於0~1之間,
若數值偏向0表示未來ㄧ周模型認為該標的上漲機會低;
反之,若數值偏向1表示未來一周模型認為該標的上漲機會高。
因此,交易策略的使用方式便是每周從數百檔標的中取出預測值最高的一檔做為買入訊號,
每次買入後持有時間固定為一周,若本周最高的一檔和上周的相同則不做任何操作,
若不同則先將上周的標的清倉,再買入本周預測數值最高的標的。
免責聲明
本篇文章的所有內容純屬個人分析觀點,不構成任何投資建議,
任何數據僅只是根據過去的結果所做的估算或分析結果,不應被視為確切的收益數據。
所有數字僅為說明用途,並非投資建議,投資有風險,投資人應具備獨立思考的能力。
如何獲取台股資料?
關於量化交易台股這一塊,
如果是有在網路上Google過台灣股市、選股策略等關鍵字的人,
應該都知道台灣有Finlab這一個招牌專門在研發量化交易策略,
好消息是Finlab最近研發出了一個台股/加密貨幣回測平台,
讓熱愛研究量化交易的人們可以到這個平台輕鬆撈取資料以及回測策略,
讓你只需要專注在研發策略本身就好,
完全不用煩惱資料該去哪裡爬取、也不需要會寫回測,
可以說是造福了許多有在用量化做台灣股市的人。
因此,本文將藉由這個機會使用Finlab套件來獲取開高低收量的資料,
甚至是技術面資料以及籌碼面資料等等的也可以簡單幾行Python語法得到。
標的池
本文使用的全部標的步驟如以下,
從Finlab獲取所有台灣股市標的(含股票、ETF等),
並限定標的需要在2013/01/05以前就有價格資料,
再扣除一些價格有缺失值的標的後,剩下標的池近700檔。
訓練、驗證、測試資料切分
從Finlab獲取上述標的池的股價資料,總共的期間是從2013/01至2021/12,
由於2013-2014年的資料在計算特徵時使用了移動窗格,會出現缺失值,
因此在計算完特徵後將前面的缺失值刪除,
留下了2014年至2019年近六年的資料做為訓練資料;
此外,2020一整年做為驗證資料、2021年至今做為測試資料。
技術面特徵
技術面特徵泛指各種使用開高低收量其中一種以上的數據計算而成的特徵。
首先,從Finlab獲取上述標的池的開高低收價格資料,
再用這些資料作為材料計算各種技術面特徵。
其中包含一日報酬率取對數、年化波動率、
GitHub 上著名計算技術指標套件Ta-Lib裡的大多數技術指標,
裡面包含MACD、RSI、K線型態等共100多個技術指標欄位,
由於程式碼繁雜、篇幅過長,故不在此詳列。
籌碼面特徵
直接從Finlab平台一行一行獲取,
欄位名稱包含三大法人進出、上市櫃合計、上市櫃外資、
上市櫃外資及陸資、上市櫃外資自營商、上市櫃投信、
上市櫃自營商自行買賣、避險、上櫃三大法人合計等數據。
以下幾個買賣超數據由於各標的分布落差極大,
所以特別使用rank將原數值轉換至0~1的數值放以便於模型學習。
data.get('institutional_investors_trading_all_market_summary:買賣超').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:外陸資買賣超股數(不含外資自營商)').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:外資自營商買賣超股數').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:投信買賣超股數').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:自營商買賣超股數(自行買賣)').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:自營商買賣超股數(避險)').rank(pct=True, axis=1)
預測標籤
模型預測的數值為未來一周報酬率的分布。
標籤計算方式為先計算每周報酬率,再平移一周變成未來一周報酬率,
最後將各標的報酬率做排名,並縮放至0~1,
此數值可以做為區分未來一周報酬率的分布情形,
若有一檔標的數值偏向0表示未來一周該標的有偏低的報酬率;
若有一檔標的數值偏向1表示未來一周該標的有偏高的報酬率。
資料處理
將上述所有資料計算完成後,
使用date日期或是ticker股票代號做為鍵來merge各種資料,
並將X和y整合進一個大DataFrame。最終,缺失值統一以0填補。
如何訓練AI模型?
模型訓練
本次使用的模型為CatBoost Regressor,
CatBoost與XGBoost、LightGBM齊名三大決策樹巨頭模型,
關於CatBoost演算法,有興趣的人可以看這一篇的詳細解說,
特色在於對多維度的類別特徵能做更有效的提取。
使用CPU訓練1000回合並使用驗證資料衡量訓練的優劣後,
RMSE從0.2838迅速下降至0.2627,並在第九十六回合就達到了最低的RMSE。
特徵重要性
由模型的特徵重要性圖表可以看到,
BOP、DIV、K線型態、上櫃自營商,這幾種指標是模型認為滿重要的指標。
雖然技術面指標佔據了模型重要性的前幾名,
但根據圖表也能發現有不少關於籌碼面的欄位在模型學習上起到了不小的作用,
表明籌碼面的數據確實可以互補眾多技術指標無法捕捉到的角度,
也再次印證了機器學習流程中,特徵工程扮演著極為重要的角色。
台股策略績效探討
這裡將每周模型預測出來的數值分成4組分別進行回測,
第一組為每周只購買模型預測數值最高的一檔,
第二組為每周只購買模型預測數值最高的前兩檔,依此類推。
AI 只選第一名 策略
由下圖可以看到,2021年ㄧ年的表現可說是如過山車一般,
從最高的近250%高點一路回撤至近期12月的86%左右,
即使報酬雖然從高點到最後被腰斬,但整體大部分時間仍勝過大盤。
總體來說,這個策略報酬率雖然看似不錯,
但風險與獲利穩定性不佳,推測其原因可能在於只買一檔,
容錯性太低,模型若稍有錯誤該周就完全沒機會了,
因此下面我們來看如果增加檔數會有怎樣的結果。
AI 選前兩名 策略
加入第二名後,可以發現最大回撤從原本的60%下降至40%左右,
雖然報酬率也有小幅下降,但整體Sharpe Ratio還是1.3,
印證增加至前兩名確實可以達到分散風險的效果。
AI 選前四名 策略
加入第二名有效,那再加一些呢?
如果換成前四名,可以看到最大回撤更是進一步地降低至20%左右,
雖然報酬率再次下降,但整體穩定度提升了許多,
不再發生獲利大回吐的情況,
Sharpe Ratio也增加至1.4,為目前最優的一個策略。
結論與未來展望
選股可以是一門藝術,也可以是一門科學
本文研究比較了籌碼面資料對於選股策略的有效性,
也從機器學習模型中了解到演算法認為究竟是哪些技術面或籌碼面的資料,
會對未來一週的報酬率分布更有預測能力。
由實驗結果表明,對於台灣股市而言,
除了技術面指標以外,籌碼面也是一個很重要的因素。
在機器學習策略的實驗可以發現,
對於特徵工程而言,
大量使用技術面和籌碼面做為模型學習的特徵近200個欄位,
能讓模型從多個角度學習如何更有效地預測台股未來一週報酬率的分布情形;
對於模型訓練而言,
加入籌碼面的資料也確實可以提升模型的學習成效,降低損失函數RMSE。
若未來有機會再將此專題改進,
例如使用其他決策樹模型如XGBoost、LightGBM或是深度學習模型、
甚至示把多種不同的模型做集成學習或是提高模型重新訓練頻率等,
其他方面再做得更細緻一些,相信模型績效還有再進步的空間 !
免責聲明
本篇文章的所有內容純屬個人分析觀點,不構成任何投資建議,
任何數據僅只是根據過去的結果所做的估算或分析結果,不應被視為確切的收益數據。
所有數字僅為說明用途,並非投資建議,投資有風險,投資人應具備獨立思考的能力。
Call To Action
歡迎任何能使這篇文章改進的意見,如果有問題或想法都歡迎在下面告訴我們喔 !
最後,如果你很認同這篇文章的分析方式,或是覺得這篇文章有幫助到你,
請幫我們多按幾次Like,您的支持是我們研究最大的動力,
拍手是不需要付任何費用的喔。