关键概念回顾#
-
协方差矩阵
np.cov(A,B)返回矩阵结构:code[[Var(A) Cov(A,B)] [Cov(A,B) Var(B)]]对角线元素为变量的方差,非对角线为协方差。
-
相关系数矩阵
np.corrcoef(A,B)返回标准化后的协方差矩阵,值域在 [-1,1]。 -
滚动相关性
使用
.rolling(window).corr()计算时间序列的动态相关性。
练习1:人工变量的依赖关系#
a. 方差、协方差与相关系数 I#
给定以下变量,通过协方差和相关系数矩阵计算方差、协方差和相关系数:
code
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 的关系:
code
C = np.random.rand(100)
D = np.random.normal(0, 0.5, 100)
# 补充协方差和相关系数计算代码
covm = ___
corrm = ___
print("C与D的相关系数:", ___)练习2:构建示例关系#
a. 正相关示例#
构建变量 Y,使其与 X 强正相关(非完美)并绘制散点图:
code
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 弱负相关:
code
Z = np.random.rand(100)
W = ___ # 设计W的表达式(提示:负斜率+大噪声)
plt.scatter(Z, W)
plt.show()
print("相关系数:", ___)练习3:真实资产的相关性#
a. 资产相关性计算#
使用 yfinance 获取 OKE、LAKE 和 SPY 的收盘价数据,计算它们之间的相关系数:
code
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年相关性最高的一对:
code
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年是否持续:
code
# 获取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日滚动相关系数以观察稳定性:
code
# 获取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()注意事项#
-
使用
yfinance时注意处理多股票数据的列结构。 -
计算滚动相关性前确保时间序列索引对齐。
-
噪声参数(如
np.random.normal的标准差)影响相关系数强度。