跳到正文

从零开始的均值-方差优化

完整推导 Markowitz (1952) 均值-方差优化。输入、输出、数学原理,以及这个 70 年前的思想为何至今仍是彭博终端上每一个组合的基石。

第 1 篇 · 共 12 篇 约 9 分钟

Harry Markowitz 在 1952 年的《Journal of Finance》上发表了”Portfolio Selection”。那年他 24 岁(生于 1927 年 8 月 24 日;论文发表在 1952 年 3 月刊,恰好在他 25 岁生日前)。论文总共 8 页,包含一个二次规划,38 年后为他赢得了诺贝尔奖。

73 年过去,地球上每一位资产配置者仍在求解他的问题的某种后代。Black-Litterman、风险平价、CVaR 优化、稳健 MVO、层次风险平价:全都是脚注。如果你不理解 Markowitz 的原始公式,就无法理解这其中任何一种方法的底层。

本文从零开始推导这一公式。输入、数学、拉格朗日量、闭式解,以及无约束情形。我们也会触及约束条件,因为生产环境中没人跑无约束版本。

问题设定

你有 NN 个风险资产,想把资本在它们之间分配。设 w∈RNw \in \mathbb{R}^N 为组合权重向量。你关心两件事:

  • 组合的预期收益:rp=w⊤μr_p = w^\top \mu
  • 组合的方差:σp2=w⊤Σw\sigma_p^2 = w^\top \Sigma w

其中 μ∈RN\mu \in \mathbb{R}^N 是预期收益向量,Σ∈RN×N\Sigma \in \mathbb{R}^{N \times N} 是资产收益的协方差矩阵。两者都是输入,也都是估计量。(后者在后续讨论估计误差的文章中会很重要。此处先假装你精确地知道它们。)

你也可以以无风险利率 rfr_f 配置到无风险资产,我们最后再加进来。先只看风险资产。

Markowitz 真正做的事情

Markowitz 的洞察简单得令人尴尬:不要逐个评估资产,而要评估组合。组合的收益是各成分的加权平均。组合的风险却不是,因为它取决于各成分如何共同变动。

两个完全正相关资产组成的组合,其方差等于各方差的加权平均。两个完全负相关资产组成的组合,方差可以为零。介于两者之间就形成一条权衡曲线。Markowitz 称之为”有效前沿”:在每个预期收益水平上方差最小的组合集合。

具体而言,对于目标收益 rˉ\bar{r},求解:

min⁡w12w⊤Σws.t.w⊤μ=rˉ1⊤w=1\begin{aligned} \min_{w} \quad & \frac{1}{2} w^\top \Sigma w \\ \text{s.t.} \quad & w^\top \mu = \bar{r} \\ & \mathbf{1}^\top w = 1 \end{aligned}

方差前面的 1/2 只是为了让导数更简洁。两个约束的含义是:达到收益目标,且全额投资(不留现金)。目标函数最小化风险。

注意没有出现的项:卖空约束、杠杆上限、行业约束、交易成本。基础版本是赤裸的,我们之后再加以修饰。

拉格朗日量

这是一个带线性等式约束的二次规划。可以直接写出拉格朗日量:

L(w,λ,γ)=12w⊤Σw−λ(w⊤μ−rˉ)−γ(1⊤w−1)\mathcal{L}(w, \lambda, \gamma) = \frac{1}{2} w^\top \Sigma w - \lambda (w^\top \mu - \bar{r}) - \gamma (\mathbf{1}^\top w - 1)

对 ww 求导并设为零:

∇wL=Σw−λμ−γ1=0\nabla_w \mathcal{L} = \Sigma w - \lambda \mu - \gamma \mathbf{1} = 0

求解 ww:

w∗=λΣ−1μ+γΣ−11w^* = \lambda \Sigma^{-1} \mu + \gamma \Sigma^{-1} \mathbf{1}

代回两个等式约束,得到关于 (λ,γ)(\lambda, \gamma) 的 2×2 线性方程组。求解后代入,就得到闭式权重。

定义下列标量(A、B、C、D 的记法遵循许多投资组合理论教材的传统;Luenberger 的 Investment Science 使用了不同的变量名):

A=1⊤Σ−11,B=1⊤Σ−1μ,C=μ⊤Σ−1μ,D=AC−B2A = \mathbf{1}^\top \Sigma^{-1} \mathbf{1}, \quad B = \mathbf{1}^\top \Sigma^{-1} \mu, \quad C = \mu^\top \Sigma^{-1} \mu, \quad D = AC - B^2

则有效组合权重为:

w∗=1D[(Arˉ−B)Σ−1μ+(C−Brˉ)Σ−11]w^* = \frac{1}{D} \left[ (A \bar{r} - B) \Sigma^{-1} \mu + (C - B \bar{r}) \Sigma^{-1} \mathbf{1} \right]

