機器學習在投資上的應用

一、前言(Introduction)

近年來人工智慧的技術大爆發,這波浪潮也影響了各產業的改造,然而在金融投資上也不例外,今天以基金為例,如何以現有的資訊讓研究投資這件事可以幫助你省下時間,快速告訴你哪些基金標的未來可以進場,以下實作會帶讀者們如何運用現今火紅的機器學習技術預測基金未來一週的漲跌,當作投資下單的依據。

二、資料集(Data set)

  • 資料來源:台灣經濟新報 TEJ
  • 資料期間:2013/01/01 至 2018/07/22

資料為 TEJ 上的境外隨機挑取的 500 檔基金,資料包含以下內容:

  1. 基金基本資料
欄位說明 說明
基金碼 基金代碼
市場別 基金所屬市場
區域別 基金所屬區域
標的別 基金大項分類
幣別 基金計價之幣別
風險報酬等級 依據中華民國證券投資信託暨顧問商業同業公會針對基金風險報酬等級分類標準,將每檔基金之風險區分為 RR1~RR5,其中 RR1 風險最低,RR5 風險最高
成立日期 基金成立日期
經理費% 經理公司之報酬,係按基金淨資產價值每年計算比率,逐日累計計算,自基金成立日起每曆月給付乙次
保管費% 保管機構之報酬,係按基金淨資產價值每年計算比率,逐日累計計算,自基金成立日起每曆月給付乙次。
銷售費% 申購手續費
  1. 基金淨值資料
欄位說明 說明
基金碼 基金代碼
年月日 交易日(日頻)
原幣值 基金淨值
幣別 該檔共同基金計價幣別
  1. 基金配息資料
欄位說明 說明
基金碼 基金代碼,已匿名處理
除息日期 基金配息日期
股息 息值
幣別 基金計價之幣別

三、特徵工程(Feature Engineering)

  • 以上這些資料只是基金的基本資料,真正能拿來當作特徵並不多,若要讓模型告訴我們這些基金未來是否會漲會跌,勢必要讓模型吃入更多的資訊,那這些資訊在機器學習中一般稱為特徵,以下為我們這次實作額外新增的特徵:
特徵 計算方式 說明
位置指標(4 個) $$ \frac{均線}{收盤價}$$ 許多投資人會透過技術分析觀察今天股票是否跌破均線或是突破均線,進而當作買賣點的決策。
近 X 天最大回撤率(2 個) $$ max(1-\frac{當日價值}{當日之前最高價值}) $$ 最大回撤率也是投資人會觀察的指標之一,它告訴投資者當我買進之後,最大可能發生的虧損是多少。
動能指標(4 個) 過去 X 天的期間報酬 動能因子是學界和實務界很常被拿來討論的因子,人們普遍相信過去的贏家,未來也能為他們創造更高的獲利。
趨勢指標(3 個) 過去 X 天的斜率 在市場上流傳著一句話:「永遠不要與趨勢作對」,我們利用均線去計算斜率,斜率在數學上用來度量線的傾斜程度,斜率大意味著市場正面臨漲或跌的趨勢,斜率接近 0 則可視為趨勢面臨轉折或盤整。
國際趨勢 過去 X 天的斜率 計算目前國際上的趨勢走升走跌,但因資料取得不易以及代表性問題,這裡僅以 S&P 500 為例。
VIX VIX 指數也常被投資人拿來當作景氣變化的指標,當有異常事件發生,VIX 指數通常會飆高,平時則正常波動。
  • 以上為本次實作選定的 15 個特徵,這 15 個特徵並非絕對賺錢,讀者們可以依自己的看法或是喜好加入其他特徵。
  • 有讀者可能認為為何不加入總經指標像是失業人口、非農就業人口等等,那是因為這些數據時間發布不一定,有些是每個月發布,有些一季才發布一次,資料處理相對要花上更多功夫,另外這些數據與財報數據同樣具有滯後性(Lagged),意思是我現在看到的數據其實是前一季或是前一個月已發生的事情,對未來的預測並不會比較準確,因此這邊的特徵比較建議使用具有日頻的資料,在短期預測上會相對準確。

四、模型(Machine Learning Model)

機器學習的模型相當多元,包括隨機森林(RandomForest)、決策樹(Decision Tree)、SVM 等等,當然也能考慮深度學習模型:多層感知器(MLP)、卷積神經網路(CNN)、遞歸神經網路(RNN、LSTM、GRU)等等,最後選擇 XGBoost 原因是:在許多實作經驗上,XGBoost 比起上述所列之機器學習模型都表現地非常好,而深度學習模型則相對耗時且普遍需要顯示卡(GPU)的運算,成本耗費相當大。

