🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

练习

协方差矩阵手动验证

给定两个人工生成的时间序列:

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)

请完成以下任务:

  1. 手动实现协方差计算公式
  1. 使用NumPy内置函数验证结果
  1. 计算相关系数矩阵
  1. 解释两个变量的相关性强弱
# 手动计算协方差函数
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()

请完成以下任务:

  1. 实现对角目标矩阵收缩估计量
  1. 与Ledoit-Wolf方法进行误差对比
  1. 可视化不同收缩方法的协方差分布
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('协方差分布对比');