這篇文章是《使用多因子模型建立強大的加密貨幣資產投資組合》系列中的第三篇。文章詳細介紹了基於因子效應檢定的方法:IC / IR方法、T值(迴歸法)和分層回測法。 IC / IR方法透過IC檢驗因子預測代幣收益能力,IR測定因子獲得穩定α的能力。 T值檢定法是檢驗本期因子值與下期因子關係,迴歸後的迴歸率檢定顯著性。分層回測法首先對token進行分層,然後根據分層計算每組token組合的本質。文章還提供了每種方法的程式碼實作。
書接上回,關於《用多因子模型建立強大的加密貨幣資產投資組合》系列文章中,我們已經發布了兩篇:《理論基礎篇》、《數據損失篇》
本文為第三篇:因素效應檢定。
在求出具體的因子值後,需要先對因子進行效應檢驗,篩選符合顯著性、穩定性、單調性、特定要求的因子;因子效應檢定透過分析期因子值與目標產物的主要有3種經典方法:
IC / IR法:IC / IR測定細胞激素值與預期的相關因子,增大細胞激素表現較好。 T值(迴歸法):T值反映了下期細胞激素值對本期細胞激素值線性迴歸後因子的顯著性,透過比較此細胞激素值是否通過檢驗,來判斷本期細胞激素值對下期細胞因子值的貢獻程度,通常用於多元(即多因子)迴歸模型。測分層測法:分層回測法依因子值對token分層,再計算每層token的具體情況,進而判斷因子的單調性
一、IC/IR法
(1)IC/IR的定義
IC:即資訊因子資訊係數,代表因子預測代幣收益的能力。其中期IC相當於本期因子值及下期因子的相關因子。
ICₜ=相關性(fₜ,Rₜ₊₁)
fₜ: 第t期因子值
Rₜ₊₁: 第t+1 期令牌的本質
IC∈(-1,1),IC越大的因子,選幣能力越強。
IC越接近1,說明因子值與下期均勻的正相關性越強,IC=1,表示該因子選幣100%準確,對應的是排名分最高的令牌,選出來的令牌在下個調倉週期中,漲幅最大;
IC越接近-1,表示因子值與下期的負相關性越強,如果IC=-1,則代表排名最高的token,在下個調倉週期中,跌幅最大,是一個完全反指的指標;
若IC越接近0,表示該因子的預測能力極為弱,表示該因子對於token沒有任何的預測能力。
IR:資訊與資訊之比,代表因子獲得穩定α的能力。 IR為所有期IC平均值除以所有期IC標準差。
IR=平均值(ICₜ)/標準值(ICₜ)
當IC的絕對值大於0.05(0.02)時,因子的選股能力抑制。當IR大於0.5時,因子穩定獲得超額收益能力。
(2)IC的計算方式常態IC(皮爾遜相關):計算皮爾森相關係數,最經典的一種相關係數。但此計算方式存在機率假設前提:資料連續,常態分佈,雙變數線性關係等等。
ICₚₑₐᵣₛₒₙ,ₜ=cov(fₜ,Rₜ₊₁)/√var(fₜ)var(Rₜ₊₁) =Σᵗₜₜ₁ (Lₜ-₊₁) =Σₗₜ₂₁ (f5,42₁₵₵₵₵₵₵₵₁₁₁₁₵₵₵₵₵₵₵₁₁₁₁₁₁₵₵₵₵₁₁₁₁₁₁₁₁₁₁₁₁₁₁₁₁₁₁₁ ₜ₌₁( fₜ -fₜ)²(Rₜ₊₁,Rₜ₊₁)²
Rank IC(Spearman’srankcoefficient of Correlation):計算斯皮爾曼等級相關係數,先對兩個變數排序,再依照排序後的結果求皮爾森相關係數。斯皮爾曼等級相關係數評估的是兩個變數之間的單調關係,由於轉換為排序值,受資料異常值影響減弱;而皮爾森相關關係係數評估的是兩個變數之間的線性關係,不僅對原始資料有一定的前提條件,而且受資料異常值影響增加。在現實計算中,要求排名IC更符合。 (3)IC/IR法代碼實現
建立一個按日期時間升序排列的唯一日期時間值的清單— 調音記錄倉日期def choosedate(dateList,cycle)
TestAlpha 類別(物件):
def __init__(self,ini_data):
self.ini_data = ini_data
def selectDate(自我,週期,開始日期,結束日期):
”’
週期:日、月、季、年
df: 原始資料框df,日期列的處理
”’
選擇日期 = []
日期列表= 排序(self.ini_data[self.ini_data[‘date’]. 之間(開始日期,結束日期)][‘date’].drop_duplicates().values)
日期列表= pd.to_datetime(日期列表)
對於範圍內的i(len(dateList)-1):
if getattr(日期列表[i]循環) != getattr(dateList[i + 1], 循環):
選擇日期.append(日期列表[i])
選擇日期.append(日期列表[-1])
選擇日期 = [date.strftime(‘%Y-%m-%d’) for date in chooseDate]
返回選擇日期
def ICIR(自我,選擇日期,因素):
# 1.先展示每個調倉日期的IC,即ICt
testIC = pd.DataFrame(index=chooseDate,列=[‘normalIC’,’rankIC’])
dfFactor = self.ini_data[self.ini_data[‘date’].isin(選擇日期)][[‘date’,’name’,’price’,factor]]
對於範圍內的i(len(chooseDate)-1):
# (1) 正常IC
X = df 因子[dfFactor[‘date’] == 選擇日期[i]][[‘date’,’name’,’price’,factor]].rename(columns={‘price’:’close0′})
Y = pd.merge(X,dfFactor[dfFactor[‘date’] == 選擇日期[i+1]][[‘date’,’name’,’price’]], 上 =[‘name’]).rename(columns={‘價格’:’close1′})
是[‘returnM’] = (Y[‘close1’] -Y[‘close0’]) / 是[‘close0’]
Yt = np.array(Y[‘returnM’])
Xt = np.array(Y[factor])
Y_平均值= Y[‘returnM’]。意思是()
X_平均值= Y[factor].mean() num = np.sum((Xt-X_mean)*(Yt-Y_mean))
den = np.sqrt(np.sum((Xt-X_mean)**2)*np.sum((Yt-Y_mean)**2))
NormalIC = num / den # 皮爾森相關係數# (2)rankIC
年= Y[‘returnM’]。秩()
X r = Y[factor]。秩()
rankIC = Yr.corr(Xr) testIC.iloc[i] = 普通IC, 等級IC
測試IC=測試IC[:-1] # 2.基於ICt,求[‘IC_Mean’, ‘IC_Std’,’IR’,’IC0.05比例’]
”’
ICmean: |IC|>0.05, 細胞激素的選價能力較弱,細胞激素值與下期相關性較高。 |IC| IR: |IR|>0.5,因子選幣能力,IC值較穩定。 |IR| IClZero(IC小於零):IC細胞中性。 IC>0超過一大半,為負向細胞,即細胞激素值增加,細胞中性降低
ICALzpF(IC abs 大於零點五): |IC|>0.05 比例偏高,表示因子大部分有效
”’
IR = testIC.mean()/testIC.std()
IClZero = 測試IC[testIC ICALzpF = 测试IC[abs(testIC)>0.05].count()/testIC.count()
組合=pd.concat([testIC.mean(),testIC.std(),IR,IClZero,ICALzpF],軸=1)
組合.列= [‘ICmean’,’ICstd’,’IR’,’IClZero’,’ICALzpF’] # 3.IC調倉IC的上漲圖
print(“測試IC表:”)
列印(testIC)列印(“結果:”)
print(‘正常偏度:’,組合[‘normalIC’].skew(),’排名偏度:’,組合[‘rankIC’].skew())
print(‘正常偏度:’,組合[‘normalIC’].kurt(),’排名偏度:’,組合[‘rankIC’].庫爾特())
回傳組合,testIC.cumsum().plot()
二、T值檢定(迴歸法)
T值法同樣檢驗本期因子值與下期因子關係,但與ICIR法分析二者的相關性不同,t值法將下期因子作為因標記物Y,本期因子值作為自標記物X,由Y對X迴歸,將迴歸出的因子值的迴歸率進行檢驗,檢驗其是否顯著異於0,即本期因子是否影響下期。
此方法本質上是對雙訊號迴歸模型的流程圖,具體公式如下:
Rₜ₊₁= αₜ+βₜfₜ+ μₜ
Rₜ₊₁: 第t+1 期token本來
fₜ:第t期因子值
βₜ:第t期細胞激素值的迴歸因子,即細胞因子
αₜ:截距項,反映所有未包含到模型中的變數對Rₜ₊₁的平均影響
(一)迴歸法理論設定顯著水準α,通常為10%、5%、1%。檢定假設:H0:β0=0, H1:βₜ≠0
T統計=(βʌₜ−βₜ)/se(βʌₜ)~tα/2(n−k)
k:迴歸模型中的參數個數
若|t統計量| > |tα/2(nk)| →拒絕H₀,即本期因子值fₜ對下期Rₜ₊₁有顯著的影響。 (2)回歸法代碼實現
def regT(self,chooseDate,factor,return_24h):
testT = pd.DataFrame(index=chooseDate,列=[‘coef’,’T’]) 對於範圍內的i(len(chooseDate)-1):
X = self.ini_data[self.ini_data[‘date’] == 選擇日期[i]][factor].values
Y = self.ini_data[self.ini_data[‘date’] == 選擇日期[i+1]][return_24h].values
b, intc = np.polyfit(X, Y, 1) # 斜率
ut = Y – (b * X + intc) # 求t值t = (\hat{b} – b) / se(b)
n = 長度(X)
dof = n – 2 # 自由度
std_b = np.sqrt(np.sum(ut**2) / dof) t_stat = b / std_b
測試T.iloc[i] = b, t_stat testT = testT[:-1] testT_mean = testT[‘T’].abs().mean()
testTL196 = len(testT[testT[‘T’].abs() > 1.96]) / len(testT)
印出(’testT_mean:’,testT_mean)
print(‘T值大於1.96的份額:’,testTL196)
返回測試T
三、分層回測法
分層是指所有token進行分層,回測是指計算每層token組合的本質。
(1)分層
首先取得token礦池對應的細胞激素值,透過細胞激素值對token進行排序。升序排序,即細胞激素值較小的排在前面,根據對token的細胞值進行等分排序。第0層token的細胞激素值最小,第9層令牌的因子值最大。
理論上「等分」是指均等分拆token的個數,即每層token個數相同,並藉助分補實現。現實中token總數不一定是層數的倍數,即每層token個數不一定符合。
(2)回測
將token依因子值升序分完10組後,開始計算每組token組合的肯定。此步驟將每層的token當成一個投資組合(不同回測期,每層的token組合所含的token都會有) ICIR、t值分析是當期因子值和下期整體的一致性,但分層回測需要計算回測期限每個交易日的分層組合收益由於有很多回測期有很多期,在每一期都需要進行分層和回測。最後每一層的token都進行累乘,計算出token組合的上漲計量。
理想狀態下,一個好的因子,第9組的曲線報酬率最高,第0組的曲線報酬最低。
第9組下跌第0組(即多空收益)圓形單調遞增。
(3)分層回測法代碼實現
deflayBackTest(自我,選擇日期,因素):
f = {}
返回M = {}
對於範圍內的i(len(chooseDate)-1):
df1 = self.ini_data[self.ini_data[‘date’] == 選擇日期[i]].重命名(列=
{‘價格’:’close0′})
Y = pd.merge(df1,self.ini_data[self.ini_data[‘date’] == 選擇日期[i+1]]
[[‘date’,’name’,’price’]],left_on=[‘name’],right_on=[‘name’]).重命名(列=
{‘價格’:’收盤1′})
F[i] = 是[factor]
返回M[i] = 是[‘close1’] /是[‘close0’] -1
標籤= [‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9’]
res = pd.DataFrame(索引=[‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9′,’LongShort’])
資源[chooseDate[0]]= 1
對於範圍內的i(len(chooseDate)-1):
dfM = pd.DataFrame({‘因子’:f[i],’returnM’:returnM[i]})
dfM[‘group’] = pd.qcut(dfM[‘factor’]10, 標籤=標籤)
dfGM = dfM.groupby(‘group’).mean()[[‘returnM’]]
dfGM.loc[‘LongShort’] = dfGM.loc[‘0’]- dfGM.loc[‘9’]
資源[chooseDate[i+1]]= 資源[chooseDate[0]]* (1 + dfGM[‘returnM’]) data = pd.DataFrame({‘分層堆積所以’:res.iloc[:10,-1],’團體’:
[0,1,2,3,4,5,6,7,8,9]})
df3 = data.corr()
print(“相關矩陣:”)
列印(df3)
return res.T.plot(title=’集團回測淨值曲線’)
資訊來源:0x資訊編譯自網際網路。版權歸作者Lucida & Falcon所有,未經許可,不得轉載