均值-方差与有效前沿
直觉
马科维茨的均值-方差理论是现代组合管理的基石:给定一组资产,用它们的期望收益 和协方差 ,求出「每个收益水平下风险最小」的权重组合,连起来就是有效前沿。前沿上的点,没有别的组合能在同等收益下风险更低。
数学原理
最小化方差,约束权重和为 1、且达到目标收益 :
两个等式约束下的闭式解由 KKT 线性方程组给出:
「人话」解释:有效前沿长什么样?
横轴风险(波动)、纵轴收益。前沿是一条向左凸的曲线,最左端的点叫全局最小方差组合(不管收益、只要最稳)。 前沿「上半段」才是有效的——下半段在相同风险下收益更低,没人会选。 单个资产是散点,多数落在前沿右下方(不如组合高效),这正是分散化的价值。
可运行案例:四资产有效前沿
读取 multi_asset_daily.csv(股/债/商品/REIT),估 、,扫描目标收益得到前沿(允许多空)。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('/data/multi_asset_daily.csv', parse_dates=['date']).set_index('date')
assets = ['equity', 'bond', 'commodity', 'reit']
R = np.log(df[assets] / df[assets].shift(1)).dropna()
mu = R.mean().values * 252
S = R.cov().values * 252
n = len(assets)
def frontier_weights(target):
A = np.vstack([mu, np.ones(n)]).T
M = np.block([[S, A], [A.T, np.zeros((2, 2))]])
b = np.concatenate([np.zeros(n), [target, 1.0]])
return np.linalg.solve(M, b)[:n]
grid = np.linspace(mu.min(), mu.max(), 60)
fr, fv = [], []
for t in grid:
w = frontier_weights(t)
if np.isfinite(w).all():
fr.append(w @ mu); fv.append(np.sqrt(w @ S @ w))
invS = np.linalg.inv(S)
w_gmv = invS @ np.ones(n) / (np.ones(n) @ invS @ np.ones(n)) # 全局最小方差
av = np.sqrt(np.diag(S))
plt.figure(figsize=(8, 4.5))
plt.plot(fv, fr, color='#2563eb', lw=1.5, label='有效前沿(允许多空)')
plt.scatter([np.sqrt(w_gmv @ S @ w_gmv)], [w_gmv @ mu], color='green', s=60, zorder=5, label='全局最小方差')
plt.scatter(av, mu, color='crimson', s=55, zorder=5)
for i, a in enumerate(assets):
plt.annotate(f' {a}', (av[i], mu[i]))
plt.xlabel('年化波动'); plt.ylabel('年化收益'); plt.legend(); plt.tight_layout(); plt.show()
print("年化收益:", dict(zip(assets, np.round(mu, 3))))
print("年化波动:", dict(zip(assets, np.round(av, 3))))
小结
- 有效前沿 = 每个收益水平下方差最小的组合连线;
- 两等式约束有闭式解(解一个线性方程组);
- 全局最小方差组合是前沿最左端;单资产多在右下方,体现分散化价值。
小测验
1. 有效前沿上的组合满足?
2. 有效前沿最左端的组合是?
3. 为什么单个资产点多落在前沿的右下方?