跳到主要内容

均值-方差与有效前沿

直觉

马科维茨的均值-方差理论是现代组合管理的基石:给定一组资产,用它们的期望收益 μ\mu协方差 Σ\Sigma,求出「每个收益水平下风险最小」的权重组合,连起来就是有效前沿。前沿上的点,没有别的组合能在同等收益下风险更低

数学原理

最小化方差,约束权重和为 1、且达到目标收益 μp\mu_p

minw wΣws.t.wμ=μp, 1w=1\min_w\ w^\top\Sigma w \quad \text{s.t.}\quad w^\top\mu=\mu_p,\ \mathbf{1}^\top w=1

两个等式约束下的闭式解由 KKT 线性方程组给出:

[ΣAA0][wλ]=[0μp1],A=[μ1]\begin{bmatrix}\Sigma & A\\ A^\top & 0\end{bmatrix} \begin{bmatrix}w\\ \lambda\end{bmatrix} = \begin{bmatrix}0\\ \mu_p\\ 1\end{bmatrix},\qquad A=\begin{bmatrix}\mu\\ \mathbf{1}\end{bmatrix}^\top
「人话」解释:有效前沿长什么样?

横轴风险(波动)、纵轴收益。前沿是一条向左凸的曲线,最左端的点叫全局最小方差组合(不管收益、只要最稳)。 前沿「上半段」才是有效的——下半段在相同风险下收益更低,没人会选。 单个资产是散点,多数落在前沿右下方(不如组合高效),这正是分散化的价值。

可运行案例:四资产有效前沿

读取 multi_asset_daily.csv(股/债/商品/REIT),估 μ\muΣ\Sigma,扫描目标收益得到前沿(允许多空)。

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. 为什么单个资产点多落在前沿的右下方?