用多因子策略構建強大的加密資產投資組合 #大類因子分析:因子合成篇#
^作者:LUCIDA \& FALCON^
書接上回,關於《用多因子模型構建強大的加密資產投資組合》系列文章中,我們已經發布了三篇:《理論基礎篇》、《數據預處理篇》、《因子有效性檢驗篇》。
前三篇分別解釋了多因子策略的理論與單因子測試的步驟。
一、因子相關性檢驗的原因:多重共線性
我們透過單因子測試部分篩選出一批有效因子,但以上因子不能直接入庫。因子本身可以根據具體的經濟含義進行大類劃分,同類型的因子間存在較強的相關性,若不經相關性篩選直接入庫,根據不同因子進行多元線性回歸求預期收益率時,會出現多重共線性問題。計量經濟學中,多重共線性是指回歸模型中的一些或全部解釋變量存在"完全"或準確的線性關係(各變量間高度相關)。
因此,有效因子篩選出後,首先需要根據大類對因子的相關性進行T檢驗,對於相關性較高的因子,要麼捨棄顯著性較低的因子,要麼進行因子合成。
多重共線性的數學解釋如下:
多重共線性導致的後果:
1.完全共線性下參數估計量不存在
2.近似共線性下OLS估計量非有效
二、步驟一:同類型因子的相關性檢驗
檢驗新求出的因子與已入庫因子的相關性。通常來說,有兩類數據求相關性:
1.根據所有token在回測期間的因子值求相關
2.根據所有token在回測期間的因子超額收益值求相關
三、步驟二:因子取捨、因子合成
對於相關性較高的因子集合,可以採取兩種方式處理:
(1)因子取捨
根據因子本身的ICIR值、收益率、換手率、Sharpe 比率,挑選某維度下最有效的因子進行保留,刪除其他因子。
(2)因子合成
對因子集合中的因子進行合成,截面上盡可能多的保留有效信息
假設當前有3個待處理的因子矩陣:
synthesis = pd.concat([a,b,c],axis = 1)
synthesis
a b c
BTC.BN 0.184865 -0.013253 -0.001557
ETH.BN 0.185691 0.022708 0.031793
BNB.BN 0.242072 -0.180952 -0.067430
LTC.BN 0.275923 -0.125712 -0.049596
AAVE.BN 0.204443 -0.000819 -0.006550
... ... ... ...
SOC.BN 0.231638 -0.095946 -0.049495
AVAX.BN 0.204714 -0.079707 -0.041806
DAO.BN 0.194990 0.022095 -0.011764
ETC.BN 0.184236 -0.021909 -0.013325
TRX.BN 0.175118 -0.055077 -0.039513
2.1 等權加權
各因子權重相等(w=1/因子個數),綜合因子=各因子值加總求平均。
Eg.動量類因子,一個月收益率、兩個月收益率、三個月收益率、六個月收益率、十二個月收益率,這六個因子的因子載荷各占1/6的權重,合成新的動量因子載荷,然後再重新進行標準化處理。
`synthesis1 = synthesis.mean(axis=1) # 按行求均值
`
2.2 歷史IC加權、歷史ICIR、歷史收益加權
用回測期的IC值(ICIR值、歷史收益值)對因子進行加權。過去有很多期,每一期都有一個IC值,所以用它們的均值作為因子的權重。通常使用回測期IC的均值(算數平均值)作為權重。
# 權重歸一化(後文中的因子加權方式也基本都需要進行權重歸一化)
w_IC = ic.mean() / ic.mean().sum()
w_ICIR = icir.mean() / icir.mean().sum()
w_Ret = Return.mean() / Return.mean().sum()
synthesis2 = (synthesis * w_IC).sum(axis=1)
synthesis2 = (synthesis * w_ICIR).sum(axis=1)
synthesis2 = (synthesis * w_Ret).sum(axis=1)
2.3歷史IC半衰加權、歷史ICIR半衰加權
2.1與2.2都是計算算數平均值,回測期的每一次IC、ICIR對於因子的作用被默認為相同。
但現實中,回測期的每一期對於當期的影響程度不完全相同,存在時間上的衰減。越接近當期的時期,影響越大,越遠影響越小。在此原理,求IC權重前首先定義一個半衰權重,距離當期越近的權重值越大、越遠權重越小。
半衰權重數學推導
2.4 最大化ICIR加權
透過求解方程,計算最優因子權重w使得ICIR最大化
協方差矩陣的估計問題:協方差矩陣用於衡量不同資產之間的關聯性。統計學中常以樣本協方差矩陣代替總體協方差矩陣,但在樣本量不足時,樣本協方差矩陣與總體協方差矩陣的差異會很大。所以有人提出了壓縮估計的方法,原理是使估計協方差矩陣與實際協方差矩陣之間的均方誤差最小
方式:
1.樣本協方差矩陣
# 最大化ICIR加權(樣本協方差)
ic_cov = np.array(ic.cov())
inv_ic_cov = np.linalg.inv(ic_cov)
ic_vector = np.mat(ic.mean())
w = inv_ic_cov * ic_vector.T
w = w / w.sum()
synthesis4 = (synthesis * pd.DataFrame(w,index=synthesis.columns)[0]).sum(axis=1)
2.Ledoit-Wolf收縮:引入一個縮小系數,將原始的協方差矩陣與單位矩陣進行混合,以減少噪音的影響。
# 最大化ICIR加權(Ledoit-Wolf壓縮估計協方差)
from sklearn.covariance import LedoitWolf
model=LedoitWolf()
model.fit(ic)
ic_cov_lw = model.covariance_
inv_ic_cov = np.linalg.inv(ic_cov_lw)
ic_vector = np.mat(ic.mean())
w = inv_ic_cov*ic_vector.T
w = w/w.sum()
synthesis4 = (synthesis * pd.DataFrame(w,index=synthesis.columns)[0]).sum(axis=1)
3.Oracle近似收縮:對Ledoit-Wolf收縮的改進,目標是透過對協方差矩陣進行調整,從而在樣本大小較小的情況下更準確地估計真實的協方差矩陣。(編程實現與Ledoit-Wolf收縮同理)
2.5 主成分分析PCA
主成分分析(Principal Component Analysis,PCA)是一種用於降維和提取數據主要特徵的統計方法。其目標是透過線性變換,將原始數據映射到一個新的坐標系,使得數據在新坐標系下的方差最大化。
具體而言,PCA首先找到數據中的主成分,也就是數據中方差最大的方向。然後,它找到與第一個主成分正交(無關)且具有最大方差的第二個主成分。這個過程一直重複,直到找到數據中所有的主成分。
# 主成分分析(PCA)
from sklearn.decomposition import PCA
model1 = PCA(n_components=1)
model1.fit(f)
w=model1.components_
w=w/w.sum()
weighted_factor=(f*pd.DataFrame(w,columns=f.columns).iloc[0]).sum(axis=1)