『多因子』MultiFactors Alpha Model - 基於因子IC的多因子合成
作者:call 原文鏈接:MultiFactors Alpha Model - 基於因子IC的多因子合成
本文利用 AlphaHorizon 研究了幾個常見因子,進一步嘗試使用QEPM中的最大化因子IC_IR的優化方法組合多個因子。1. 概述
本文利用 AlphaHorizon 研究了幾個常見因子,並初步嘗試了多因子的組合;進一步回測了多因子合成的選股因子:
- 使用多因子等權合成新因子,然後單純做多因子最大的20%股票組合,年化收益率32.0%,阿爾法27.2%,信息比率達到3.79;
- 多頭組合對沖中證500指數後年化收益27.0%,最大回撤僅5.8%;
- 在使用QEPM中的最大化因子IC_IR的優化方法組合多個因子後,能夠明顯提升因子選股的穩定性,信息比率達到4.0,對沖指數後最大回撤僅4.4%;
- 在多因子組合時,使用壓縮方法估算因子IC的協方差矩陣,可以進一步提升因子的信息比率;
2. 因子獲取和處理
2.1 因子獲取
下面為考慮的幾個因子的簡單介紹,這些因子在Uqer的股票因子數據中都可以找得到:
- BP,市凈率倒數
- CFP,市現率倒數
- EP,市盈率倒數
- ILLIQUIDITY,非流動性因子
- REVS20,過去二十天收益,反轉因子
- SRMI,修正動量指標
- VOL20,過去二十天換手率平均
下面展示一個典型的因子數據DataFrame:
- index 為交易日
- columns 為所有股票
2.2 因子處理
計算得到的原始因子數據,因為有極值等原因,需要做進一步處理:
- winsorize,去極值
- neutralize,中性化,消除行業和風格因子等的影響
- standardize,標準化
- orthogonalize,殘差正交化調整,因子間存在較強同質性時,使用施密特正交化方法對因子做正交化處理,用得到的正交化殘差作為因子
這是因子處理的標準流程,其中前三步是針對單個因子,很容易自己實現,也可以很方便在Uqer實現,具體請參考魏老師破解Alpha對沖策略。第四步是當我們有多個因子時,才會進行的處理手段,本文中並未考慮。
在Uqer上處理一個因子的函數可以簡單寫成:def neutralize_factor(factor_df)
3. 單因子研究
單因子研究過程此處略過,具體可見非流動性因子ILLIQ。因為後面需要進行基於IC的因子權重優化,所以此處簡單說明一下計算IC的方法:
- 因子IC(Information Coefficient)定義可以參考Information Coefficient。本文中的IC,計算的是本期因子值和下期股票收益的秩相關係數,即Spearman"s rank correlation coefficient。
通過AlphaHorizon,可以很方便地得到各個因子的IC時間序列。
4. 基於因子IC的信號合成
當有多個信號時,經常需要進行多個信號的合成,最簡單的方法當然是等權合成信號。更進一步,可能會考慮信號的優化合成。此部分參考了社區minghong的帖子基於因子IC的多因子模型,在此表示感謝。
4.1 最大化IR優化
本節中,我們基於QEPM中的方法,嘗試做信號合成,該優化模型簡單介紹如下:
- 因子的IR(信息比率)值為因子IC的均值和因子IC的標準差的比值,IR值越高越好
- 假設有M個因子,其IC的均值向量為=(,,?,)T,IC的協方差矩陣為 Σ。如果各因子權重向量為 =(,,?,)T,則複合因子的IR值為:
- 我們的目標就是要最大化複合因子的IR,我們可以通過Python的優化函數求解
- 實際上,該問題比較簡單,可以直接求解析解,IR求導以後,可以得到以上最值問題的解,因子的最優權重向量為:
4.2 因子IC協方差矩陣的收縮估計
在計算因子IC的協方差矩陣時,最簡單的是使用的協方差矩陣的無偏估計即使用樣本協方差陣Σ^。問題在於,Uqer上有幾百個因子,我們的協方差矩陣就不一定可逆。即便它是可逆的,樣本協方差矩陣的逆矩陣也不是協方差矩陣逆矩陣的無偏估計,實際上在正態分布假設下有:
- 其中M指因子個數,T指樣本期,即取前幾期的數據
- 如果T和M的大小比較接近,樣本協方差矩陣逆的估計偏差將非常之大
基於以上問題,有人提出了一種壓縮估計的方法。它的基本思想使用一個方差小但偏差大的協方差矩陣估計量Φ^作為目標估計量,和樣本協方差矩陣做一個調和,犧牲部分偏差來獲得更穩健的估計量:
參數λ通過最小化估計量的二次偏差得到,至於估計量Φ^的選擇,有以下三種形式可供參考:- Ledoit(2004) 單參數形式,可以表示為方差乘以一個單位矩陣
- Ledoit(2003b) CAPM單因子結構化模型估計
- Ledoit(2003a) 平均相關係數形式
這裡採用第一種形式,並在計算中使用了sklearn.covariance中的LedoitWolf包。
4.3 基於IC的因子權重
接下來,我們使用開頭提到的多個因子,進行第二節中的信號處理之後,用第三節的方法計算出每個因子的IC時間序列。然後按照滾動窗口計算因子IC的均值向量和協方差矩陣,進一步得到各個因子的權重。此處為了對比,我們同時使用樣本協方差矩陣和壓縮估計的協方差矩陣來按照前面的討論計算因子權重。
兩種方法估算因子IC的協方差矩陣,進而得到兩種不同的因子權重:
- ic_weight_df,使用Sample 協方差矩陣估算
- ic_weight_shrink_df,使用 Ledoit-Wolf 壓縮方法得到的協方差矩陣估算
下面計算中的滾動窗口為120天,即計算每一天的因子權重時,使用了之前6個月的IC時間序列來計算IC均值向量和IC協方差矩陣。
4.4 使用不同權重構造複合因子
我們重點考察三種不同權重構造的因子:
- 等權,即上述多個因子的值簡單等權相加
- SampleCov,使用Sample 協方差矩陣估算方法得到的因子權重
- ShrinkCov,使用 Ledoit-Wolf 壓縮的協方差矩陣估算方法得到的因子權重
注意:複合因子的計算中,需要注意IC的定義以避免未來函數,當期的IC的計算其實是用到了下期的收益數據,所以使用因子權重的時候,其實是要再往前推一期(此處為周度調倉,故往前推5天)才不會用到未來數據!構造因子之後,保存好文件以備使用。
5. 合成因子的簡單分析
本節中,我們使用AlphaHorizon,簡單分析上一節合成的因子,以等權合成的因子為例。
5.1 數據載入
需要載入和處理的數據包括:
- 回測起止日期
- 股票行業數據
- 合成因子數據
- 股票價格數據
["000001.XSHE", "000002.XSHE", "000004.XSHE", "000005.XSHE", "000006.XSHE"]
tradeDate secID
2016-05-31 603968.XSHG 0.652980
603969.XSHG 0.272819
603979.XSHG -0.223850
603988.XSHG 0.139030
603989.XSHG 0.353725
603993.XSHG -0.544944
603996.XSHG -1.118224
603997.XSHG 0.179601
603998.XSHG 0.230723
603999.XSHG -0.246553
因子數據分布圖,可以大致看出我們的合成因子的分布情況
5.2 因子預測能力分析
5.2.1 分位數組合超額收益
- 將股票按照因子分為不同的分位數組合,默認分為5分位
- 計算每個分位數組合的超越市場平均的超額收益(第5節單因子回測中的超額收益都是超越市場平均這一基準)
- 分位數由小到大,組合超額收益由負到正,非常單調,顯示出因子有著很好的選股能力
5.2.2 分位數組合凈值走勢
- 將股票按照因子分為不同的分位數組合,此處分為5分位
- 平均持有不同分位數組合,獲得的超額收益構成的凈值走勢
5.2.3 因子選股構建組合回測凈值走勢
三種方法構建組合:
- 等權做多最好分位,做空最差分位
- 等權做多最好分位
- 因子值作為權重構建組合
5.2.4 因子的月度IC熱度圖
- 圖中顏色越紅表示IC越大,也即表示因子在這個月表現良好;顏色越綠表示因子在這個月表現不佳;
- 注意,一頭一尾的綠色是因為沒有回測數據而IC為nan
- 可以注意到,等權合成的因子IC表現出了很好的穩定性,月度IC大部分情況下都為正
5.2.5 因子的IC衰減
- IC衰減,其實就是計算當期因子對於延後一段時間的一期股票收益的IC
- 由IC衰減圖可以看到,我們合成的IC其實衰減是比較快的,究其原因,是因為我們選擇了不少技術類因子
6. 合成因子的Uqer回測
上一節中使用AlphaHorizon簡單地對我們合成的因子進行了回測分析,不過該分析比較粗糙,沒有考慮漲跌停等原因。接下來我們將合成因子上傳,在uqer做更加真實的回測。
6.1 首先載入計算好的數據文件:
6.2 合成因子截面特徵
接下來,我們簡單檢查一下我們計算得到的因子的截面特徵
上圖給出了2009年至2016年間,在不同時點,將市場上所有股票按因子分10組後,第1組、第5組以及第10組股票因子的均值情況,即我們所說的截面特徵:
- 觀察可知,因子的截面特徵較為穩定
6.3 因子選股的市值分布特徵
檢查因子的小市值暴露情況。因為很多策略因為小市值暴露在A股市場表現優異。
- 上圖展示,該選股因子並沒有明顯的市值暴露
- 實際上,市值因子已經在之前的單因子中性化中處理掉了,所以合成因子理應無市值暴露
6.4. 因子歷史回測凈值表現
6.4.1 簡單做多策略
接下來,考察因子的選股能力的回測效果。歷史回測的基本設置如下:
- 回測時段為2010年1月1日至2016年6月1日
- 股票池為A股全部股票
- 組合每5個交易日調倉,交易費率設為雙邊萬分之二
- 調倉時,漲停、停牌不買入,跌停、停牌不賣出;
- 每次調倉時,選擇股票池中因子最大的20%的股票;
6.4.2 因子選股 —— 不同五分位數組合回測走勢比較
上圖顯示出,因子選股不同五分位構建等權組合,在uqer進行真實回測的凈值曲線。其中的對沖凈值不同分位走勢和5.2.2節中AlphaHorizon中的簡單回測略有差別,但都顯示出我們合成的因子的選股能力,不同五分位組合凈值曲線隨時間推移逐漸散開。6.4.3 因子權重的三種計算方法對比
4.4節中,有三種不同權重構造的因子:
- 等權,即上述多個因子的值簡單等權相加
- SampleCov,使用Sample 協方差矩陣估算方法得到的因子權重
- ShrinkCov,使用 Ledoit-Wolf 壓縮的協方差矩陣估算方法得到的因子權重
此處我們分別在uqer回測。
- 通過信息比率可以看到,在使用QEPM中的最大化因子IC_IR的優化方法組合多個因子後,能夠明顯提升因子選股的穩定性;
- 使用壓縮方法估算因子IC的協方差矩陣,可以進一步提升因子的信息比率;
優礦期貨回測框架已上線,quartz新增
- 更加豐富的調倉頻率refresh_rate形態;
- 新增組合分析可視化工具;
- 支持獲取股票的非復權行情數據;
- 支持獲取多benchmark的歷史行情數據;
- 增加DynamicUniverse解決生存者偏差問題;
推薦閱讀: