2019年春。

依據多因子模型,嘗試對滬深300指數構建純因子組合。

如果一個投資組合,對模型中某因子暴露度為1,對其他風險因子暴露度為0,則稱該組合為這個因子的純因子組合。

——《多因子模型系列報告之一:模型理論隨想和純因子組合構建》

Step 1:因子資料庫構建

因子數據分為風格因子風險因子

其中風格因子又分為大類因子細分類因子,最終的風格因子會由細分類因子合成。

風格因子共選取以下7個大類中的19個因子:

  • VALUE:EPS_TTM/P、BPS_LR/P、CFPS_TTM/P、SP_TTM/P
  • GROWTH:NetProfit_SQ_YOY、Sales_SQ_YOY、ROE_SQ_YOY
  • PROFIT:ROE_TTM、ROA_TTM
  • QUALITY:Debt2Asset、AssetTurnover、InvTurnover
  • MOMENTUM:Ret1M、Ret3M、Ret6M
  • VOLATILITY:RealizedVol_3M、RealizedVol_6M
  • LIQUIDITY:Turnover_ave_1M、Turnover_ave_3M

風險因子選取以下2個大類中的2個因子:

  • INDUSTRY:中信一級行業
  • SIZE:Ln_MarketValue

由於數據限制和平臺選擇,最終確定的因子和最初選取的因子比較如下:

因子選取

註:

  • Ret1M, Ret3M, Ret6M 皆由 PCT_CHG合成;
  • RealizedVol_3M, RealizedVol_6M 皆由 UNDERLYINGHISVOL_90D代替。)

數據來源為萬德金融資料庫,通過WindPy API獲取。

其中「最終確定因子」列即為因子的萬德指標欄位名。 (數據保存在「H3 Data」 ("HS300 Data" 的縮寫) 文件夾中,格式為CSV,直接用全小寫的萬德指標名命名。 即 "<萬德指標名>.csv",如 "pe_ttm.csv") 獲取的原始數據儲存在"H3 Data/Raw Data"文件夾裏。
數據格式

Step 2:因子數據處理

對因子數據進行處理。

如圖為作為例子選取的滬深300的9個因子暴露數據在2005~2018年的分佈統計圖。??

滬深300的9個因子暴露數據在2005~2018年的分佈統計圖

從圖中可以看出絕大多數因子都存在極差過大、分佈不均的現象。 而這樣的數據會影響到統計分析的結果,所以需要對數據進行處理。

2.1 填補缺失值

由於萬德輸出的當季度財務數據只在報告期有數據,而在該季度的其他月份沒有數據,所以針對這個現象採用「向前填充」來填補缺失值。

data.fillna(method = ffill, inplace = True)

填補前:

填補前

填補後:

填補後

2.2 去極值

去極值的方法採用調整因子值中的離羣值至指定閾值的上下限,從而減小離羣值極值對統計的偏差。

離羣值的閾值上下限定義的方法主要有三種:

  1. MAD法
  2. 3σ法
  3. 百分位法

實際上,即使經過調參儘可能地使三種主流的去極值方法的結果互相接近,並不至於出現過於集中的閾值,仍然有可能出現非常顯著不同的效果。

營業收入同比增長率為例,將原始數據和三種去極值的方法處理後的因子數據放在同一張圖裡,由於值域相差太大,甚至根本無法從圖中找到不同的方法對應的圖表。(如下圖:分別採用三種去極值方法處理後的每股現金流數據與其原始數據圖??)

分別採用三種去極值方法處理後的每股現金流數據與其原始數據圖

究其原因,是其原始數據的集中度就非常高,以至於不同方法去極值計算出相差甚遠的閾值。(如下圖:全部A股樣本期內營業收入同比增長率的密度分佈圖??)

全部A股樣本期內營業收入同比增長率的密度分佈圖

所以經過百分位去極值後,儘管值域縮小了近100倍,但仍然非常集中。

(如下圖:營業收入同比增長率經過約束最嚴格的百分位去極值處理後的分佈圖??)

營業收入同比增長率經過約束最嚴格的百分位去極值處理後的分佈圖

另外,這種離差過大的數據去極值的時候還會出現一個問題:造成閾值部分出現異常高的「虛假」數據,而這也是我們不願意看到的。

注意圖中 [-50, 150] 處異常的「突起」。??

這是由於過多超出上下閾值的數據被迫調整為上下閾值,導致閾值處的數據分佈特別密集。

但在大多數情況下(數據分佈相對均勻時,此處以ROE為例),各種方法以及原始數據相差不大。(如下圖:資產周轉率數據的原始數據及分別經過三種去極值方法處理後的分佈圖??)

資產周轉率數據的原始數據及分別經過三種去極值方法處理後的分佈圖