全局最小方差组合是 rˉ=B/A\bar{r} = B/A 的特例,得到:

wGMV=Σ−111⊤Σ−11w_{\text{GMV}} = \frac{\Sigma^{-1} \mathbf{1}}{\mathbf{1}^\top \Sigma^{-1} \mathbf{1}}

切线组合(在存在无风险资产时最大化 Sharpe 比率)由在拉格朗日量中令 γ=0\gamma = 0 得到,这移除了预算约束,只最大化 (w⊤μ−rf)/w⊤Σw(w^\top \mu - r_f) / \sqrt{w^\top \Sigma w}。解为:

wtan=Σ−1(μ−rf1)1⊤Σ−1(μ−rf1)w_{\text{tan}} = \frac{\Sigma^{-1} (\mu - r_f \mathbf{1})}{\mathbf{1}^\top \Sigma^{-1} (\mu - r_f \mathbf{1})}

这就是教材的标准答案。Boyd & Vandenberghe 的 Convex Optimization(2004,第 4 章)以不同的变量名给出了同样的推导。几何结构完全相同。

两基金分离定理

这是 Markowitz 引以为豪的部分。有效前沿是 (σ,r)(\sigma, r) 空间中的一条曲线,其上每个点都仅由两个组合的组合表示:任取两个有效组合即可。

选取 GMV 组合和切线组合。则任意预期收益为 rˉ\bar{r} 的有效组合都可写为:

w(rˉ)=αwGMV+(1−α)wtanw(\bar{r}) = \alpha w_{\text{GMV}} + (1 - \alpha) w_{\text{tan}}

其中 α\alpha 用来达到 rˉ\bar{r}。实践中意味着:计算两个组合,再做线性组合。整个前沿都来自一次矩阵求逆和若干标量运算。

实际生产代码中没人这样算整个前沿。他们直接对单一 rˉ\bar{r} 求解 QP,或求解对偶问题(均值-方差追踪:固定方差,最大化收益)。结果相同。

当无风险资产存在时

如果你能以无风险利率 rfr_f 借入和借出,有效前沿会塌缩。新的有效集是资本市场线,一条从 (0,rf)(0, r_f) 出发、穿过切线组合的射线。每个有效组合都是:

w=(1−β)wrf+βwtanw = (1 - \beta) w_{\text{rf}} + \beta w_{\text{tan}}

其中 wrfw_{\text{rf}} 是 100% 持有现金,β\beta 是风险预算。β=1\beta = 1 表示全部投资于切线组合。β>1\beta > 1 表示按 rfr_f 借入以杠杆放大切线组合。

Sharpe 称之为推广后的”两基金分离定理”。Tobin 称之为”分离定理”。无论如何,它就是每一个目标日期基金和 60/40 组合背后的数学。

你为什么还会用它

说老实话?原始形式几乎没人用。无约束的 Markowitz 解因产生集中、高杠杆、极端空头的组合而臭名昭著。如果你给它 50 个资产和 5 年的月度数据,它会欣然地把某个随机小盘股配到 -180%,并把若干其他资产配到 +280%。这正是 Michaud (1989) 称 MVO 为”误差放大器”的全部缘由(见下一篇文章)。

但要点在于:每一种现代方法都是构建在 Markowitz 之上。Black-Litterman 在 μ\mu 上加一个贝叶斯先验,重新求解同一个 QP。稳健 MVO 用不确定集替换 (μ,Σ)(\mu, \Sigma),再求解同一个 QP。CVaR 优化把方差目标换成条件在险价值,但结构仍是带有同样约束的二次/线性规划。

所以要先学 Markowitz,并不是因为你会在原始形式下用它,而是因为每一种改造都需要你理解基础情形。

一个可运行的示例

下面是最小有用的实现。计算 4 个资产集合的 GMV 组合:

import numpy as np

mu = np.array([0.08, 0.12, 0.15, 0.10])
Sigma = np.array([
    [0.04, 0.01, 0.02, 0.005],
    [0.01, 0.09, 0.03, 0.01],
    [0.02, 0.03, 0.16, 0.02],
    [0.005, 0.01, 0.02, 0.05]
])

# Closed-form global minimum-variance portfolio
Sigma_inv = np.linalg.inv(Sigma)
ones = np.ones(len(mu))
w_gmv = Sigma_inv @ ones / (ones @ Sigma_inv @ ones)

print("GMV weights:", w_gmv.round(4))
print("Sum:", w_gmv.sum().round(6))

对上述输入,会产生类似 [0.42, 0.21, 0.10, 0.27] 的结果。求和恰好为 1。没有负权重,但这只是该协方差矩阵的偶然结果。换一个 Σ\Sigma 就会出现空头。

