多因子戦略を用いて強力な暗号資産投資ポートフォリオを構築する #大類因子分析:因子合成篇#
^著者:LUCIDA \& FALCON^
前回の続きとして、「多因子モデルを用いて強力な暗号資産ポートフォリオを構築する」シリーズの記事の中で、私たちは3つの論文を発表しました:《理論基礎編》、《データ前処理編》、《因子有効性検証編》。
最初の3つの論文では、多因子戦略の理論と単因子テストの手順について説明しました。
一、因子相関性検証の理由:多重共線性
私たちは単因子テストの部分から一部の有効因子を選別しましたが、これらの因子は直接データベースに入れることはできません。因子自体は具体的な経済的意味に基づいて大分類されることができ、同じタイプの因子間には強い相関性があります。相関性の選別を行わずに直接データベースに入れると、異なる因子に基づいて多変量線形回帰を行う際に多重共線性の問題が発生します。計量経済学において、多重共線性とは、回帰モデルの中のいくつかまたはすべての説明変数が「完全」または正確な線形関係(各変数間の高度な相関)を持つことを指します。
したがって、有効因子が選別された後、まずは大分類に基づいて因子の相関性をT検定で検証する必要があります。相関性が高い因子については、顕著性が低い因子を捨てるか、因子を合成する必要があります。
多重共線性の数学的説明は以下の通りです:
多重共線性による結果:
完全共線性の下でパラメータ推定量が存在しない
近似共線性の下でOLS推定量が非効率的である
二、ステップ1:同タイプ因子の相関性検証
新たに求めた因子と既にデータベースに入っている因子の相関性を検証します。一般的に、相関性を求めるデータには2つのタイプがあります:
回帰期間中のすべてのトークンの因子値に基づいて相関を求める
回帰期間中のすべてのトークンの因子超過収益値に基づいて相関を求める
三、ステップ2:因子の取捨、因子の合成
相関性が高い因子の集合に対しては、2つの方法で処理できます:
(1)因子の取捨
因子自体のICIR値、収益率、回転率、シャープ比に基づいて、特定の次元で最も有効な因子を選択し、他の因子を削除します。
(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/因子数)、総合因子=各因子値の合計を求めて平均します。
例:モメンタム系因子、1ヶ月収益率、2ヶ月収益率、3ヶ月収益率、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重みを求める前にまず半減重みを定義し、現在の期間に近いほど重みの値が大きく、遠いほど重みが小さくなります。
半減重みの数学的導出
2.4 ICIR最大化加重
方程式を解くことによって、ICIRを最大化する最適因子重みwを計算します。
共分散行列の推定問題:共分散行列は異なる資産間の関連性を測定するために使用されます。統計学では、サンプル共分散行列が母集団共分散行列の代わりに使用されますが、サンプルサイズが不十分な場合、サンプル共分散行列と母集団共分散行列の差異は大きくなります。したがって、圧縮推定法が提案されており、その原理は推定共分散行列と実際の共分散行列との間の平均二乗誤差を最小化することです。
方法:
- サンプル共分散行列
# 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)
- 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)
- 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)