跳到正文

最小方差组合,以及为什么它是唯一应该上线的 MVO

最小方差组合是你决定放弃估计 $\mu$ 之后剩下的那个东西。它只要 $\Sigma$,是个简单的 QP,隐式地在做收缩,样本外常常打赢用了预期收益的 MVO。这里是数学和理由。

第 9 篇 · 共 12 篇 约 12 分钟

前面几篇把估计误差讲完之后,你大概会觉得均值-方差优化整个是浪费时间。但 MVO 里有一个角落从 1952 年到现在扛住了所有批评,就是最小方差组合。

它不估 μ\mu,一点都不估,只要 Σ\Sigma。它只做一件事:在全额投资的前提下找到波动率最低的那个组合。

这不是妥协,是一笔明确的交易。放弃估计预期收益,等于放弃了任何你本来可能预测到的收益。换回来的是稳定的权重、对估计误差的稳健性、(在没有做空约束时)闭式解,以及样本外经常比用了预期收益的 MVO 更好的表现。这笔交易划不划算,取决于你的预期收益估计到底有多差——下面会用一个具体的标准误算给你看,答案通常是:很差。

数学部分很短。真正值得花时间的是理由,以及为什么大多数机构嘴上说自己在跑 MVO,跑的其实是最小方差。

问题

NN 个资产,协方差矩阵 Σ\Sigma,找一个方差最小的组合 ww,全额投资,不许做空:

min⁡w12w⊤Σws.t.1⊤w=1w≥0\begin{aligned} \min_{w} \quad & \frac{1}{2} w^\top \Sigma w \\ \text{s.t.} \quad & \mathbf{1}^\top w = 1 \\ & w \geq 0 \end{aligned}

就这样。预算约束、不许做空,加上(因为权重和为 1 且非负而隐含的)不加杠杆。目标是凸二次型,NN 个自由变量、1 个等式约束、NN 个不等式约束。只要 Σ\Sigma 正定,问题良态、解唯一。

注意 μ\mu 从头到尾没出现。

去掉不许做空的约束,这个问题有闭式解。写出拉格朗日量

L(w,γ)=12w⊤Σw−γ(1⊤w−1)\mathcal{L}(w, \gamma) = \frac{1}{2} w^\top \Sigma w - \gamma (\mathbf{1}^\top w - 1)

一阶条件是

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

于是 w=γΣ−11w = \gamma \Sigma^{-1}\mathbf{1},代回预算约束定出

γ=11⊤Σ−11\gamma = \frac{1}{\mathbf{1}^\top \Sigma^{-1} \mathbf{1}}

得到

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

这就是第一篇文章里的全局最小方差组合,全程没用到任何关于预期收益的信息。有意思的是它隐含地仍然是某个目标收益下的 Markowitz 解,那个目标收益是 rˉ=1⊤Σ−1μ/1⊤Σ−11\bar{r} = \mathbf{1}^\top \Sigma^{-1}\mu / \mathbf{1}^\top \Sigma^{-1}\mathbf{1}——只不过你不需要知道 μ\mu 就能找到这个组合。

把 w≥0w \geq 0 加回来,闭式解就没了。拉格朗日量变成

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

其中 λ≥0\lambda \geq 0,每个 ii 满足互补松弛 λiwi=0\lambda_i w_i = 0。实际上你不用手写这些,扔给 QP 求解器就行,cvxpy、quadprog、Gurobi、Mosek 在毫秒级别解完。

解出来通常有一大堆零权重:优化器把资本压到低方差资产上,其余置零。100 只股票的池子,不许做空的最小方差组合可能只剩 30 到 50 个非零头寸。这是特性不是 bug——零权重就是正则化在起作用,优化器通过置零完成了资产筛选,不需要额外挂一套机器学习流水线。

它其实一直在做收缩

有一个漂亮的等式解释了上面那个稳健性从哪来。对权重加 L2 惩罚的最小方差,

min⁡ww⊤Σw+λ∥w∥2s.t. budget\min_{w} w^\top \Sigma w + \lambda \|w\|^2 \quad \text{s.t. budget}

和对被扰动过的协方差矩阵做标准最小方差,

min⁡ww⊤(Σ+λI)ws.t. budget\min_{w} w^\top (\Sigma + \lambda I) w \quad \text{s.t. budget}

是同一个问题。L2 惩罚把权重往等权方向收缩,而在协方差那一侧,加上单位阵的倍数正是向 F=σˉ2IF = \bar{\sigma}^2 I 做收缩的形式。两者可以精确对上:目标函数乘一个正常数不改变最优解,所以对 δσˉ2I+(1−δ)Σ^\delta \bar{\sigma}^2 I + (1-\delta)\hat{\Sigma} 做最小方差,等同于取 λ=δσˉ2/(1−δ)\lambda = \delta \bar{\sigma}^2 / (1-\delta) 的 L2 惩罚版本。

换句话说,带一点 L2 惩罚的最小方差组合,在数学上就是不带预期收益的 Ledoit-Wolf 收缩 MVO。最小方差之所以稳健,不是因为它做了什么特别的事,而是因为它一直在隐式收缩。

显式加 L2 的写法:

import cvxpy as cp

w = cp.Variable(n_assets)
Sigma_psd = Sigma + 1e-6 * np.eye(n_assets)  # Numerical safety

objective = cp.quad_form(w, Sigma_psd) + lam * cp.sum_squares(w)
constraints = [cp.sum(w) == 1, w >= 0]

problem = cp.Problem(cp.Minimize(objective), constraints)
problem.solve()

w_mv = w.value

λ\lambda 用交叉验证调。股票池上的月度收益数据,典型取值在 0.010.01 到 0.10.1 之间。

放弃 μ\mu 到底赚了多少

最小方差只依赖 Σ\Sigma,而 Σ\Sigma 比 μ\mu 好估得多。把两个组合的误差来源摆开对比,切线组合(用了预期收益的那个)大致是

E[∥w^tan−w0∥2]∝1μ02[Var(μ^)+Var(Σ^)+cross terms]\mathbb{E}[\|\hat{w}_{\text{tan}} - w_0\|^2] \propto \frac{1}{\mu_0^2} \left[ \text{Var}(\hat{\mu}) + \text{Var}(\hat{\Sigma}) + \text{cross terms} \right]

而最小方差组合是

E[∥w^MV−w0∥2]∝Var(Σ^)\mathbb{E}[\|\hat{w}_{\text{MV}} - w_0\|^2] \propto \text{Var}(\hat{\Sigma})

这两式是示意性的量级分解,不是严格不等式的证明。它们要说的是:最小方差这边少了 Var(μ^)\text{Var}(\hat{\mu}) 这一整项,也没有前面那个把所有误差按 1/μ021/\mu_0^2 放大的因子——而被去掉的恰好是最大的那一项。

大到什么程度,算一次就清楚。取 5 年月度收益(T=60T = 60),年化波动率 20% 的资产,月度标准差约 5.8%,均值估计的标准误就是 5.8%/60≈0.77%5.8\% / \sqrt{60} \approx 0.77\% 每月,年化约 9%。如果这个资产的真实预期收益是 10%,那你的估计误差是它的九成。你估出来的”预期收益”和一个抛硬币的结果差不了太多,而 MVO 会把这个数字当成确定的输入去解,然后忠实地把资本堆到误差最大的那个资产上。

值得一提的是,这个问题没法靠加数据频率解决。把日频换成分钟频,协方差估计会明显变准,均值估计几乎纹丝不动——均值的估计精度只取决于样本跨越的时间长度,跟采样频率无关。Σ\Sigma 和 μ\mu 的收敛速度都是 1/T1/\sqrt{T},但对 Σ\Sigma 你能通过提高频率把 TT 做大,对 μ\mu 你只能等。

同一件事也解释了换手率的差异。协方差矩阵随时间变化得慢,均值向量变化得快,所以最小方差的权重变化缓慢、Markowitz 的权重跳来跳去。这不是两种优化器的性格差异,是两种输入的性质差异。

