文章來源:公衆号至簡量化
作者:複哥說
春分停步,冬至重啟。
老号複更,快來圍觀!
文末有彩蛋~
本篇是人工智能選股系列的第13篇。
基于深度神經網絡模型是機器學習最熱門的分支,在《人工智能選股--卷積神經網絡(CNN)篇》我們嘗試用深度神經網絡模型中的CNN模型進行選股,然而效果并不理想。
除了因為未對模型進行充分優化,還有一個可能的原因是這兩個模型并不适合處理多因子表格數據,深度神經網絡模型家族中最适合處理表格數據的是TabNet,所以我們接下來驗證一下TabNet的選股效果。
TabNet簡介
TabNet是Google Cloud 在2019年提出的專門針對表格型數據設計的神經網絡結構。深度學習在圖像、文本和語音等數據處理上有了廣泛的應用,然而對于常見的表格數據,XGBoost和LightGBM這類提升樹模型依然是首選。
TabNet結合了樹模型和DNN的優勢。它使用一種稱為順序注意機制(Sequential Attention Mechanism)的方法實現了instance-wise的特征選擇,還通過encoder-decoder框架實現了自監督學習,從而實現了高性能且可解釋的表格數據深度學習架構。
下面讓我們通過TabNet的encoder和decoder結構看看它是怎麼做到的。
TabNet原理
TabNet采用順序多步架構,将輸入從一個步驟傳遞到另一步驟。第i個步驟輸入來自第i-1個步驟的處理信息來決定使用哪些特征,并輸出處理後的特征表示以聚合到總體決策中。
1.标準化:
首先将特征輸入BN(batch normalization層),而不需要對特征數據做全局标準化處理。
2.特征選擇:
通過一個可學習的掩碼器(Mask)來做特征選擇,掩碼器由attentive transformer通過前一步處理過的數據計算得出。attentive transformer模塊由四部分組成,依次是FC(全連接層),BN,Prior scales和Sparsemax。
FC和BN無需介紹,Prior scales的作用是對于已經在之前的步驟中使用了多次的特征,減少它們的權重占比。Sparsemax通過将歐幾裡得投影映射到概率單純形(simplex)來實現特征稀疏化。
Mask可以理解為在當前步驟對batch樣本的注意力權重分配,對于不同的樣本,Attentive transformer層輸出的注意力權重也不同,這樣的特征選擇被稱為instance-wise特征選擇。
3.特征處理:
TabNet使用feature transformer處理篩選後的特征。Feature transformer模塊由兩個部分組成,前半部分的參數是所有步驟共享的,實現特征的共性處理;後半部分的參數是在每個步驟上分别訓練的,實現特征的個性處理。
上圖中的feature transformer前後兩部分各有兩個子模塊,每個子模塊由FC、BN和GLU(門控邏輯單元)組成,子模塊之間用殘差連接,乘0.5½以提高網絡的穩定性。
Feature transformer模塊的輸出被Split分成兩部分,一部分通過Relu激活函數用于計算模型的最終輸出,另一部分用來計算下一步驟的Mask。
最後,采用類似決策樹的聚合方法,構建整體決策嵌入。
4.自監督學習:
TabNet通過decoder來從TabNet的編碼表示(representation)重建表格特征。decoder的結構比較簡單,每一步由一個feature transformer 和一個FC組成,最後将每一步的輸出相加以獲得重構特征。
根據Google Cloud的論文,TabNet在多個表格數據集上的表現比肩甚至超越了當前廣為人知的很多樹模型,例如LightGBM,更重要的是它将使用者從繁瑣耗時的特征工程中解脫出來。不過也有使用者表示人工做特征工程後再使用提升樹模型可以達到的上限更高,這也是TabNet未能取代提升樹的原因。
TabNet選股實現
與XGBoost一樣,TabNet既可用于回歸問題,也可用于分類問題。接下來我們采用與本系列其它篇同樣的股票特征數據(詳見《人工智能選股--線性回歸和邏輯回歸》)用TabNet進行漲跌分類預測。
TabNet有兩個實現版本,分别是基于TensorFlow和Pytorch實現,前者被稱為tf-TabNet,後者被稱為PyTorch-TabNet,PyTorch-TabNet更受歡迎,因此本節的實現會基于PyTorch-TabNet。
具體使用的類是pytorch_tabnet.tab_model.TabNetClassifier,使用方法跟Sklearn包中的分類器差不多。需要注意的是用TabNetClassifier進行訓練和預測時要把樣本數據從Dataframe轉成numpy。
核心代碼如下:
1 alg = TabNetClassifier()
2 alg.fit(X_train.values, y_train)
3 alg.predict_proba(X_test.values)[:,1]
XGBoost預測因子分析效果如下:
分層測試走勢:
實際回測效果:
實驗表明TabNet在使用默認參數的情況下取得了遠超CNN的預測效果,可見Google 針對表格數據做出的優化确實有效果。
在此基礎上可以用前面講過的超參數優化方法進一步調優,也可以将TabNet的預測結果與XGBoost的預測結果組合使用,因為二者的預測結果相關性很低,組合可以起到不錯的效果。
參考文獻:
Sercan O. Arık, Tomas Pfister ,TabNet: Attentive Interpretable Tabular Learning