用多因子模型构建强大的加密资产投资组合#大类因子分析:因子正交化篇#

书接上回,关于《用多因子模型构建强大的加密资产投资组合》系列文章中,我们已经发布了四篇:《理论基础篇》《数据预处理篇》《因子有效性检验篇》《大类因子分析:因子合成篇》

在上一篇中,我们具体解释了因子共线性(因子之间相关性较高)的问题,在进行大类因子合成前,需要进行因子正交化来消除共线性。

通过因子正交化,重新调整原始因子的方向,使他们相互正交([fi,fj]=0[\vec{f_i},\vec{f_j}]=0,即两个向量相互垂直),本质是对原始因子在坐标轴上的旋转。这种旋转不改变因子之间的线性关系也不改变原本蕴含的信息,并且新因子之间的相关性为零(内积为零等价于相关性为零),因子对于收益的解释度保持不变。

一、因子正交化的数学推导

从多因子截面回归角度,建立因子正交化体系。

每个截面上可以获得全市场token在各个因子上的取值,N代表截面上全市场token数量,K表示因子的数量,fk=[f1k,f2k,...,fNk]f^k=[f_1^k,f_2^k,...,f_N^k]'表示全市场token在第k个因子上的取值,并且已对每个因子进行了z-score归一化处理,即 fkˉ=0,fk=1\bar{f^k}=0, ||f^k||=1

FN×K=[f1,f2,...,fK]F_{N\times K}=[f^1,f^2,...,f^K]为截面上K个线性独立的因子列向量组成的矩阵,假设以上因子线性无关(相关性不为100%或-100%,正交化处理的理论基础)。

因子矩阵 FN×K=f11f12f1Kf21f22f2KfN1fN2fNK1因子矩阵\ F_{N\times K} =\begin{vmatrix} f_1^1 & f_1^2& \dots&f_1^K\\ f_2^1 & f_2^2&\dots&f_2^K\\ \vdots &\vdots &\ddots&\vdots\\ f_N^1 & f_N^2&\dots&f_N^K\\ \end{vmatrix}(1)

通过对FmnFₘₙ线性变换,得到一个新的因子正交矩阵Fmn=[f1k,f2k,fnk]F'ₘₙ = [fᵏ₁,fᵏ₂,……fᵏₙ]' ,新矩阵的列向量相互正交,即任意两个新因子向量内积为零,i,j,ij,[(f~i)f~j]=0\forall i,j,i\not=j,[(\tilde f^i)'\tilde f^j]=0

定义一个从 FN×KF_{N\times K}旋转到F~N×K\tilde{F}_{N\times K}的过渡矩阵 SK×KS_{K\times K}

F~N×K=FN×KSK×K(2)\tilde{F}_{N\times K}=F_{N\times K}\cdot S_{K\times K}(2)

1.1 过度矩阵SK×KS_{K\times K}

以下开始求解过渡矩阵SkkSₖₖ,首先计算FnkFₙₖ的协方差矩阵kk∑ₖₖ,则 FnkFₙₖ 的重叠矩阵Mkk=(N1)kkMₖₖ=(N-1)∑ₖₖ,即

重叠矩阵 MK×K=(f1)(f1)(f1)(f2)(f1)(fK)(f2)(f1)(f2)(f2)(f2)(fK)(fK)(f1)(fK)(f2)(fK)(fK)(3)重叠矩阵\ M_{K\times K} =\begin{vmatrix} (f^1)'(f^1)& (f^1)'(f^2)& \dots&(f^1)'(f^K)\\ (f^2)'(f^1) & (f^2)'(f^2)&\dots&(f^2)'(f^K)\\ \vdots &\vdots &\ddots&\vdots\\ (f^K)'(f^1) & (f^K)'(f^2)&\dots&(f^K)'(f^K)\\ \end{vmatrix} (3)

旋转后的F~N×K\tilde{F}_{N\times K}是正交矩阵,根据正交矩阵的性质 AAT=IAA^T=I,则有

(F~N×K)F~N×K=(FN×KSK×K)FN×KSK×K=SK×KFN×KFN×KSK×K=SK×KMK×KSK×K=IK×K(4)\begin{aligned} (\tilde{F}_{N\times K})'\tilde{F}_{N\times K}&=(F_{N\times K}S_{K\times K})'F_{N\times K}S_{K\times K}\\ &=S_{K\times K}'F_{N\times K}'F_{N\times K}S_{K\times K}\\ &=S_{K\times K}'M_{K\times K}S_{K\times K}\\ &=I_{K\times K} \end{aligned} (4)

所以,

SK×KSK×K=MK×K1(7)S_{K\times K}'S_{K\times K}=M_{K\times K}^{-1} (7)

满足该条件的 SkkSₖₖ 即为一个符合条件的过渡矩阵。上面公式的通解为:

SK×K=MK×K1/2CK×K(8)S_{K\times K}=M_{K\times K}^{-1/2}C_{K\times K}(8)

其中,CK×KC_{K\times K} 为任意正交矩阵

1.2对称矩阵MK×K1/2M_{K\times K}^{-1/2}

下面开始求解 MK×K1/2M*{K\times K}^{-1/2},因为 MK×KM*{K\times K} 是对称矩阵,因此一定存在一个正定矩阵 UK×KU_{K\times K} 满足:

UK×KMK×KUK×K=DK×K(9)U_{K\times K}'M_{K\times K}U_{K\times K}=D_{K\times K}(9)

其中,

DK×K=λ1000λ2000λK(10)D_{K\times K}=\begin{vmatrix} \lambda_1& 0& \dots&0\\ 0 & \lambda_2&\dots&0\\ \vdots &\vdots &\ddots&\vdots\\ 0 &0&\dots&\lambda_K\\ \end{vmatrix} (10)


UK×K,DK×KU*{K\times K},D*{K \times K} 分别为 MK×KM*{K\times K} 的特征向量矩阵和特征根对角矩阵,并且 UK×K=UK×K1,k,λK>0U*{K\times K}'=U_{K\times K}^{-1},\forall k,\lambda_K>0。 由公式(13)可得

MK×K=UK×KDK×KUK×KMK×K1=UK×KDK×K1UK×KMK×K1/2MK×K1/2=UK×KDK×K1/2IK×KDK×K1/2UK×K(11)\begin{aligned} M_{K\times K}&=U_{K\times K}D_{K\times K}U_{K\times K}'\\ M_{K\times K}^{-1}&=U_{K\times K}D_{K\times K}^{-1}U_{K\times K}'\\ M_{K\times K}^{-1/2}M_{K\times K}^{-1/2}&=U_{K\times K}D_{K\times K}^{-1/2}I_{K\times K}D_{K\times K}^{-1/2}U_{K\times K}'\\ \end{aligned} (11)

由于 MK×K1/2M*{K\times K}^{-1/2} 是对称矩阵,且 UK×KUK×K=IK×KU*{K\times K}U*{K\times K}'=I*{K\times K},可基于上式得到 MK×K1/2M_{K\times K}^{-1/2} 的一个特解为:

MK×K1/2MK×K1/2=UK×KDK×K1/2UK×KUK×KDK×K1/2UK×KMK×K1/2=UK×KDK×K1/2UK×K(12)\begin{aligned} M_{K\times K}^{-1/2}M_{K\times K}^{-1/2}&=U_{K\times K}D_{K\times K}^{-1/2}U_{K\times K}'U_{K\times K}D_{K\times K}^{-1/2}U_{K\times K}'\\ M_{K\times K}^{-1/2}&=U_{K\times K}D_{K\times K}^{-1/2}U_{K\times K}' \end{aligned}(12)

其中

DK×K1/2=1/λ10001/λ20001/λK13D_{K\times K}^{-1/2}=\begin{vmatrix} 1/\sqrt{\lambda_1}& 0& \dots&0\\ 0 & 1/\sqrt{\lambda_2}&\dots&0\\ \vdots &\vdots &\ddots&\vdots\\ 0 &0&\dots&1/\sqrt{\lambda_K}\\ \end{vmatrix}(13)

MK×K1/2M_{K\times K}^{-1/2} 的解带入公式(6)可求的过渡矩阵:

SK×K=MK×K1/2CK×K=UK×KDK×K1/2UK×KCK×K14\begin{aligned} \color{brown}S_{K\times K}&=M_{K\times K}^{-1/2}C_{K\times K}\\ &=\color{brown}U_{K\times K}D_{K\times K}^{-1/2}U_{K\times K}'C_{K\times K} \end{aligned}(14)

其中,CK×KC_{K\times K} 为任意正交矩阵。

根据公式(12),任何一种因子正交都可以转化为选择不同的正交矩阵 CK×KC_{K\times K} 对原始因子进行旋转。

1.3消除共线性主要用到3种正交方法

1.3.1 施密特正交

故,SK×KS*{K\times K} 为上三角矩阵,CK×K=UK×KDK×K1/2UK×KSK×KC*{K\times K}=U*{K\times K}D*{K\times K}^{-1/2}U*{K\times K}'S*{K\times K}

1.3.2 规范正交

故,SK×K=UK×KDK×K1/2S_{K\times K}=U_{K\times K}D_{K\times K}^{-1/2}CK×K=UK×KC_{K\times K}= U_{K\times K}

1.3.3 对称正交

故,SK×K=UK×KDK×K1/2UK×KS_{K\times K}=U_{K\times K}D_{K\times K}^{-1/2}U_{K\times K}'CK×K=IK×KC_{K\times K}=I_{K\times K}

二、三种正交方法的具体实现

1.施密特正交

有一组线性无关的因子列向量 f1,f2,...,fKf^1,f^2,...,f^K,可以逐步的构造出一组正交的向量组 f~1,f~2,...,f~K\tilde{f}^1,\tilde{f}^2,...,\tilde{f}^K,正交后的向量为:

f~1=f1f~2=f2[f2,f~1][f~1,f~1]f~1f~3=f3[f3,f~1][f~1,f~1]f~1[f3,f~2][f~2,f~2]f~2=f~k=fk[fk,f~1][f~1,f~1]f~1[fk,f~2][f~2,f~2]f~2[fk,f~k1][f~k1,f~k1]f~k115\begin{aligned} \tilde{f}^1 &= f^1\\ \tilde{f}^2 &= f^2-\frac{[f^2,\tilde{f}^1]}{[\tilde{f}^1,\tilde{f}^1]}\tilde{f}^1\\ \tilde{f}^3 &= f^3-\frac{[f^3,\tilde{f}^1]}{[\tilde{f}^1,\tilde{f}^1]}\tilde{f}^1-\frac{[f^3,\tilde{f}^2]}{[\tilde{f}^2,\tilde{f}^2]}\tilde{f}^2\\ \dots&=\dots\\ \tilde{f}^k &= f^k-\frac{[f^k,\tilde{f}^1]}{[\tilde{f}^1,\tilde{f}^1]}\tilde{f}^1-\frac{[f^k,\tilde{f}^2]}{[\tilde{f}^2,\tilde{f}^2]}\tilde{f}^2-\dots-\frac{[f^k,\tilde{f}^{k-1}]}{[\tilde{f}^{k-1},\tilde{f}^{k-1}]}\tilde{f}^{k-1}\\ \end{aligned}(15)

并对 f~1,f~2,...,f~K\tilde{f}^1,\tilde{f}^2,...,\tilde{f}^K 进行单位化后:

ek=f~kf~k,(k=1,2,,k)16e^k=\frac{\tilde{f}^k}{||\tilde{f}^k||},(k=1,2,\dots,k)(16)

经过以上处理,得到一组标准正交基。由于 e1,e2,,eKe^1,e^2,\dots,e^Kf1,f2,...,fKf^1,f^2,...,f^K 等价,二者可以相互线性表示,即 eke^kf1,f2,...,fkf^1,f^2,...,f^k 的线性组合,有 ek=β1kf1+β2kf2+...+βkkfke^k=\beta_1^kf^1+\beta_2^kf^2+...+\beta_k^kf^k,因此对应于原矩阵 FK×KF*{K\times K} 的过渡矩阵SK×KS*{K\times K} 为一个上三角矩阵,形如:

SK×K=β11β12β1K0β22β2K00βKK17S_{K\times K}=\begin{vmatrix} \beta_1^1& \beta_1^2& \dots&\beta_1^K\\ 0 & \beta_2^2&\dots&\beta_2^K\\ \vdots &\vdots &\ddots&\vdots\\ 0 &0&\dots&\beta_K^K\\ \end{vmatrix}(17)

其中 βkk=1f~k>0\beta_k^k=\frac{1}{||\tilde{f}^k||}>0。基于公式(17),施密特正交选取的任意正交矩阵为:

CK×K=UK×KDK×K1/2UK×KSK×K1C_{K\times K}=U_{K\times K}D_{K\times K}^{-1/2}U_{K\times K}'S_{K\times K}(1)

施密特正交是一种顺序正交方法,因此需要确定因子正交的顺序,常见的正交顺序有固定顺序(不同截面上取同样的正交次序),以及动态顺序(在每个截面上根据一定规则确定其正交次序)。施密特正交法的优点是按同样顺序正交的因子有显式的对应关系,但是正交顺序没有统一的选择标准,正交后的表现可能受到正交顺序标准和窗口期参数的影响。

# 施密特正交化
from sympy.matrices import Matrix, GramSchmidt
Schmidt = GramSchmidt(f.apply(lambda x: Matrix(x),axis=0),orthonormal=True)

f_Schmidt = pd.DataFrame(index=f.index,columns=f.columns)
for i in range(3):
    f_Schmidt.iloc[:,i]=np.array(Schmidt[i])
res = f_Schmidt.astype(float)

2.规范正交

选取正交矩阵 CK×K=UK×KC_{K\times K}=U_{K\times K},则过渡矩阵为:

SK×K=UK×KDK×K1/2UK×KUK×K=UK×KDK×K1/22S_{K\times K}=U_{K\times K}D_{K\times K}^{-1/2}U_{K\times K}'U_{K\times K}=U_{K\times K}D_{K\times K}^{-1/2}(2)

其中 UK×KU*{K\times K} 为特征向量矩阵,用于对因子旋转,DK×K1/2D*{K\times K}^{-1/2} 为对角矩阵,用于对旋转后因子的缩放。此处的旋转与不做降维的PCA一致。

# 规范正交
def Canonical(self):
  overlapping_matrix = (time_tag_data.shape[1] - 1) * np.cov(time_tag_data.astype(float))
  # 获取特征值和特征向量
  eigenvalue, eigenvector = np.linalg.eig(overlapping_matrix)
  # 转换为np中的矩阵
  eigenvector = np.mat(eigenvector)
  transition_matrix = np.dot(eigenvector, np.mat(np.diag(eigenvalue ** (-0.5))))
  orthogonalization = np.dot(time_tag_data.T.values, transition_matrix)
  orthogonalization_df = pd.DataFrame(orthogonalization.T,index = pd.MultiIndex.from_product([time_tag_data.index, [time_tag]]),columns=time_tag_data.columns)
  self.factor_orthogonalization_data = self.factor_orthogonalization_data.append(orthogonalization_df)

3.对称正交

施密特正交由于在过去若干个截面上都取同样的因子正交顺序,因此正交后的因子和原始因子有显式的对应关系,而规范正交在每个截面上选取的主成分方向可能不一致,导致正交前后的因子没有稳定的对应关系。由此可见,正交后组合的效果,很大一部分取决于正交前后因子是否有稳定的对应关系。

对称正交尽可能的减少对原始因子矩阵的修改而得到一组正交基。这样能够最大程度地保持正交后因子和原因子的相似性。并且避免像施密特正交法中偏向正交顺序中靠前的因子。

选取正交矩阵 CK×K=IK×KC_{K\times K}=I_{K\times K},则过渡矩阵为:

SK×K=UK×KDK×K1/2UK×K1S_{K\times K}=U_{K\times K}D_{K\times K}^{-1/2}U_{K\times K}'(1)

对称正交的性质:

  1. 与施密特正交相比,对称正交不需要提供正交次序,对每个因子是平等看待的

  2. 在所有正交过渡矩阵中,对称正交后的矩阵和原始矩阵的相似性最大,即正交前后矩阵的距离最小。

# 对称正交
def Symmetry(factors):
    col_name = factors.columns  
    D, U = np.linalg.eig(np.dot(factors.T, factors))  
    U = np.mat(U)
    d = np.diag(D**(-0.5))
    S = U*d*U.T 
    #F_hat = np.dot(factors, S) 
    F_hat = np.mat(factors)*S 
    factors_orthogonal = pd.DataFrame(F_hat, columns=col_name, index=factors.index)  
    return factors_orthogonal
res = Symmetry(f)

关于LUCIDA & FALCON

Lucida (https://www.lucida.fund/ )是行业领先的量化对冲基金,在2018年4月进入Crypto市场,主要交易CTA / 统计套利 / 期权波动率套利等策略,现管理规模3000万美元。

Falcon (https://falcon.lucida.fund /)是新一代的Web3投资基础设施,它基于多因子模型,帮助用户“选”、“买”、“管”、“卖”加密资产。Falcon在2022年6月由Lucida所孵化。

更多内容可访问 https://linktr.ee/lucida_and_falcon

往期文章

Subscribe to LUCIDA & FALCON
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.