Ledoit-Wolf 收缩

既然稳健性来自收缩,就值得把标准做法完整写一遍。Ledoit 和 Wolf (2004) 的估计量是样本协方差和一个结构化目标的凸组合:

Σ^LW=δσˉ2I+(1−δ)Σ^\hat{\Sigma}_{\text{LW}} = \delta \bar{\sigma}^2 I + (1 - \delta) \hat{\Sigma}

其中 Σ^\hat{\Sigma} 是样本协方差,σˉ2\bar{\sigma}^2 是平均方差(Σ^\hat{\Sigma} 对角线元素的均值),δ∈[0,1]\delta \in [0,1] 是收缩强度。最优的 δ\delta 使期望的 Frobenius 平方损失最小:

δ⋆=arg⁡min⁡δE[∥δσˉ2I+(1−δ)Σ^−Σ0∥F2]\delta^\star = \arg\min_\delta \mathbb{E}\left[\|\delta \bar{\sigma}^2 I + (1-\delta)\hat{\Sigma} - \Sigma_0\|_F^2\right]

它有闭式解,写成

δ⋆=∑i,jVar(σ^ij)/N2∑i,j(σ^ij−Fij)2/N2\delta^\star = \frac{\sum_{i,j} \text{Var}(\hat{\sigma}_{ij}) / N^2}{\sum_{i,j} \left( \hat{\sigma}_{ij} - F_{ij} \right)^2 / N^2}

其中 F=σˉ2IF = \bar{\sigma}^2 I 是收缩目标。分子刻画样本估计量本身的抖动,分母刻画样本协方差偏离结构化目标的距离——样本越不可靠、或者目标离样本越近,收缩就越狠,这个取舍在式子里一目了然。要注意分子里的 Var(σ^ij)\text{Var}(\hat{\sigma}_{ij}) 本身也得估:它需要收益样本的四阶矩,光有样本协方差矩阵是算不出来的。这也是自己实现容易出错的地方。

import numpy as np

def ledoit_wolf_shrink(returns):
    T, N = returns.shape
    returns_centered = returns - returns.mean(axis=0)
    Sigma_hat = returns_centered.T @ returns_centered / T
    
    # Structured target: scaled identity
    sigma_bar_sq = np.trace(Sigma_hat) / N
    F = sigma_bar_sq * np.eye(N)
    
    # Compute optimal shrinkage intensity
    delta = _optimal_shrinkage_intensity(returns_centered, Sigma_hat, F)
    
    return delta * F + (1 - delta) * Sigma_hat

def _optimal_shrinkage_intensity(X, Sigma_hat, F):
    T, N = X.shape
    # Estimate variance of sample covariance entries
    # ... (omitted for brevity, but straightforward)
    # See Ledoit & Wolf (2004) for exact formula
    pass

上面这段留空的部分正是四阶矩那块。实务里没必要自己写,sklearn.covariance.LedoitWolf 的实现是对的,直接用。

它实际上买到了什么

Clarke、de Silva 和 Thorley (2006) 在美股上系统研究了最小方差组合,结论是它的波动率明显低于市值加权基准,而风险调整后的表现更好。这个结果在不同的样本区间和不同的构造细节下都反复出现,但具体数字对回溯窗口、股票池和约束设置相当敏感,引用之前先看清对方的口径,或者干脆在自己的数据上重跑一遍。

它跑赢的原因也不神秘。Haugen 和 Baker (1991) 记录的低波动率异常说的是,低波动率股票的风险调整收益与高波动率股票相当甚至更好;Frazzini 和 Pedersen (2014) 的”做空 beta”因子把它做成了一个显式的多空组合——做多低 beta、做空高 beta。最小方差组合本质上就是这个因子的纯多头倾斜版本:你在最小化组合方差,于是自动超配低波动率股票、低配高波动率股票。

所以最小方差组合相对市值加权基准的超额收益里,相当大一部分其实是在隐式收割低波动率因子。这不是巧合,而是同一件事的两种说法。知道这一点有实际后果:如果你的组合里已经有了一个显式的低波动或 BAB 敞口,再叠一个最小方差组合,你得到的分散化会比预期少。

