协方差矩阵手动验证#
给定两个人工生成的时间序列:
code
import numpy as np
# 生成相关数据
np.random.seed(2023)
X = np.random.normal(2, 5, 500)
Y = 0.6*X + np.random.normal(0, 3, 500)请完成以下任务:
-
手动实现协方差计算公式
-
使用NumPy内置函数验证结果
-
计算相关系数矩阵
-
解释两个变量的相关性强弱
code
# 手动计算协方差函数
def manual_cov(a, b):
mean_a = ...
mean_b = ...
cov = ...
return cov
# 计算结果对比
print(f"手动计算协方差: {manual_cov(X, Y):.4f}")
print(f"NumPy协方差: {np.cov(X, Y)[0,1]:.4f}")
# 相关系数矩阵计算
corr_matrix = ...
print("相关系数矩阵:\n", corr_matrix)自定义收缩估计量实践#
使用标普500成分股进行实验:
code
import yfinance as yf
symbols = ['JPM', 'WMT', 'PG', 'BA', 'CVX']
data = yf.download(symbols, start='2020-01-01', end='2023-01-01')['Adj Close']
returns = data.pct_change().dropna()请完成以下任务:
-
实现对角目标矩阵收缩估计量
-
与Ledoit-Wolf方法进行误差对比
-
可视化不同收缩方法的协方差分布
code
class DiagonalShrinkage:
def __init__(self, delta=0.5):
self.delta = delta
def fit(self, returns):
sample_cov = ...
target = ...
self.shrunk_cov = ...
return self
# 误差比较框架
from sklearn.covariance import LedoitWolf
train = returns.iloc[:600]
test = returns.iloc[600:]
# 实现你的收缩估计量
custom_cov = DiagonalShrinkage(delta=0.3).fit(train).shrunk_cov
lw_cov = ...
# 计算Frobenius范数误差
test_cov = ...
custom_error = ...
lw_error = ...
print(f"自定义收缩误差: {custom_error:.2f}")
print(f"Ledoit-Wolf误差: {lw_error:.2f}")
# 可视化代码框架
plt.figure(figsize=(12,5))
sns.kdeplot(sample_cov.flatten(), label='样本协方差')
sns.kdeplot(custom_cov.flatten(), label='对角收缩')
sns.kdeplot(lw_cov.flatten(), label='Ledoit-Wolf')
plt.xlabel('协方差值')
plt.title('协方差分布对比');