好内容值得等待,马上呈现给你~
Pearson相关系数衡量两个变量的线性相关程度。
ρ(X,Y) = Cov(X,Y) / (σ_X × σ_Y)
import numpy as np
import pandas as pd
def calculate_correlation(returns_a, returns_b):
"""
计算两只股票收益率的相关系数
Parameters:
returns_a, returns_b: 收益率序列 (numpy array或pandas Series)
Returns:
correlation: 相关系数 (-1到1)
"""
# 方法1: 使用numpy
correlation = np.corrcoef(returns_a, returns_b)[0, 1]
return correlation
def calculate_correlation_manual(returns_a, returns_b):
"""
手动实现相关系数计算
"""
n = len(returns_a)
# 均值
mean_a = np.mean(returns_a)
mean_b = np.mean(returns_b)
# 协方差
cov = np.sum((returns_a - mean_a) * (returns_b - mean_b)) / (n - 1)
# 标准差
std_a = np.std(returns_a, ddof=1)
std_b = np.std(returns_b, ddof=1)
# 相关系数
correlation = cov / (std_a * std_b)
return correlation
# 使用示例
np.random.seed(42)
stock_a = np.random.normal(0.001, 0.02, 252) # 模拟一年收益
stock_b = stock_a * 0.5 + np.random.normal(0.001, 0.01, 252) # 部分相关
corr = calculate_correlation(stock_a, stock_b)
print(f"相关系数: {corr:.4f}")
组合方差公式:
σ²_p = w₁²σ₁² + w₂²σ₂² + 2w₁w₂ρσ₁σ₂
相关性的影响:
| ρ值 | 分散化效果 |
|---|---|
| +1 | 无分散化 |
| 0 | 部分分散化 |
| -1 | 完美对冲 |
def minimum_variance_weights(sigma1, sigma2, rho):
"""
两资产最小方差组合权重
"""
w1 = (sigma2**2 - rho*sigma1*sigma2) / \
(sigma1**2 + sigma2**2 - 2*rho*sigma1*sigma2)
w2 = 1 - w1
return w1, w2
def risk_contribution(weights, cov_matrix):
"""
计算各资产对组合风险的贡献
"""
port_var = weights @ cov_matrix @ weights
port_std = np.sqrt(port_var)
# 边际风险贡献
marginal_risk = (cov_matrix @ weights) / port_std
# 风险贡献
risk_contrib = weights * marginal_risk
return risk_contrib / port_std # 百分比
def rolling_correlation(returns_a, returns_b, window=60):
"""
滚动相关系数
"""
return pd.Series(returns_a).rolling(window).corr(pd.Series(returns_b))