經過比較研究,我們最終選取閾值選取相對最為合理,較少閾值異常「突起」,同時保留較寬值域的參數值為60的MAD法進行去極值處理。

參數值為60的MAD法

2.3 標準化

標準化處理數據的目的就是去除其量綱

這樣做可以使得:

  • 數據更加集中
  • 不同數據之間可以互相比較和進行回歸等

主流的標準化的方法有兩種:

標準化方法

它們都能使得數據的:

  • 均值為0
  • 標準差為1

由於已經對數據進行去極值處理,我們最終選取對原始因子值進行標準化(z-score)的方法進行標準化。

經過

  • 2.1填補缺失值
  • 2.2去極值
  • 2.3標準化

的數據處理後的數據保存在"H3 Data/Processed Data"文件夾裏。

(如下圖為經過以上數據處理步驟後的數據密度分佈圖一覽??)

經過以上數據處理步驟後的數據密度分佈圖

2.4 中性化

2.4.1 中性化研究

中性化的目的是剔除數據中多餘的風險暴露。

根據某些因子(指標)選股的時候,由於某些因子之間具有較強的相關性,故時常會有我們不希望看到的「偏向」,導致投資組合不夠分散

中性化的主要做法就是通過回歸得到一個與風險因子(行業因子、市值因子)線性無關的因子。如此一來,中性化處理後的因子與風險因子之間的相關性就嚴格為零。

不過這樣做中性化並不一定總能徹底地剔除因子的多餘信息。因為線性回歸要求兩個前提假設:

  • 因子之間線性相關
  • 殘差正態獨立同分布

而在因子數據中這兩個假設都不一定成立。

(例如在2.2去極值步驟中密度過高的閾值就對數據的分佈造成了破壞)

但直觀的說,根據Brinson資產配置分析超額收益理論來看,如果投資組閤中風險因子配置資產權重等於基準資產中其之權重,則做到了中性化。

此處簡便起見,我們依然採用線性回歸作為中性化的處理方法。

回歸方式如下:

  • 被解釋變數:前述數據處理後的因子數據
  • 解釋變數:
  • 市值因子
  • 行業因子

最終回歸方程的殘差項即為中性化後新的因子暴露。

2.4.2 行業中性化

我們可以通過觀察因子暴露度(或IC值)與行業的分佈結果(或其相關度)來判斷是否需要進行行業中性化。

滬深300股票指數中共包含17個行業(根據申萬一級行業分類),分別統計滬深300指數中各行業四個指標的平均值,結果如下圖所示??。

本例中選取的四個指標:

  • 市現率
  • 凈利潤同比增長率
  • 凈資產收益率同比增長率
  • 存貨周轉率

從圖中可以看到,不同行業的不同指標相差十倍、千倍乃至萬倍都有。

有色金屬行業的平均市現率是銀行業的近負四十萬倍。

那麼,依據市現率因子選取出的股票必然對平均市現率高的行業有偏向,而我們希望投資組閤中的行業儘可能分散,以避免特定行業的風險,故我們希望對行業進行中性化。

實際進行行業中性化的時候,行業因子作為被解釋變數以啞變數(即指示變數,為一隻包含0和1的矩陣)的形式進行回歸。

(如下圖,為選取四個因子指標進行行業中性化前後的結果,以展示行業中性化的一般結果??,可以看出行業中性化之後,數據的分佈更均勻、更接近均值)

行業中性化之後

2.4.3 市值中性化

與行業中性化類似,我們通過觀察因子暴露數據在不同市值區間的分佈判斷是否需要對市值進行中性化,以避免特定市值區間的風險。

實際進行市值中性化的時候,直接使用對數市值 ("val_lnmv") 進行回歸。

對市值進行中性化也有與行業中性化類似的效果。(如下圖為對"pb_lf"因子進行市值中性化的結果??)

對&quot;pb_lf&quot;因子進行市值中性化

2.4.4 行業、市值中性化

同樣是"pb_lf"因子,同時對市值和行業進行中性化??,效果也是相近的。

經過中性化處理後的數據保存在"H3 Data/Neutralized Data"文件夾裏。

最終經過所有因子數據處理步驟之後,原來的因子數據分佈圖變為了這樣。

(經過所有數據處理步驟後的因子數據密度分佈圖一覽??)

經過所有數據處理步驟後的因子數據密度分佈圖

可以看出數據經過處理後分佈變得更加接近標準正態分佈了一些。

數據處理前後對比

Step 3:大類因子合成

前面兩個步驟已經把風格因子的細分類因子數據經過數據處理並保存了下來, 這一步把細分類因子合成為大類因子。使得最終合成後只剩下:

  • VALUE
  • GROWTH
  • PROFIT
  • QUALITY
  • VOLATILITY
  • MOMENTUM
  • LIQUIDITY

這七個因子,我們的目標就是構建這七個因子的純因子組合

