Stacking 整合學習在多因子選股中的應用
Stacking 整合學習模型簡介
Stacking 整合學習的原理
Stacking 是一種常見的整合學習框架。一般來說,Stacking 將訓練一個多層(一般是兩層, 本文中預設兩層)的模型結構,第一層(也叫學習層)包含 n 個不同的模型,將得到的預 測結果合併為新的特徵集,並作為下一層模型的輸入,由下一層模型再次根據對應的資料 標籤進行訓練,得到一個完整的框架。簡單的示意圖如下:
通常情況下,Stacking 中第一層的模型會使用擬合度高的模型,以追求對訓練資料的充分 學習(如 XGBoost、神經網路、SVM 等)。由於不同的模型在原理上和訓練集上有所差別, 第一層模型可以認為是從原始資料中自動提取有效特徵的過程。第一層模型中,由於使用 了複雜的非線性變化提取特徵,Stacking 更易產生過擬合的情況。為了降低過擬合的風險, 第二層模型傾向於使用簡單的模型,例如邏輯迴歸、Lasso 迴歸等廣義線性模型。從以上 分析可以看出,Stacking 能夠成功的關鍵在於第一層模型能針對原始訓練資料得出有差異 性(相關性低)且預測能力好的輸出值,這樣通過第二層模型進一步學習後,能夠在多個 第一層模型中取長補短,提升預測的準確度和穩定性。
從傳統的 Stacking 到改進的 Stacking
一個傳統的 Stacking 整合學習如下圖所示。圖中,所有的第一層模型都使用相同的訓練 集資料,它們從不同的角度對相同的訓練資料進行學習,得到具有差異性的輸出值,再通過 第二層的邏輯迴歸得到輸出值。該框架主要應用於一些訓練和預測資料同分布的傳統領域, 如影象分類。
本文使用的是一種改進的整合學習框架,如圖表 3 所示,框架的第一層不僅使用不同的模 型,還使用有差異的訓練資料,這進一步增大了模型輸出值之間的差異性(相關性低), 這樣的差異性往往適用於訓練資料和預測資料不是同分布的領域,可以增強預測的穩定性, 如金融資料的預測。
傳統的 Stacking 和改進的 Stacking 在訓練和測試資料的處理上也有一些不同,我們在本 文最後的附錄部分詳細介紹了相關內容。
從本節的分析可以看出,Stacking 與其說是一種模型,不如說是一種機器學習框架,其應 用模式並不固定,而是需要根據具體的問題進行模型和訓練資料的設計,這使得該框架的 應用非常靈活。下一章節中,我們將結合前期人工智慧選股系列報告的研究結果,進一步 說明我們為何使用改進的 Stacking 整合學習。
Stacking 整合學習中基模型的對比和選取
在本文中,Stacking 模型主要對已有的機器學習模型進行整合。在華泰金工前期的人工智 能選股報告中,我們分別介紹了廣義線性模型、SVM、樸素貝葉斯、隨機森林、Boosting、 神經網路模型在多因子選股中的應用。各個模型在全 A 選股的表現各異,同一模型在使用 不同訓練資料時的表現也有很大差異,本章我們將分別展示這些差異,並討論如何選取Stacking 模型中第一層的基模型。
相同訓練資料,不同模型對比
本節中,我們選取 6 個模型:邏輯迴歸、SVM、樸素貝葉斯、隨機森林、XGBoost、神經 網路模型,對比它們在相同訓練資料下的選股表現。
訓練資料為 72 個月
各個模型回測方法如下:
回測時間:2011 年 1 月 31 日至 2018 年 4 月 27 日。
訓練資料長度:72 個月,每個月用之前 72 個月的因子資料訓練模型。
組合構建方法:月頻調倉,在全部 A 股中選股,行業權重配置和中證 500 保持一致,每 個行業內選擇 4 只模型預測表現最好的股票進行等權配置。
回測得到的超額收益結果如圖表 4 所示,總體來看 XGBoost 和隨機森林表現最好,模型 之間有一定的區分度,但是所有模型在 2017 年後都有較大的回撤。
訓練資料為 6 個月
各個模型回測方法如下:
回測時間:2011 年 1 月 31 日至 2018 年 4 月 27 日。
訓練資料長度:6 個月,每個月用之前 6 個月的因子資料訓練模型。
組合構建方法:月頻調倉,在全部 A 股中選股,行業權重配置和中證 500 保持一致,每 個行業內選擇 4 只模型預測表現最好的股票進行等權配置。
回測得到的超額收益結果如圖表 5 所示,總體來看 XGBoost 最好,模型之間有一定的區分。
不同訓練資料,相同模型的對比
本節中,我們主要考察 XGBoost 模型,使用長度分別為 6 個月、9 個月、12 個月、24 個 月、36 個月、72 個月的訓練資料訓練模型,對比它們的選股表現。
各個模型回測方法如下:
回測時間:
2011 年 1 月 31 日至 2018 年 4 月 27 日。
組合構建方法:月頻調倉,在全部 A 股中選股,行業權重配置和中證 500 保持一致,每 個行業內選擇 4 只模型預測表現最好的股票進行等權配置。
回測得到的超額收益結果如圖表 6 所示,可以看出訓練資料的長短對選股結果有很大影響。72 個月模型學習的是市場的長期規律,但當市場長期規律被打破時(2017 年後),超額 收益回撤較大;6 個月模型學習的是市場的短期規律,超額收益增長緩慢且平穩,兩個模 型各有優劣。其他訓練期長度的模型表現位於中間。
模型預測值相關性分析和夏普比率分析
上一章提到過,Stacking 能夠成功的關鍵在於第一層模型能針對原始訓練資料得相關性低 且預測能力好的輸出值。因此在挑選 Stacking 的第一層模型時,要衡量兩方面的指標:
1. 模型預測值的相關係數(Corr)低。
2. 模型預測能力好。在選股領域,使用模型的夏普比率(Sharpe)來衡量。
為了減少挑選模型的工作量,我們不對所有基模型的預測值進行兩兩之間的相關性分析, 而是挑選出一個優秀的基模型之後,再將其和其他基模型的預測值進行相關性分析。
觀察下面的圖表發現 XGBoost 使用 72 個月資料訓練的模型(以下簡稱 XGBoost_72m)在2017 年之前有很大的優勢,如果在其他基模型中挑選一些和 XGBoost_72m 整合,應該 可以達到更好的預測結果。接下來,我們進一步把基模型挑選的範圍縮小到使用 6 個月數 據訓練的模型中,因為只有這些模型才能在 2017 年之後回撤較小。在圖表 7 中,展示了 回測區間內 6 個模型預測值與 XGBoost_72m 預測值的相關係數。在圖表 8 中,展示了回 測區間內 6 個模型的 Sharpe 比率。
為了選出合適與 XGBoost_72m 模型整合的基模型,我們定義適應度指標 S 為:
S = Sharpe/Corr
我們挑選 S 較大的那些模型與 XGBoost_72m 模型整合。圖表 9 展示了 6 個模型的適應度 指標 S。可知,XGBoost_6m 以及邏輯迴歸_6m 最適合與 XGBoost_72m 進行 Stacking整合。
Stacking 整合學習測試流程
測試流程
模型構建
上一節提到,我們使用月度滾動的方法進行模型訓練和回測,本節我們將具體介紹每個月如何構建Stacking模型進行訓練和預測。
基本設定:
1. 設1998年4月為第1個月,之後月份序號依次遞增,到2018年4月為第241個月。
2. 回測區間:2011年1月31日至2018年4月27日,即第155個月至第241個月。
3. 股票池:全 A 股,剔除 ST 股票,剔除每個截面期下一交易日停牌的股票,剔除上市3個月以內的股票。每隻股票視作一個樣本。為了方便起見,在本節所舉的例子中,假設有3000只股票。
4. 因子數目:70個。
5. Stacking模型構建:總共兩層,第一層為使用72個月訓練資料的XGBoost模型和使用6個月訓練資料的邏輯迴歸模型,以保證兩個模型及其訓練資料都有差異。第二層為邏輯迴歸模型。
6. 訓練資料劃分:樣本內資料74個月,其中前72個月的資料為訓練集,後2個月的資料為驗證集。樣本外資料(測試資料)為截面後1個月的資料。
模型構建說明:
假設當前測試資料為第174個月的資料,模型訓練過程如圖12所示,模型測試過程如下圖所示:
模型訓練和測試有以下步驟:
1. 首先選取第100-171個月的資料作為訓練資料集,172-173個月的資料作為驗證集。利用XGBoost模型對訓練資料集進行訓練。訓練完成後使用該模型對驗證集進行預測,得到第一層輸出。
2. 其次選取第166-171個月的資料作為訓練資料集,172-173個月的資料作為驗證集。利用邏輯迴歸模型對訓練資料集進行訓練。訓練完成後使用該模型對驗證集進行預測,得到第一層輸出。
3. 將兩個模型預測得到的第一層輸出值作為第二層輸入,利用邏輯迴歸進行訓練,得到最終stacking整合學習模型。
4. 將第174個月的測試資料集代入Stacking整合學習模型中,計算預測值。
5. 為了達到滾動預測的目的,下一期選取第101-172個月的資料作為訓練資料集,173-174個月的資料作為驗證資料集,第175個月的資料作為測試集資料,以此類推。
Stacking模型分層回測分析
Stacking整合學習模型最終在每個月底可以產生對全部個股下月上漲或下跌的預測值。因此可以將其看作一個因子合成模型,即在每個月底將因子池中所有因子合成為一個“因子”。接下來,我們對該模型合成的這個“因子”(即個股下期收益預測值)進行分層回測,從各方面考察該模型的效果。仿照華泰單因子測試系列報告中的思路,分層回測模型構建方法如下:
1. 股票池:全A股,剔除ST股票,剔除每個截面期下一交易日停牌的股票,剔除上市3個月以內的股票。
2. 回測區間:2011-01-31至2018-04-27。
3. 換倉期:在每個自然月最後一個交易日核算因子值,在下個自然月首個交易日按當日收盤價換倉。
4. 資料處理方法:將Stacking整合學習模型的預測值視作單因子,因子值為空的股票不參與分層。
5. 分層方法:在每個一級行業內部對所有個股按因子大小進行排序,每個行業內均分成N個分層組合。如圖表14所示,黃色方塊代表各行業內個股初始權重,可以相等也可以不等(我們直接取相等權重進行測試),分層具體操作方法為N等分行業內個股權重累加值,例如圖示行業1中,5只個股初始權重相等(不妨設每隻個股權重為0.2),假設我們欲分成3層,則分層組合1在權重累加值1/3處截斷,即分層組合1包含個股1和個股2,它們的權重配比為0.2:(1/3-0.2)=3:2,同樣推理,分層組合2包含個股2、3、4,配比為(0.4-1/3):0.2:(2/3-0.6)=1:3:1,分層組合4包含個股4、5,配比為2:3。以上方法是用來計算各個一級行業內部個股權重配比的,行業間權重配比與基準組合(我們使用滬深300)相同,也即行業中性。
6. 評價方法:回測年化收益率、夏普比率、資訊比率、最大回撤、勝率等。
這裡我們將展示圖表 12 中 Stacking 模型的分層測試結果。
下圖是分五層組合回測績效分析表(20110131~20180427)。其中組合 1~組合 5 為按該 因子從小到大排序構造的行業中性的分層組合。基準組合為行業中性的等權組合,具體來 說就是將組合 1~組合 5 合併,一級行業內部個股等權配置,行業權重按當期滬深 300 行 業權重配置。多空組合是在假設所有個股可以賣空的基礎上,每月調倉時買入組合 1,賣 空組合 5。回測模型在每個自然月最後一個交易日核算因子值,在下個自然月首個交易日 按當日收盤價調倉。
下面四個圖依次為:
1. 分五層組合回測淨值圖。按前面說明的回測方法計算組合1~組合5、基準組合的淨值,與滬深300、中證500淨值對比作圖。
2. 分五層組合回測,用組合1~組合5的淨值除以基準組合淨值的示意圖。可以更清晰地展示各層組合在不同時期的效果。
3. 組合1相對滬深300月超額收益分佈直方圖。該直方圖以[-0.5%,0.5%]為中心區間,向正負無窮方向保持組距為1%延伸,在正負兩個方向上均延伸到最後一個頻數不為零的組為止(即維持組距一致,組數是根據樣本情況自適應調整的)。
4. 分五層時的多空組合收益圖。再重複一下,多空組合是買入組合1、賣空組合5(月度調倉)的一個資產組合。多空組合收益率是由組合1的淨值除以組合5的淨值近似核算的。
下圖為分十層組合回測時,各層組合在不同年份間的收益率及排名表。每個單元格的內容 為在指定年度某層組合的收益率(均為整年收益率),以及某層組合在全部十層組合中的 收益率排名。最後一列是分層組合在 2011~2018 的排名的均值。其中組合 1 和組合 10在所有回測年份中排名都沒有變化。
下圖是不同市值區間分層組合回測績效指標對比圖(分十層)。我們將全市場股票按市值 排名前 1/3,1/3~2/3,後 1/3 分成三個大類,在這三類股票中分別進行分層測試,基準組 合構成方法同前面所述(注意每個大類對應的基準組合並不相同)。
下圖是不同行業間分層組合回測績效分析表(分五層)。我們在不同一級行業內部都做了 分層測試,基準組合為各行業內該因子非空值的個股等權組合(注意每個行業對應的基準 組合並不相同)。
模型選股測試結果和IC值分析
在“Stacking整合學習中基模型的對比和選取”一章中,我們得出在全A選股情況下,XGBoost_6m以及邏輯迴歸_6m最適合與XGBoost_72m進行Stacking整合,本節中,我們將依次展示以下模型的回測結果。
1. Stacking1:將XGBoost_6m和XGBoost_72m進行整合,驗證集資料為2個月。
2. Stacking2:將邏輯迴歸_6m和XGBoost_72m進行整合,驗證集資料為2個月。
3. Stacking3:將XGBoost_6m和XGBoost_72m進行整合,驗證集資料為3個月。
4. Stacking4:將邏輯迴歸_6m和XGBoost_72m進行整合,驗證集資料為3個月。
5. Stacking5:將XGBoost_6m和XGBoost_72m進行整合,驗證集資料為4個月。
6. Stacking6:將邏輯迴歸_6m和XGBoost_72m進行整合,驗證集資料為4個月。
7. Stacking7:將XGBoost_6m,邏輯迴歸_6m和XGBoost_72m進行整合,驗證集資料為2個月。
對照組模型:
1. XGBoost_72m
2. XGBoost_6m
3. 邏輯迴歸_6m
其中,主要進行三組對比測試:
對比測試1:將Stacking1,Stacking2和對照組模型對比,主要觀察Stacking整合學習相比使用單一模型有哪些區別。
對比測試2:將Stacking1~ Stacking6模型進行對比,主要觀察不同基模型和不同驗證集資料長度對選股結果的影響。
對比測試3:將Stacking1,Stacking2,Stacking7進行對比,主要觀察Stacking中第一層基模型數量對選股結果的影響。
對比測試1
對比測試1將Stacking1,Stacking2和對照組模型對比,主要觀察Stacking整合學習相比使用單一模型有哪些區別。
我們構建了全A選股策略並進行回測,各項指標詳見圖表23,選股策略是行業中性策略,策略組合的行業配置與基準(滬深300、中證500、中證全指)保持一致,各一級行業中選N個股票等權配置(N=2,3,4,5,6)。從圖表23可以看出,XGBoost_72m模型相比XGBoost_6m和邏輯迴歸_6m在年化超額收益率和資訊比率上有很大優勢,但是超額收益最大回撤更大。而Stacking1和Stacking2模型具有和XGBoost_72m相近的年化超收和資訊比率並且超額收益最大回撤也較小,從而取得了最高的Calmar的比率。
上圖展示了對比測試 1 中 5 種模型相對中證 500 的超額收益和回撤的走勢。可以看出,Stacking1 和 Stacking2 模型在保持了較高的超額收益增長率的同時,有效地控制了超額 收益回撤,2017 年以來超額收益最大回撤在 8%以內。
如果將模型的輸出視為單因子,則可以對該單因子進行 IC 值分析,圖表 25 和圖表 26 展 示了 5 種模型輸出值的 IC 值分析結果,可以看出,2011 年至今,Stacking1 和 Stacking2模型的 IC 值都比較穩定,表現接近 XGBoost_72m。特別是在 2015 年至今,Stacking2模型表現最好,顯示出 Stacking 模型在預測能力方面相比單一模型的優勢。
對比測試 1 中各種模型 IC 值累積曲線
對比測試1的結論為:Stacking整合學習有效結合了基模型的優點(XGBoost_72m的高收益、高資訊比率,XGBoost_6m和邏輯迴歸_6m的低迴撤),在各項選股指標上都有不錯的表現。
對比測試2
對比測試2將Stacking1~ Stacking6模型進行對比,主要觀察不同基模型和不同驗證集資料長度對選股結果的影響。
我們構建了全A選股策略並進行回測,各項指標詳見圖表27,選股策略是行業中性策略,策略組合的行業配置與基準(滬深300、中證500、中證全指)保持一致,各一級行業中選N個股票等權配置(N=2,3,4,5,6)。從圖表27可以看出,驗證集資料越長(Stacking5和Stacking6最長,Stacking1和Stacking2最短),年化超額收益率越大,但是超額收益最大回撤也越大,從Calmar比率的角度來看,Stacking2模型表現最好。各模型資訊比率相差不大。
上圖展示了對比測試 2 中 6 種模型相對中證 500 的超額收益和回撤的走勢。
如果將模型的輸出視為單因子,則可以對該單因子進行 IC 值分析,圖表 29 和圖表 30 展 示了 6 種模型輸出值的 IC 值分析結果,從 IR 比率的角度來看,Stacking2 和 Stacking4模型表現最好。
對比測試 2 中各種模型 IC 值累積曲線
從對比測試2中,可以得出兩個結論:
1. 較短的驗證集資料長度(2個月)可以使得Stacking整合學習模型的超額收益最大回撤較小,Calmar比率較高。