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

练习


关键概念回顾

  1. 协方差矩阵

    np.cov(A,B) 返回矩阵结构:

    [[Var(A)  Cov(A,B)]
     [Cov(A,B) Var(B)]]
    

    对角线元素为变量的方差,非对角线为协方差。

  1. 相关系数矩阵

    np.corrcoef(A,B) 返回标准化后的协方差矩阵,值域在 [-1,1]。

  1. 滚动相关性

    使用 .rolling(window).corr() 计算时间序列的动态相关性。


练习1:人工变量的依赖关系

a. 方差、协方差与相关系数 I

给定以下变量,通过协方差和相关系数矩阵计算方差、协方差和相关系数:

import numpy as np

A = np.random.rand(100)
B = -3 * A + np.random.exponential(0.05, 100)

# 计算协方差矩阵和相关系数矩阵
covm = np.cov(___, ___)   # 填空
corrm = np.corrcoef(___, ___)

print("A的方差:", covm[0,0])
print("B的方差:", covm[1,1])
print("协方差:", covm[0,1])
print("相关系数:", corrm[0,1])

b. 方差、协方差与相关系数 II

分析随机变量 C 和 D 的关系:

C = np.random.rand(100)
D = np.random.normal(0, 0.5, 100)

# 补充协方差和相关系数计算代码
covm = ___
corrm = ___

print("C与D的相关系数:", ___)

练习2:构建示例关系

a. 正相关示例

构建变量 Y,使其与 X 强正相关(非完美)并绘制散点图:

import matplotlib.pyplot as plt

X = np.random.rand(100)
Y = ___  # 设计Y的表达式(提示:线性关系+噪声)

plt.scatter(X, Y)
plt.show()
print("相关系数:", np.corrcoef(X,Y)[0,1])

b. 负相关示例

构建变量 W,使其与 Z 弱负相关:

Z = np.random.rand(100)
W = ___  # 设计W的表达式(提示:负斜率+大噪声)

plt.scatter(Z, W)
plt.show()
print("相关系数:", ___)

练习3:真实资产的相关性

a. 资产相关性计算

使用 yfinance 获取 OKE、LAKE 和 SPY 的收盘价数据,计算它们之间的相关系数:

import yfinance as yf

# 获取2013-2015年数据
data = yf.download(['OKE', 'LAKE', 'SPY'], start='2013-01-01', end='2015-01-01')
prices = ___  # 提取收盘价

oke = prices['OKE']
lake = prices['LAKE']
spy = prices['SPY']

print("OKE与LAKE的相关系数:", ___)
print("OKE与SPY的相关系数:", ___)

b. 寻找高相关对

在指定股票列表中找出2015年相关性最高的一对:

symbols = ['GSK', 'SNOW', 'FB', 'AZO', 'XEC', 'AMZN']
data = yf.download(___, start='2015-01-01', end='2016-01-01')['Close']

def find_most_correlated(df):
    # 实现寻找最高相关系数对的函数
    return (pair, max_corr)

print("最高相关对:", find_most_correlated(data))

练习4:相关性的局限性

a. 样本外测试

验证2015年高相关对在2016年是否持续:

# 获取2015和2016年数据
fb_15 = yf.download('FB', start='2015-01-01', end='2016-01-01')['Close']
amzn_15 = ___
fb_16 = ___
amzn_16 = ___

corr_15 = ___
corr_16 = ___
print("2015 vs 2016相关系数:", corr_15, corr_16)

b. 滚动相关性分析

绘制60日滚动相关系数以观察稳定性:

# 获取2015-2017年数据
fb = yf.download('FB', start='2015-01-01', end='2017-01-01')['Close']
amzn = ___

rolling_corr = fb.rolling(60).corr(amzn)
___.plot()  # 补充绘图代码
plt.title("60日滚动相关系数")
plt.show()

注意事项

  1. 使用 yfinance 时注意处理多股票数据的列结构。
  1. 计算滚动相关性前确保时间序列索引对齐。
  1. 噪声参数(如 np.random.normal 的标准差)影响相关系数强度。