可關注個人公眾號:信號處理與機器學習 wave_cottage

由於金融數據信噪比極低,為了魯棒性和可解釋性,傳統選股都採用的線性模型和一些線性模型簡單改進,需要解決共線性的問題。如果不正交化處理,會導致組合重複暴露於某個因子。在多因子加權時有必要對因子的相關性進行處理,最理想的情況是加入與現有因子具有高相關性的因子時組合的表現基本保持不變。一種處理因子共線性的方法是對因子進行線性變換得到一組新因子集合,這些新因子包含了原有因子的特徵而互相之間沒有相關性,即得到一組互相正交的因子。基於這樣一組新因子進行多因子組合加權,就能夠更好地控制組合在各因子上的暴露,降低因子共線性對於組合的影響,這需要將因子正交化處理。

其實非線性模型也會受到因子共線性的困擾,比如神經網路就相當於一個遞歸的廣義線性模型g(wx+b),g是激活函數,然後遞歸到下一層,進行因子正交化很有必要。

因子正交化,其本質上是對原始因子通過一系列線性變換進行旋轉,旋轉後得到一組兩兩正交的新因子,它們之間的相關性為零並且對於收益的解釋度(即整體的方差)保持不變。相關性為零保證了旋轉後的因子之間沒有共線性,而解釋度保持不變保證了原始因子包含的信息能夠被保持。

推薦採用對稱正交方法,對稱正交法是使正交前後矩陣距離最小的正交方式,對正交前後的因子相關性保持得非常好,可解釋性較高,並且計算不依賴歷史數據以及收益率數據,計算效率較高,因此推薦使用對稱正交方法來剔除因子間的多重共線性。

import numpy as np

對稱正交代碼:factor_matrix N*M矩陣,N因子數,M股票數

def SymmetricOrthogonal(factor_matrix):

N =factor_matrix.shape[0]

Mmatrix =np.cov(factor_matrix)*(N-1)

e,Umatrix=np.linalg.eig(Mmatrix)

Dmatrix =np.diag(1.0/np.sqrt(e))

Smatrix =np.dot(np.dot(Umatrix,Dmatrix),Umatrix.transpose())

orth_factor =np.dot(Smatrix,factor_matrix)

return orth_factor

因子正交詳細內容可參考:因子正交全攻略——理論、框架與實踐【天風金工因子選股系列之六】


推薦閱讀:
相關文章