对 rf=0.02r_f = 0.02 时的切线组合:

r_f = 0.02
excess = mu - r_f * ones
w_tan = Sigma_inv @ excess / (ones @ Sigma_inv @ excess)
print("Tangency weights:", w_tan.round(4))

输出将高度集中,很可能 60% 以上落在”每单位方差贡献下超额收益最高”的那个资产上。这正是 Michaud 所抱怨的问题。

文献综述

  • Markowitz (1952). “Portfolio Selection.” Journal of Finance 7(1): 77-91. 原始论文。
  • Markowitz (1959). Portfolio Selection: Efficient Diversification of Investments. Wiley. 书的形式,含有完整 QP。
  • Luenberger (2013). Investment Science. 2nd ed. Oxford University Press. 第 6 章给出了我所知最干净的推导。ISBN: 978-0-19-974008-6。
  • Boyd & Vandenberghe (2004). Convex Optimization. Cambridge University Press. 第 4 章将 MVO 视为 QP 并展示了对偶形式。ISBN: 978-0-521-83378-3。
  • Michaud (1989). “The Markowitz Optimization Enigma: Is ‘Optimized’ Optimal?” Financial Analysts Journal 45(1): 31-42. “误差放大器”的批评。下一篇文章详细讨论。
  • Black & Litterman (1992). “Asset Allocation: Combining Investor Views with Market Equilibrium.” Goldman Sachs Fixed Income Research. MVO 的贝叶斯升级。

完整前沿的计算

上面的闭式表达式每次给出一个组合。要画出完整有效前沿,需要把 rˉ\bar{r} 从 GMV 收益扫到最大可行收益,逐点计算 w⋆(rˉ)w^\star(\bar{r})。

在 Python 中,完整前沿的代码很短:

import numpy as np
import matplotlib.pyplot as plt

# Inputs as before
mu = np.array([0.08, 0.12, 0.15, 0.10])
Sigma = np.array([
    [0.04, 0.01, 0.02, 0.005],
    [0.01, 0.09, 0.03, 0.01],
    [0.02, 0.03, 0.16, 0.02],
    [0.005, 0.01, 0.02, 0.05]
])
r_f = 0.02

Sigma_inv = np.linalg.inv(Sigma)
ones = np.ones(len(mu))

# Sweep target returns
A = ones @ Sigma_inv @ ones
B = ones @ Sigma_inv @ mu
C = mu @ Sigma_inv @ mu
D = A * C - B**2

targets = np.linspace(0.085, 0.18, 50)  # Min to max
risks, weights = [], []

for r_bar in targets:
    w = ((A * r_bar - B) * Sigma_inv @ mu + (C - B * r_bar) * Sigma_inv @ ones) / D
    risk = np.sqrt(w @ Sigma @ w)
    risks.append(risk)
    weights.append(w)

# Plot frontier
plt.plot(risks, targets, 'b-', label='Efficient Frontier')
plt.xlabel('Volatility')
plt.ylabel('Expected Return')
plt.title('Mean-Variance Efficient Frontier')
plt.grid(True)
plt.legend()
plt.show()

前沿在 (σ,r)(\sigma, r) 空间是一条双曲线。顶点是 GMV 组合。渐近线是加入无风险资产后的切线(CML)。形状对任意资产数都一样。变化的是曲率和可达收益的范围。

一个有用的诊断指标是前沿上每一点的 Sharpe 比率。其在切线组合处取得最大值。从切线组合向 GMV 移动时,Sharpe 会下降,因为你在用更多波动率换取更低的边际收益。

敏感性分析:权重有多稳定?

原始 Markowitz 权重在 (μ,Σ)(\mu, \Sigma) 的小扰动下并不稳定。要看到这一点,把每个输入扰动 1% 并重新计算权重:

Δw≈−Σ−1(ΔΣ)w+Σ−1Δμ⋅λ\Delta w \approx -\Sigma^{-1} (\Delta \Sigma) w + \Sigma^{-1} \Delta \mu \cdot \lambda

权重变化在两项中都正比于 Σ−1\Sigma^{-1}。对病态的 Σ\Sigma(风险集中、资产数量少),Σ−1\Sigma^{-1} 的元素很大。权重可能剧烈摆动。

这种敏感性正是 Michaud”误差放大器”批评背后的数学。我们在上一篇关于估计误差的文章中详细讨论过。这里要说明的是:它直接源于优化本身,并非 bug。

对偶形式:均值-方差追踪

Markowitz 的一个等价形式是对偶:固定方差,最大化收益。

max⁡ww⊤μs.t.w⊤Σw≤σtarget21⊤w=1,w≥0\begin{aligned} \max_w \quad & w^\top \mu \\ \text{s.t.} \quad & w^\top \Sigma w \leq \sigma^2_{\text{target}} \\ & \mathbf{1}^\top w = 1, \quad w \geq 0 \end{aligned}