雖然我們已經選出了在主觀上與收益率有顯著關係的因子池,但因子彼此之間(尤其是同一大類下所屬的因子)有可能存在很強的相關性。如果不做處理,投資組合會在同種因子類型上暴露過多風險,由此導致的多重共線性會導致多元線性回歸的結果偏差。

換言之,合成後的大類因子之間不應該具有明顯相關性。

我們通過(動態或靜態的)IC_IR加權方法來合成大類因子,根據收益-風險原則,考慮因子的有效性和穩定性。

  • IC(信息係數):每個時間截點上因子在各個股票暴露度和股票下期收益的相關係數(Spearman或Pearson)。意味著因子暴露度與未來收益率之間的相關關係。
  • IR(信息比率):殘差收益率的年化預測值與其年化波動率(此處取年化標準差)之比。衡量因子每承擔一單位風險能創造的超額收益

大類因子合成部分的數據保存位置:

  • 動態權重:在"H3 Data/Large Factor Dynamic Data"文件夾裏
  • 靜態權重:在"H3 Data/Large Factor Static Data"文件夾裏

Step 4:收益預測模型

通過股票收益率數據,對合成好的大類因子數據(因子暴露)進行回歸,利用回歸係數(因子收益),採取一定方式來預測下一期的因子收益,從而進行股票收益率預測。

由於核心在於因子收益的預測,此處簡便起見直接採用過去一年月度因子收益的均值,作為下一期因子收益的預測值,最後來構建股票收益預測模型。

4.1 多元線性回歸

進行多元線性回歸。

為解決異方差性,使用了WLS加權最小二乘法進行回歸。 每次回歸的R2如下,可以看出模型的解釋性較好。

截面回歸R2
R2表現

4.2 估計因子預期收益

由多元線性回歸可以得到所有因子的歷史收益率序列,使用歷史數據估計T+1期因子預期收益率的方法有很多種。

此處採取歷史均值法,N=12。(即採取前12個月的因子歷史收益率均值作為T+1期因子的預期收益率)

4.3 計算股票預期收益

根據因子預期收益估計值與T期因子載荷矩陣得到股票預期收益:

即可計算出T+1期個股的預期收益率。

4.4 模型結果輸出以及模型評估

由4.1~4.3得到的預期收益模型,我們可以計算出300個股票T+1期(2019年2月)的預期收益率.

同時,通過萬德資料庫獲取300個股票T+1期的真實收益率。

回歸預測報告:

  • MSE值(均方差):0.067
  • RMSE值(均方根):0.259.

預測值與真實值對比如圖:

預測值與真實值

預測值與真實值之比如圖:

預測值與真實值之比

我們發現問題在於使用歷史因子收益平均值作為預測值時,正負值進行平均後估計值接近0,如圖為最近一月的因子收益與最近12月因子收益平均值對比圖:

最近一月的因子收益與最近12月因子收益平均值

因此我們採取單獨的預測模型對其進行預測,此處採用ARIMA模型。

4.4.1 ARIMA

如圖為前三個因子的趨勢圖以及ACF和PACF

前三個因子的趨勢圖以及ACF和PACF

通過觀察及調參,我們最終對每個因子分別採用不同的ARIMA模型進行時序預測。

4.4.2 結論

本身平穩的因子有:

  • VALUE
  • PROFIT
  • MOMENTUM
  • LIQUIDITY
  • 行業因子:
  • 房地產
  • 通信
  • 家用電器
  • 機械設備
  • 非銀金融
  • 汽車
  • 化工
  • 電子
  • 醫藥生物
  • 有色金屬
  • 鋼鐵
  • 國防軍工
  • 綜合
  • 農林牧漁
  • 採掘
  • 交通運輸
  • 商業貿易
  • 建築裝飾
  • 電氣設備
  • 輕工製造
  • 紡織服裝

Step 5:組合優化,構建純因子模型

  • 優化目標:組合預期收益率最大化
  • 約束條件:
  • 對目標純因子不做約束
  • 對非目標純因子偏離要求不超過 0.03
  • 風險因子行業和市值
  • 偏離不超過 0.03

根據上一個步驟構造的收益預測模型,以最大化預期收益率為優化目標,構建純因子模型。

我們通過對因子進行約束來構造對某一個因子具有高暴露度,而對其他因子保持中性的投資組合。

我們通過動態規劃的方式優化模型以在約束條件內達到目標,最終構建滬深300指數純因子組合。


參考文獻:

  • 《The Barra US Equity Model (USE4)》
  • 《華泰多因子模型系列初探,華泰證券》
  • 《單因子有效性檢驗——多因子選股模型的基石,東方證券》
  • 《低特質波動,高超額收益(因子選股系列之二),東方證券》

原文檔、代碼、數據都保存在我的Github。

未完待續。

推薦閱讀:

相關文章