量化交易之數學與統計學基礎2.4——線性代數與矩陣運算 | 矩陣分解
第二部分:線性代數與矩陣運算
第4節:矩陣分解:奇異值分解(SVD)在數據壓縮和風險分解的應用
一、奇異值分解(SVD)基礎:矩陣的“積木分解”
奇異值分解是一種強大的矩陣分解方法,它可以將任意矩陣分解為三個矩陣的乘積,為數據處理和分析提供了有力的工具。
1. 數學定義
對于一個 m × n m\times n m×n 的矩陣 A \mathbf{A} A,其奇異值分解可以表示為:
A = U Σ V T \mathbf{A}=\mathbf{U}\mathbf{\Sigma}\mathbf{V}^T A=UΣVT
其中, U \mathbf{U} U 是 m × m m\times m m×m 的正交矩陣( U T U = I m \mathbf{U}^T\mathbf{U}=\mathbf{I}_m UTU=Im?),其列向量稱為左奇異向量; Σ \mathbf{\Sigma} Σ 是 m × n m\times n m×n 的對角矩陣,對角線上的元素 σ 1 ≥ σ 2 ≥ ? ≥ σ r > 0 \sigma_1\geq\sigma_2\geq\cdots\geq\sigma_r>0 σ1?≥σ2?≥?≥σr?>0 稱為奇異值, r = rank ( A ) r = \text{rank}(\mathbf{A}) r=rank(A); V \mathbf{V} V 是 n × n n\times n n×n 的正交矩陣( V T V = I n \mathbf{V}^T\mathbf{V}=\mathbf{I}_n VTV=In?),其列向量稱為右奇異向量。
2. 求解方法
通常可以通過計算 A T A \mathbf{A}^T\mathbf{A} ATA 的特征值和特征向量來得到 V \mathbf{V} V 和 Σ \mathbf{\Sigma} Σ,然后通過 A V = U Σ \mathbf{A}\mathbf{V}=\mathbf{U}\mathbf{\Sigma} AV=UΣ 計算 U \mathbf{U} U。在實際應用中,可以使用數值計算庫(如 NumPy)來高效地完成 SVD 分解。
二、數據壓縮:用 SVD 減少數據存儲與計算成本
在量化交易中,我們經常需要處理大規模的數據矩陣,如歷史價格數據、因子暴露矩陣等。SVD 可以幫助我們對這些數據進行壓縮,減少存儲和計算成本。
1. 低秩近似
矩陣 A \mathbf{A} A 的 SVD 分解中,奇異值 σ i \sigma_i σi? 反映了矩陣的重要信息。通常,大部分重要信息集中在前面幾個較大的奇異值上。因此,我們可以只保留前 k k k 個奇異值( k < r k < r k<r),得到矩陣 A \mathbf{A} A 的低秩近似:
A k = U k Σ k V k T \mathbf{A}_k=\mathbf{U}_k\mathbf{\Sigma}_k\mathbf{V}_k^T Ak?=Uk?Σk?VkT?
其中, U k \mathbf{U}_k Uk? 是 U \mathbf{U} U 的前 k k k 列, Σ k \mathbf{\Sigma}_k Σk? 是 Σ \mathbf{\Sigma} Σ 的前 k k k 個奇異值構成的 k × k k\times k k×k 對角矩陣, V k \mathbf{V}_k Vk? 是 V \mathbf{V} V 的前 k k k 列。
2. 量化應用
- 歷史數據存儲:對于歷史價格數據矩陣,通過 SVD 壓縮可以減少存儲空間,同時保留大部分重要信息。
- 因子數據處理:在多因子模型中,對因子暴露矩陣進行 SVD 壓縮,可以減少因子數量,提高計算效率。
三、風險分解:用 SVD 剖析投資組合的風險來源
在投資組合管理中,了解投資組合的風險來源至關重要。SVD 可以幫助我們將投資組合的風險分解為不同的風險因子。
1. 風險矩陣分解
假設投資組合的協方差矩陣為 Σ \mathbf{\Sigma} Σ,對其進行 SVD 分解:
Σ = U Λ U T \mathbf{\Sigma}=\mathbf{U}\mathbf{\Lambda}\mathbf{U}^T Σ=UΛUT
其中, Λ \mathbf{\Lambda} Λ 是對角矩陣,對角線上的元素是 Σ \mathbf{\Sigma} Σ 的特征值, U \mathbf{U} U 是特征向量矩陣。每個特征值對應一個風險因子,特征向量表示投資組合在該風險因子上的暴露。
2. 風險貢獻分析
通過 SVD 分解,我們可以計算每個風險因子對投資組合總風險的貢獻。例如,第 i i i 個風險因子的風險貢獻可以表示為:
R C i = w T U i λ i U i T w RC_i = w^T\mathbf{U}_i\lambda_i\mathbf{U}_i^Tw RCi?=wTUi?λi?UiT?w
其中, w w w 是投資組合的權重向量, U i \mathbf{U}_i Ui? 是第 i i i 個特征向量, λ i \lambda_i λi? 是第 i i i 個特征值。
四、投資組合優化:用 SVD 尋找最優投資組合
投資組合優化的目標是在給定的風險水平下最大化投資組合的收益,或者在給定的收益水平下最小化投資組合的風險。SVD 可以幫助我們在優化過程中處理高維的協方差矩陣。
1. 優化問題
經典的馬科維茨投資組合優化問題可以表示為:
min ? w w T Σ w s.t. w T μ = r p , w T 1 = 1 \min_{w} w^T\mathbf{\Sigma}w\quad\text{s.t.}\quad w^T\mathbf{\mu}=r_p,\quad w^T\mathbf{1}=1 wmin?wTΣws.t.wTμ=rp?,wT1=1
其中, w w w 是投資組合的權重向量, Σ \mathbf{\Sigma} Σ 是協方差矩陣, μ \mathbf{\mu} μ 是預期收益率向量, r p r_p rp? 是目標收益率。
2. SVD 輔助優化
通過對協方差矩陣 Σ \mathbf{\Sigma} Σ 進行 SVD 分解,可以將優化問題轉化為低維空間中的問題,減少計算復雜度。同時,SVD 可以幫助我們處理協方差矩陣的病態問題,提高優化結果的穩定性。
五、Python 實踐:用 SVD 進行數據壓縮和風險分解
import numpy as np
import matplotlib.pyplot as plt# 生成模擬數據矩陣(100 行,20 列)
np.random.seed(42)
A = np.random.randn(100, 20)# 1. SVD 分解
U, Sigma, Vt = np.linalg.svd(A)# 2. 數據壓縮:保留前 5 個奇異值
k = 5
U_k = U[:, :k]
Sigma_k = np.diag(Sigma[:k])
Vt_k = Vt[:k, :]
A_k = U_k @ Sigma_k @ Vt_k# 3. 可視化原始矩陣和壓縮后的矩陣
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.imshow(A, cmap='hot', interpolation='nearest')
plt.title('原始矩陣')
plt.subplot(1, 2, 2)
plt.imshow(A_k, cmap='hot', interpolation='nearest')
plt.title(f'壓縮后的矩陣(保留 {k} 個奇異值)')
plt.show()# 4. 風險分解:假設 A 是協方差矩陣
eigenvalues = Sigma**2
total_risk = np.sum(eigenvalues)
risk_contributions = eigenvalues / total_risk# 可視化風險貢獻
plt.figure(figsize=(8, 5))
plt.bar(np.arange(len(risk_contributions)), risk_contributions)
plt.xlabel('風險因子')
plt.ylabel('風險貢獻')
plt.title('風險因子的風險貢獻')
plt.show()
本節總結
- 奇異值分解是一種強大的矩陣分解方法,可以將任意矩陣分解為三個矩陣的乘積。
- 在數據壓縮方面,SVD 可以通過低秩近似減少數據存儲和計算成本。
- 在風險分解和投資組合優化中,SVD 可以幫助我們剖析投資組合的風險來源,處理高維協方差矩陣,提高優化結果的穩定性。