如何處理用於 Cholesky 分解的大型(5K-10K)非正定(特別是近奇異)共變異數矩陣?
我有一個非常大的收益共變異數矩陣(大約 10000x10000),它是使用 1000 個樣本大小的 10000 個變數建構的。我的目標是對這個矩陣進行(好看的)Cholesky 分解。然而,正如預期的那樣,這個矩陣幾乎是奇異的,具有非常小的 ( < 10^-10 ) 特徵值(大約 10K 中的 5K-6K)。
我嘗試了一種天真的方法;進行特徵值分解,並將所有小於 10^-10 的特徵值設置為 10^-10。換句話說,如果特徵值 < 10^-10,那麼特徵值 = 10^-10。之後,我用修改後的特徵值矩陣重構了矩陣。但是,雖然我可以執行 Cholesky 分解,但它非常不穩定。
處理大型矩陣的這種 PD 近似的最佳方法是什麼?
您的問題在 R 中通過有趣的解決方案Equity Risk Model Using PCA展示。Nick Higham 本人在 Matlab 中的另一個有用連結Nick Higham 為 Matlab 編寫的 NCM 實現。關於相關調整的收縮和其他方面的另一個很好的討論
讓 $ t $ 是天數(時間段),並讓 $ p $ 是資產的數量。你有 $ t=1000 $ 和 $ p=10000 $ . 對於任何給定的數據集,假設樣本共變異數矩陣 $ \mathbf{C} $ 準確地表示總體共變異數矩陣 $ \boldsymbol{\Sigma} $ ,然而,作為 $ p \rightarrow t $ 或者如果 $ p > t $ (如您的情況),特徵值變得不可靠並且也可以取零值,導致缺乏正定性。隨著高維數據集變得越來越流行,維數接近樣本量的潛力更大( $ p \rightarrow t $ ),導致有偏的特徵值 $ \mathbf{C} $ 和 $ \mathbf{R} $ . 肯定會有 $ p-t $ 零特徵值 $ p>t $ 和一個零特徵值 $ p=t $ .
您可以使用奇異值分解 (SVD),它將提取奇異值(特徵值)以及剩餘的奇異值。如果 $ \mathbf{X} $ 是你的回報矩陣( $ t $ 行, $ p $ 列)然後使用下面的 R 語法來查看來自特徵分解的特徵值(“eigvals”)與來自 SVD 的奇異值(“s”):
R=cor(X); p <- ncol(X); t <- nrow(X); lambdae <- eigen(R); eigvals <- as.vector(lambdae$values); E<-as.matrix(lambdae$vectors); s<-svd(R) s$d
最後,如果您要對數據做任何事情,您可以通過使用特徵向量來表示具有非零特徵值的維度的數據來執行降維,因為它們是不相關的。您也可以在提取奇異值後使用 PCA,並忽略零特徵值。主成分的負載將代表原始 10000 個資產與減少的正交(非相關)維度之間的相關性。