跳到主内容
研究主线组合风险基础 · 第24–26讲3/3 · 配套练习模块导览 →
练习

第26讲:协方差矩阵估计 (Estimating Covariance Matrices) · 练习

手工验证协方差矩阵的对称性与数值结果,实现自定义收缩目标,并比较样本估计和收缩估计的误差。

← 返回本讲讲义
完成状态保存在当前浏览器,可随时取消。

协方差矩阵手动验证#

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

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)

请完成以下任务:

  1. 手动实现协方差计算公式

  2. 使用NumPy内置函数验证结果

  3. 计算相关系数矩阵

  4. 解释两个变量的相关性强弱

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()

请完成以下任务:

  1. 实现对角目标矩阵收缩估计量

  2. 与Ledoit-Wolf方法进行误差对比

  3. 可视化不同收缩方法的协方差分布

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('协方差分布对比');

完成练习后,自评一次

建议先独立作答,再展开参考答案进行核对。

模块收束 · 0/3 已完成

把知识收束成可复核的研究产物

完成后应该能够

  • 能够计算组合杠杆、集中度和协方差风险
  • 能够识别表面分散但风险集中化的组合

交付物

  • 一份组合风险快照与压力情景说明

本模块已有 0/3 个主要学习单元完成。 本模块没有待复习项。