XGboost 簡介

在這次實作當中,我們選擇 XGBOOST 作為主要使用的演算法,在近年也相當火熱,常常是 Kaggle 比賽的常勝軍。這個演算法背後使用 C++來實作,比起傳統的 Gradient Booosting Tree 也做了許多優化(高度利用平行運算)。

XGboost 原理

XGBoost 的主要核心是 CART(迴歸樹),最後一個葉節點是一個實數,如果想要做分類器的話,會將此數值送進 Sigmoid 函數,即可生成機率來達到分類的效果。

但最原始的 CART 只有一顆樹,XGBOOST 加入了集成學習「Boosting」的迭代思想來生成許多棵樹,最後的預測值是所有樹的葉節點相加。Boosting 的直觀意義是,每添加一棵樹是為了擬和上次樹集合預測的殘差,更精確的說,每生成一棵樹是根據損失函數的梯度下降方向,就像是「知錯能改」的概念。

故在 XGboost 中,會將損失函數去做泰勒二次展開,就可以求得最優化後的節點分數。

五、預測目標(Target)

本次實作測試資料集期間為 2018 年 4 月 30 日(一)至 2018 年 7 月 22 日(日),預測 500 檔基金各 12 週的週報酬率,總計需預測 6,000 筆週報酬率。

  • 模型準確度評分依據:

準確度評分以平均絕對誤差(MAE, Mean Absolute Error)計算,計算公式如下:

$$
\mathrm{MAE} = \frac{\sum_{i=1}^n\left| y_i-\hat{y_i}\right|}{n}
$$

符號 說明
$$ y_i $$ 實際基金週報酬率
$$ \hat{y_i} $$ 模型預測基金週報酬率
$$ n $$ 樣本數,初賽共需預測 6,000 筆週報酬率(500 檔基金,12 週)
  • MAE 越小代表模型的預測力越好

六、預測結果(Result)

  • 本次預測結果 MAE 為 0.0099,該結果是經過參數調整後 MAE 最低的參數。 * 讀者們可將預測出來的報酬率當作進出場的依據,當預測報酬大於 0 買進,直到預測報酬小於 0 賣出。
基金代碼 預測第 1 週報酬率 預測第 2 週報酬率 預測第 3 週報酬率 預測第 4 週報酬率 預測第 5 週報酬率 預測第 6 週報酬率 預測第 7 週報酬率 預測第 8 週報酬率 預測第 9 週報酬率 預測第 10 週報酬率 預測第 11 週報酬率 預測第 12 週報酬率
Fund_001 -0.00107 0.00787 0.004198 -0.00269 0.001837 0.000461 -0.00193 -0.00347 0.000544 0.00156 0.000416 -0.00341
Fund_002 -0.00063 -0.00073 0.000354 -0.00067 0.002317 0.000717 -0.00026 0.001707 0.000531 -0.0007 0.000566 -0.00065
Fund_003 -0.00064 -0.00299 -0.00234 -0.00167 0.000389 -0.00053 -0.00234 -0.00101 0.000682 -0.00583 0.004074 0.001028
Fund_004 0.000571 0.00058 0.000569 0.000572 0.000574 0.000574 0.000575 0.000577 0.000578 0.000582 0.000578 0.000583
Fund_005 -0.0016 -0.0025 -0.00167 -0.00124 -0.0013 -0.00139 -0.0015 -0.00216 -0.00095 0.000596 -0.00163 0.000678

因基金有 500 檔,在此僅列出 5 檔示意

七、結論(Conclusion)

從資料取得 → 整理 → 特徵工程 → 模型挑選 → 預測,這過程一開始會花上許多時間,但程式只要寫一次,之後只要每天執行即可,甚至厲害的讀者們可能馬上想到可以跟各個券商的下單 API 直接做串接,如此一來不太需要花太多時間盯盤,電腦自動幫你把交易做好,讀者們也能利用空出來的時間享受其他休閒娛樂。

後續改進

本次實作僅著重於機器學習應用到投資的部分,後續可再加入績效回測,觀察這樣做投資是否也能賺錢,惟筆者時間不足,有時間再做後續更新。


溫馨提醒:

  1. 以上實證皆為本人使用 R/Python 撰寫,請勿抄襲。
  2. 投資有賺有賠,本次實作僅為研究使用,投資人投資前應審慎評估,本人不負任何投資賠償責任。