给定两个人工生成的时间序列:
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)
请完成以下任务:
# 手动计算协方差函数
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成分股进行实验:
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()
请完成以下任务:
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('协方差分布对比');