它的代价

最小方差组合的绝对收益往往偏低。在一个股票池上,它的绝对收益会跑输等权组合——放弃了资产选择,就是放弃了预期收益,这一条没有免费的版本。

从这个角度看,最小方差是预期收益 MVO 的另一个极端。MVO 用更高的方差换取超配高收益资产;最小方差用更低的收益换取低配高波动资产。两者都是角落解,真相在中间:Black-Litterman、对 μ\mu 的收缩、贝叶斯先验,都是在试图把最小方差的稳健性和它主动扔掉的那部分收益信息重新拼起来。

具体到什么时候它会让你难受,有三种情形。第一种是强上行趋势:牛市里最小方差跑输等权,因为高波动率股票的上行它没参与,这是对它最标准的批评。第二种是风格轮动:价值、成长、动量之间发生切换时最小方差适应很慢,因为它的权重由协方差决定,而协方差本来就变得慢。第三种是股票债券混合池加上低利率环境:债券波动率低,最小方差会大幅压到债券上,而债券的预期收益此时可能低到拖垮整个组合。

三种情形的病根是同一个:最小方差不看预期收益,它是纯粹的风险配置。如果你对预期收益确实有强观点,你需要的是别的模型,而不是给最小方差打补丁。

还有一层不那么显眼的代价。虽然最小方差不使用预期收益,它相对基准仍然承担了主动风险:如果基准是市值加权,而你的权重向低波动率股票倾斜,你就是在主动低配高 beta 股票。这份主动风险”隐性”在你从未声明过任何预期收益,但它照样会体现在跟踪误差里。对有基准的机构资产管理人,这反而是个卖点——不用宣称自己有 alpha 就能承担主动风险;对没有基准的纯多头配置人,这根本不是问题,他们要的就是低波动率。

生产里怎么配

一个能上线的最小方差组合大致长这样:

import numpy as np
import pandas as pd
import cvxpy as cp

def long_only_min_var(returns, lam=0.05):
    Sigma = returns.cov().values
    Sigma_shrunk = shrunk_cov(returns, method='ledoit_wolf')
    n = Sigma_shrunk.shape[0]
    
    w = cp.Variable(n)
    objective = cp.quad_form(w, Sigma_shrunk) + lam * cp.sum_squares(w)
    constraints = [cp.sum(w) == 1, w >= 0, w <= 0.10]  # Cap at 10% per asset
    
    problem = cp.Problem(cp.Minimize(objective), constraints)
    problem.solve()
    
    return pd.Series(w.value, index=returns.columns)

单资产 10% 的上限是个实用约束。没有它,优化器会把仓位堆到两三只波动率极低的资产上——数学上没错,作为一个组合则不可接受。

除此之外还有三个参数要定。再平衡频率一般是月度或季度,比月度更频繁基本只增加交易成本而看不到改善。协方差的回溯窗口是最需要经验判断的一个:一年(252 个交易日)能捕捉当前状态但噪声大,两到三年是机构的标准选择,五年以上噪声更低但会把已经过去的状态混进来。多数机构风险系统用两到三年,有些用每日滚动更新的窗口,有些用对近期观测加权更重的指数加权移动平均。窗口选择没有理论上的正确答案,不同窗口给出不同组合,这一点要在回测里承认而不是回避。第三个是重估节奏:每次再平衡都重新估 Σ\Sigma,不要拿一个固定的历史窗口一路用到底。

真实的机构流水线还要再往上叠几层。用三到五年日度收益做 Ledoit-Wolf 收缩估出 Σ\Sigma;用 Black-Litterman 后验把均衡收益和组合经理的观点合成为 μ\mu;解一个带目标收益、风险约束、不许做空和行业上限的优化;对相对当前组合的换手加惩罚;最后输出交给执行的交易清单。常见的目标函数写法是

min⁡w w⊤Σ^LWw−λw⊤μBL\min_w \ w^\top \hat{\Sigma}_{\text{LW}} w - \lambda w^\top \mu_{\text{BL}}

