멀티팩터 전략으로 강력한 암호화폐 자산 포트폴리오 구축 #BigClassFactorAnalysis: 팩터 종합편

이 기사는 기계로 번역되었습니다
원문 표시

이전 장에 이어서 "다중 요소 모델을 사용하여 강력한 암호화폐 자산 포트폴리오 구축"에 관한 기사 시리즈인 "이론적 기본 사항" , "데이터 전처리""요인 유효성 테스트" 의 세 가지 기사를 게시했습니다.

처음 세 개의 기사에서는 다중 요인 전략 이론과 단일 요인 테스트 단계를 각각 설명합니다.

1. 요인 상관관계 검정을 하는 이유: 다중공선성

단일 요인 테스트를 통해 유효 요인을 일괄 선별하지만 위 요인을 데이터베이스에 직접 입력할 수는 없습니다. 요인 자체는 특정 경제적 의미에 따라 광범위한 범주로 나눌 수 있으며, 동일한 유형의 요인 간에는 상관관계 심사 없이 직접 데이터베이스에 입력되고 다중 선형 회귀를 수행하여 기대 수익률을 계산합니다. 다양한 요인에 따라 다중공선성 문제가 발생합니다. 계량경제학에서 다중 공선성은 회귀 모델의 설명 변수 중 일부 또는 전체가 "완전"하거나 정확한 선형 관계(변수 간 높은 상관 관계)를 갖는다는 것을 의미합니다.

따라서 유효요인을 선별한 후에는 먼저 주요 항목별로 요인의 상관관계에 대한 T검정을 실시해야 하며, 상관관계가 높은 요인에 대해서는 유의성이 낮은 요인을 폐기하거나 요인합성을 수행해야 한다.

다중공선성에 대한 수학적 설명은 다음과 같습니다.

$$$ Y = β₁ + β2X₂ᵢ + β₃X₃ᵢ + ... + βₖXₖᵢ + μᵢ , i = 1,2,...,n $$$

두 가지 상황이 있습니다.

1.$$C2X2ᵢ + C₃X₃ᵢ + … + CₖXₖᵢ = 상수 벡터 $$, $$ Cᵢ$$는 모두가 아님 $$0→Xᵢ$$가 완전히 동일선상에 있음

2.$$C2X2ᵢ + C₃X₃ᵢ + … + CₖXₖᵢ + Vᵢ = 상수 벡터 $$, $$Cᵢ$$는 모두 0이 아니며 $$Vᵢ$$는 임의 오류 항이며 $$→Xᵢ 사이에는 완전한 공선성이 있습니다. $$

다중 공선성의 결과:

1. 완벽한 공선성에서는 매개변수 추정기가 존재하지 않습니다.

2. OLS 추정기는 대략적인 공선성에서는 유효하지 않습니다.

먼저 분산 팽창 인자(VIF)를 $$VIF=1 / (1 - rᵢⱼ)$$ 로 정의합니다. 이는 다중 공선성으로 인해 모수 추정량의 분산이 팽창됨을 의미하며, VIF는 크게 증가합니다. .

이진 선형 모델을 예로 들어 보겠습니다. $$Y = β₁ + β₂X₂ᵢ + β₃X₃ᵢ + μᵢ$$

$$$ var(β₂) = (σ²/ΣX²²)·(1/(1-r²²₃)) $$$

$$$ 상관계수의 제곱합 r²²₃=(ΣX²ᵢX₃ᵢ)²/ ΣX²²ᵢΣX²₃ᵢ ≤ 1 $$$

$$$ 1/(1-r²²₃)≥ 1 $$$

  • 완전히 비공선적(완전히 상관되지 않음): $$r²₂₃ = 0 → var(β₂) = σ²/ΣX²₂$$

  • 대략 동일선상: $$0<r²2₃<1 → var(β2) = (σ²/ΣX²²)·(1/(1-r²²₃)) > σ²/ΣX²², 1에 가까울수록 분산 ↑$$

  • 완전히 동일선상에 있음: $$r²₂₃ = 1 → var(β₂) = , 분산은 무한대$$