这是一个二次约束线性规划(QCLP)。给定目标波动率 σtarget\sigma_{\text{target}},它找到预期收益最高的组合。扫过 σtarget\sigma_{\text{target}},就描出与原始形式相同的前沿。

对偶形式对带约束的问题在计算上更友好,因为可达 (σ,r)(\sigma, r) 对的凸包更易于讨论。它也是风险预算和波动率目标控制应用中的常用形式,这些场景下你固定波动率并最大化收益。

加入头寸限制与行业约束

真实组合有约束。标准集合如下:

  • 不允许做空:w≥0w \geq 0
  • 无杠杆:∑i∣wi∣≤L\sum_i |w_i| \leq L(对不允许做空情形通常 L=1L = 1)
  • 头寸上限:每个 ii 都有 wi≤cmax⁡w_i \leq c_{\max}
  • 行业上限:∑i∈sectorwi≤bsector\sum_{i \in \text{sector}} w_i \leq b_{\text{sector}}
  • 换手率上限:∑i∣wi−wi,current∣≤Tmax⁡\sum_i |w_i - w_{i,\text{current}}| \leq T_{\max}

以上都是线性的(杠杆那条在不允许做空下也是线性的)。QP 保持凸性,用任何标准求解器即可。

头寸上限 cmax⁡c_{\max} 是隐形的稳定器。当 cmax⁡=0.10c_{\max} = 0.10(任一资产不超过组合的 10%)时,优化器无法集中,权重被迫分散。

实践中,机构组合的 cmax⁡c_{\max} 通常在 0.050.05 至 0.150.15 之间。低于 5% 是在强制过度分散;高于 15%,则等同于没有上限。

拉格朗日量再论:带约束情形

如果你想要带约束 QP 的完整 KKT 条件,这里给出。问题:

min⁡w12w⊤Σw−λw⊤μs.t. Aw=b, w≥0\min_w \frac{1}{2} w^\top \Sigma w - \lambda w^\top \mu \quad \text{s.t. } A w = b, \ w \geq 0

带等式乘子 ν\nu 和不等式乘子 η\eta 的拉格朗日量:

L=12w⊤Σw−λw⊤μ−ν⊤(Aw−b)−η⊤w\mathcal{L} = \frac{1}{2} w^\top \Sigma w - \lambda w^\top \mu - \nu^\top (A w - b) - \eta^\top w

KKT 条件:

  1. 平稳性:Σw−λμ−A⊤ν−η=0\Sigma w - \lambda \mu - A^\top \nu - \eta = 0
  2. 原始可行性:Aw=b,w≥0A w = b, w \geq 0
  3. 对偶可行性:η≥0\eta \geq 0
  4. 互补松弛性:对所有 ii,ηiwi=0\eta_i w_i = 0

互补松弛条件是关键:若 wi>0w_i > 0,则 ηi=0\eta_i = 0,该约束未生效;若 wi=0w_i = 0,则 ηi≥0\eta_i \geq 0,约束生效(优化器在该资产上被阻止进一步变负)。

代码层面,现代 QP 求解器会为你处理所有这些。你不必手写 KKT 方程组。但理解它有助于解读求解器的输出。

要点回顾

三件事。

第一:Markowitz 的问题是,在达到收益目标和全额投资的约束下,最小化方差。目标是 w⊤Σww^\top \Sigma w,约束是线性的,解是涉及 Σ−1\Sigma^{-1} 的闭式表达。

第二:有效前沿由两个组合张成:GMV 组合和切线组合。其他所有有效组合都是它们的线性组合。

第三:没人把原始形式用于生产。所有人都在用某种后代。先学基础情形,再学后代。

前沿本身是 (σ,r)(\sigma, r) 空间中的双曲线。对偶形式固定波动率、最大化收益,从另一个角度得到相同前沿。头寸限制和行业约束是线性的附加项,使 QP 保持凸性的同时避免病态权重。KKT 条件告诉你最优处哪些约束生效,对理解组合是有用的诊断信息。

一个实践提示:在 cvxpy、quadprog 或其他任何求解器中实现时,请始终对协方差矩阵加一个小的正则项。当 Σ\Sigma 接近奇异时会出现数值问题。加上 ϵI\epsilon I(ϵ≈10−8\epsilon \approx 10^{-8})可让求解器保持稳定。这与 Ledoit-Wolf 收缩思想相同,只是目的从统计变成了数值。

Markowitz 公式通过其后代获得了巨大的”第二次生命”。每一种现代组合优化方法,在某种意义上都是对”如何修正 Markowitz?“的回答。本模块接下来的 11 篇文章全部围绕这些修正展开。

下一篇文章:为什么会有这些后代,估计误差问题。