其中 λ\lambda 是权衡参数,越大越偏向收益一侧。这个组合的性质是:通过 Black-Litterman 锚定在市场上,因为收缩而换手率低,因为约束而尊重集中度限制。理论上不纯粹,实践中管用,这就是主流机构的配置模型。

每一步都有自己的软件(Axioma、Barra、Bloomberg PORT),也有自己的假设和失效模式。干净的 Markowitz 公式是理论基础,上线的东西是一条参数众多、反复调过的流水线,这两者之间的距离比大多数教科书暗示的要远。

跟 1/N 比

DeMiguel、Garlappi 和 Uppal (2009) 那个著名结果是:等权 1/N 在七个数据集上的样本外表现,平均而言好过 14 种复杂的组合优化方法。最小方差是被测试的方法之一。

那么直接比较呢?最小方差的事前波动率一定低于 1/N,这是构造决定的;1/N 的换手率更低、完全没有估计误差,夏普出奇地好;最小方差在多数时期的绝对风险调整收益上占优;1/N 对模型设定错误更稳健。

实用的结论是两者在样本外夏普上大致打平,差别在绝对波动率:最小方差更低。如果你有波动率目标,最小方差能用更少的杠杆达到它,这一点在杠杆有成本的时候很值钱;如果你没有波动率目标,1/N 就够了。

Kritzman、Page 和 Turkington (2010) 从另一头论证:只要输入估得像样(尤其是用足够长的样本估协方差),优化后的组合是能稳定打赢 1/N 的,1/N 的优势被夸大了。两边的证据放在一起,务实的做法是把两者混着用——1/N 和最小方差各一半,通常能避开任何一端的最坏情形。你不知道未来十年哪种方法更对,在方法之间分散和在资产之间分散是同一种正则化。

那么什么时候该用它

如果你在构造组合时不相信自己的预期收益估计——读完前面那个 90% 相对误差的算例之后,这应该是默认状态——站得住脚的做法是:对 Σ\Sigma 做 Ledoit-Wolf 收缩,解不许做空的最小方差 QP,加一点 L2 正则化,如果确实有观点再选择性地向 Black-Litterman 隐含收益倾斜。

这套东西不光彩夺目。它规避了 MVO 里最大的误差来源,把剩下的那个误差用收缩压小,隐式地收割了低波动率因子,然后在样本外站住了。在 MVO 的各种变体里,能同时做到这几件事的不多。

文献

  • Markowitz (1952). “Portfolio Selection.” Journal of Finance 7(1): 77-91. 原始论文。最小方差组合是特例。
  • Clarke, de Silva & Thorley (2006). “Minimum-Variance Portfolios in the U.S. Equity Market.” Journal of Portfolio Management 33(1): 10-24. 开创性的实证研究。
  • Ledoit & Wolf (2004). “A Well-Conditioned Estimator for Large-Dimensional Covariance Matrices.” Journal of Multivariate Analysis 88(2): 365-411. 让最小方差稳健的收缩估计量。
  • Haugen & Baker (1991). “The Efficient Market Inefficiency of Capitalization-Weighted Stock Portfolios.” Journal of Portfolio Management 17(3): 35-40. 低波动率异常。
  • Frazzini & Pedersen (2014). “Betting Against Beta.” Journal of Financial Economics 111(1): 1-25. BAB 因子。
  • DeMiguel, Garlappi & Uppal (2009). “Optimal Versus Naive Diversification: How Inefficient is the 1/N Portfolio Strategy?” Review of Financial Studies 22(5): 1915-1953.
  • Kritzman, Page & Turkington (2010). “In Defense of Optimization: The Fallacy of 1/N.” Financial Analysts Journal 66(2): 31-39.
  • Broadie (1993). “Computing Efficient Frontiers Using Estimated Parameters.” Annals of Operations Research 45(1): 21-58. 均值-方差中的估计误差。

下一篇文章:CVaR 优化,用尾部风险度量替代方差。