3. 모수추정기의 경제적 중요성이 불합리하다

4. 변수의 유의성 검정(t 검정)은 유의성을 잃습니다.

5. 모델의 예측 기능이 실패합니다. 다변량 선형 모델에 의해 맞춰진 예측 수익률이 매우 부정확하여 모델이 실패합니다.

2. 1단계: 동일 유형 요인의 상관성 검정

새로 계산된 요인과 이미 라이브러리에 있는 요인 간의 상관 관계를 테스트합니다. 일반적으로 상관관계 분석에는 두 가지 유형의 데이터가 있습니다.

1. 백테스트 기간 동안 모든 토큰의 팩터 값을 기반으로 상관관계를 계산합니다.

2. 백테스트 기간 동안 모든 토큰의 팩터 초과 수익률 값을 기반으로 상관 관계를 계산합니다.

$$$ 초과 수익률 = 장기 그룹 수익률 - 벤치마크 수익률, 수익률 = ln(closeₜ / closeₜ ₋₁) $$$

우리가 추구하는 각 요소는 토큰의 수익률에 대한 특정 기여와 설명력을 가지고 있습니다. 상관관계 테스트**를 수행하는 목적은 전략 수익에 대해 서로 다른 설명과 기여도를 갖는 요소를 찾는 것입니다. 전략의 궁극적인 목표는 수익**입니다. 두 팩터가 동일한 수익률을 기술한다면 두 팩터 값이 크게 달라도 의미가 없습니다. 따라서 팩터 값 자체의 차이가 큰 팩터를 찾는 것이 아니라, 수익률을 설명하는 팩터가 서로 다른 팩터를 찾고자 하여 결국 팩터 초과 수익률 값을 이용하여 상관 관계를 계산하기로 결정했습니다.

우리의 전략은 일일 빈도이므로 백테스트 간격의 날짜를 기준으로 팩터 초과 수익률 간의 상관 계수 행렬을 계산합니다.

라이브러리에서 상관관계가 가장 높은 상위 n개 요인을 해결하기 위한 프로그래밍:

 def get_n_max_corr(self, factors, n=1): factors_excess = self.get_excess_returns(factors) save_factor_excess = self.get_excess_return(self.factor_value, self.start_date, self.end_date) if len(factors_excess) < 1: return factor_excess, 1.0, None factors_excess[self.factor_name] = factor_excess['excess_return'] factors_excess = pd.concat(factors_excess, axis=1) factors_excess.columns = factors_excess.columns.levels[0] # get corr matrix factor_corr = factors_excess.corr() factor_corr_df = factor_corr.abs().loc[self.factor_name] max_corr_score = factor_corr_df.sort_values(ascending=False).iloc[1:].head(n) return save_factor_excess, factor_corr_df, max_corr_score

3. 2단계: 인자 선택 및 인자 합성

상관관계가 높은 요인 세트의 경우 이를 처리하는 두 가지 방법이 있습니다.

(1) 요인 선정

팩터 자체의 ICIR 값, 수익률, 회전율, 샤프비율을 기반으로 특정 차원에서 가장 효과적인 팩터를 선택하여 다른 팩터를 유지하고 삭제합니다.

(2) 인자합성

요인 집합의 요인을 합성하고 단면에서 가능한 한 많은 효과적인 정보를 유지합니다.

$$$ F = w1 * f1 + w2 f2+...+wn fn, F는 최종 합성 인자, f는 합성이 필요한 인자 $$$

현재 처리할 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/요인수)$$이며, 종합요소 = 각 요소 값의 합을 평균한 것입니다.

예: 모멘텀 요인, 1개월 수익률, 2개월 수익률, 6개월 수익률, 12개월 수익률은 이들 6가지 요인의 로딩을 각각 설명합니다. 가중치의 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 가중치를 계산하기 전에 먼저 반감기 가중치를 정의합니다. 현재 기간에 가까울수록 가중치 값이 커지고 멀어질수록 가중치가 작아집니다.

반감기 체중의 수학적 유도:

\* 반감기 H: H 기간이 앞으로 밀릴 때마다 가중치 값이 지수적으로 절반으로 감소합니다.\* T: 백테스트에 고려되는 기간 수

 # 半衰权重def Decay(H,T): t = np.arange(T+1)[1:] wt = 2**((tT-1)/H) #半衰权重decay = wt/wt.sum() #归一化return decay # 历史IC半衰加权w_bs = Decay(6,12) # 假设T=12,H=6 ic_bs = ic.mul(w_bs,axis=0) w = ic_bs.mean()/ic.mean().sum() synthesis3 = (synthesis * w).sum(axis=1) # 历史ICIR半衰加权# 历史ICIR半衰加权在历史IC半衰加权的基础上,除以IC值的标准差。 w_bs = bs(6,12) ic_bs = ic.mul(w_bs,axis=0) ir_bs = ic_bs.mean()/ic.std() w = ir_bs.mean()/ir_bs.mean().sum() synthesis3 = (synthesis * w).sum(axis=1)

2.4 ICIR 가중치 최대화

방정식을 풀어 ICIR을 최대화하는 최적의 요인 가중치 w를 계산합니다.

공분산 행렬 추정 문제: 공분산 행렬은 서로 다른 자산 간의 상관 관계를 측정하는 데 사용됩니다. 통계에서는 모집단 공분산 행렬 대신 표본 공분산 행렬을 사용하는 경우가 많습니다. 그러나 표본 크기가 충분하지 않으면 표본 공분산 행렬과 모집단 공분산 행렬이 매우 달라집니다. 그래서 누군가는 추정된 공분산 행렬과 실제 공분산 행렬 사이의 평균 제곱 오차를 최소화하는 것이 원칙인 압축 추정 방법을 제안했습니다.

방법:

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 Approximate Shrinkage: Ledoit-Wolf 수축에 대한 개선으로, 목표는 공분산 행렬을 조정하여 표본 크기가 작을 때 실제 공분산 행렬을 보다 정확하게 추정하는 것입니다. (프로그래밍 구현은 Ledoit-Wolf 수축과 동일합니다)

2.5 주성분 분석 PCA

PCA(Principal Component Analysis)는 데이터의 차원을 줄이고 주요 특징을 클레임 데 사용되는 통계 방법입니다. 목표는 선형 변환을 통해 원본 데이터를 새 좌표계에 매핑하여 새 좌표계에서 데이터의 분산을 최대화하는 것입니다.

구체적으로 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)

루시다 & 팔콘 소개

루시다( https://www.lucida.fund/ )는 2018년 4월 암호화폐 시장에 진출한 업계 최고의 퀀트 헤지펀드입니다. 현재 관리 규모로 CTA/통계 차익거래/옵션 변동성 차익거래 및 기타 전략을 주로 거래합니다. 3천만 달러.

Falcon( https://falcon.lucida.fund/ )은 차세대 Web3 투자 인프라로, 다중 요소 모델을 기반으로 하며 사용자가 암호화폐를 "선택", "구매", "관리" 및 "판매"하도록 돕습니다. 자산. 매는 2022년 6월 루시다가 인큐베이팅.

더 많은 콘텐츠는 https://linktr.ee/lucida_and_falcon에서 확인할 수 있습니다.

이전 기사

Mirror
면책조항: 상기 내용은 작자의 개인적인 의견입니다. 따라서 이는 Followin의 입장과 무관하며 Followin과 관련된 어떠한 투자 제안도 구성하지 않습니다.
라이크
즐겨찾기에 추가
코멘트