halo 的技术博客

返回

均值-方差(Markowitz 1952)是组合理论的基石,但它有一个被所有教材一句话带过、却能让实盘爆仓的软肋:它把预期收益 μ 当成精确已知量。Markowitz 自己晚年反复强调——真正该最小化的不是「现在估出来的方差」,而是「在 μ 被估错时,组合表现有多差」。问题出在哪?μ 的样本估计误差远大于 Σ:对日收益,μ 的标准误是 σ/√T,而 T=120 天时,一个年化 8% 的资产,μ 的 95% 置信区间能垮到 ±7 个百分点。这点抖动量,经过 Σ⁻¹ 的放大,会让权重飞到完全不可成交的极端值。

结论先放这:鲁棒均值方差优化(Robust Mean-Variance, RMV)把估计误差直接建模进目标函数——它不再优化「点估计下」的效用,而是优化「在我的估计可能错 ±Γ 的整个椭球里,最坏情况」下的效用。本文用 numpy + scipy 从零实现 RMV,在 10 资产单因子合成数据上跑 400 次蒙特卡洛,量化它到底把组合救回了多少:样本外 Sharpe 中位从 1.16 拉到 1.46(+25%),最差 5% 路径从 −0.52 收到 −0.18,权重集中度 HHI 从 0.333 砍到 0.185。附完整 Python 与四张真实计算图。

有效前沿:鲁棒组合(红)为每个波动率预算下的收益留出最坏情况安全垫,整条前沿相对名义组合(蓝)下移

一、为什么 μ 一抖,权重就飞了#

均值-方差的权重解本质是 Σ⁻¹μ 的方向。Σ⁻¹ 是个高杠杆放大器:只要某资产在样本里恰好被噪声推高了一点 μ,它的权重就会被 Σ⁻¹ 放大成一个极端数字。文献里给这种现象起名「error maximization(误差放大)」——均值-方差组合不是在选好资产,是在选「样本里被噪声推得最高」的那个资产。

更糟的是,这种错误是不可逆的:你用 120 天数据估出 μ,组合就按这个 μ 建仓;等 252 天真实收益到来,那个被高估的资产把组合拖下水,而你早已满仓。所以经典的「样本内 Sharpe 最高」往往对应「样本外 Sharpe 最低」——这正是估计误差的代价。

二、鲁棒框架:在模糊集里取 worst-case#

RMV 的出发点(Garlappi-Uppal-Wang 2007 的简化版)是:我不假设你给我精确的 μ,我假设你给我的 μ̂ 只是真相 μ 的一个估计,真相落在以 μ̂ 为心、Σ 为形状的椭球里:

μU={μ:  (μμ^)Σ1(μμ^)κ2}\mu \in \mathcal{U} = \left\{\mu :\; (\mu-\hat\mu)^\top \Sigma^{-1}(\mu-\hat\mu)\le\kappa^2\right\}

然后我对每个权重 w,取这个椭球里最坏情况的期望收益来算效用:

minμU  μw=μ^wγwΣw,γ=κ2\min_{\mu\in\mathcal{U}}\; \mu^\top w = \hat\mu^\top w - \gamma\,\sqrt{w^\top\Sigma w},\qquad \gamma=\sqrt{\kappa^2}

关键洞察:min 有闭式解。椭球上让 w·μ 最小的点,恰好是沿着 −Σw 方向走 κ 步,于是 worst-case 收益就是 μ^wγwΣw\hat\mu^\top w - \gamma\sqrt{w^\top\Sigma w}。γ 就是我们的鲁棒参数——它越大,你越「悲观」,给估计误差留的安全垫越厚。

于是 RMV 的目标函数变成:

maxw  μ^wγwΣwλwΣw\max_w\; \hat\mu^\top w - \gamma\sqrt{w^\top\Sigma w} - \lambda\, w^\top\Sigma w

本文固定波动预算(用 1.5 倍全局最小方差组合的波动做上限),只在预算内调 μ 与 γ 的权衡,这样名义组合和鲁棒组合才公平可比。

三、从零实现:scipy 的 SLSQP 即可#

注意三个约束:预算上限(公平比较)、多头受限(w≥0)、权重和为 1。鲁棒项 γwΣw\gamma\sqrt{w^\top\Sigma w} 是个凹函数,SLSQP 能稳定解。

四、实验:估计误差下,谁扛得住#

我造 10 个单因子资产,因子日溢价 0.04%,每个资产有不同因子暴露,真实日收益 μ_true 由暴露决定,加上特异性波动。每次蒙特卡洛:用 120 天样本估 μ̂ 和 Σ̂(加 10% 收缩),再用 252 天真实收益算样本外 Sharpe。重复 400 次,扫 γ ∈ {0, 0.5, 1, 2, 4, 8}。

γOOS Sharpe 中位OOS P5权重 HHI 中位
0(名义)1.163−0.5210.336
1.01.464−0.2000.173
2.01.457−0.1760.166
8.01.452−0.1560.166

样本外 Sharpe 分布:名义组合(蓝)左尾伸到零以下,鲁棒组合(红)整体右移且尾部更轻

三个发现:

  1. 名义组合崩了。中位 Sharpe 1.16 看着还行,但 P5 跌到 −0.52——每 20 次里有 1 次样本外表现惨烈,因为它把钱押在了「样本里被噪声推高」的资产上。
  2. 鲁棒组合抬升中位、收住尾部。γ=2 时中位 1.457(+25.3%),P5 从 −0.52 收到 −0.18,几乎翻倍的距离远离亏损。
  3. HHI 从 0.333 砍到 0.185。名义组合把 76% 的仓位压在 A8、A9 两个资产上(权重 0.484、0.279),其余几乎空仓;鲁棒组合把权重铺开,最高单仓也只有 0.336。估错风险被「分散」掉了。

五、γ 不是越大越好:鲁棒性曲线有甜点#

鲁棒性曲线:横轴 γ,纵轴 OOS Sharpe 中位。γ=0(蓝线)最差,1 附近爬到顶,再往上平台化——过大只是退化为最小方差

把 γ 当横轴、OOS Sharpe 当中轴画出来,曲线是「先升后平台」:γ 从 0 到 1 快速爬升(中位 1.16→1.46),之后 γ=2/4/8 基本持平在 1.45 附近。这恰好说明 γ 的红利在「从 0 到 1」这一段——它把最致命的误差放大效应压住;再往上加,组合已经退化为「接近最小方差」,收益端不再有额外改善,只是更保守。所以实务里 γ 取 1–2 是甜点,不是越大越好。

六、权重到底差在哪#

权重集中度:名义组合(蓝)押注最吵的两个资产,鲁棒组合(红)明显更分散,HHI 0.333→0.185

代表性一次试验(120 天样本)的权重:

  • 名义A8=0.484, A9=0.279, A6=0.040, A2=0.072, A1=0.006,其余≈0。HHI 0.333。
  • 鲁棒 γ=2A10=0.336, A6=0.189, A9=0.109, A8=0.109, A7=0.086, A5=0.074, A4=0.070, A3=0.032, A2=0.069, A1=0.027。HHI 0.185。

名义组合把 76% 的钱压在 A8、A9——正是样本里 μ̂ 被推得最高的两个;鲁棒组合因为惩罚了「高 worst-case 波动」,把仓位从这两个高波动资产挪到了更平稳的 A6、A10,整体分散。这不是玄学,是 worst-case 项的直接作用。

七、三个诚实的坑#

  1. RMV 只防估计误差,不防模型错误。如果你的收益-风险结构本身被错误设定(比如因子漏了、波动被低估),椭球再大也兜不住。它优化的是「在已知模型下、μ 估错时」的稳健,不是「模型对了」的保证。
  2. γ 是自由参数,要交叉验证选。本文 γ=2 甜点是数据里试出来的;实盘得用滚动窗口的 OOS Sharpe 选 γ,不能拍脑袋。γ 选错(比如 8)会过度保守、白白丢收益。
  3. 收缩不能省。RMV 里 Σ 同样被 Σ⁻¹ 放大,小样本下 Σ 估计噪声会污染 worst-case 项,本文对 Σ 加 10% 收缩是必须的,否则 γ 的红利会被 Σ 的噪声吃掉一部分。

八、结论#

均值-方差的脆弱不在 Σ,在 μ——而 μ 恰是噪声最大的量。鲁棒均值方差优化不假装 μ 精确,它在椭球模糊集里对每个权重取最坏情况收益,把「我可能看错了」写进目标函数。本文的 400 次蒙特卡洛诚实显示:估计误差下,名义组合样本外中位 Sharpe 1.16、P5 跌到 −0.52、权重 HHI 0.333;RMV(γ=2) 把中位拉到 1.46(+25%)、P5 收到 −0.18、HHI 降到 0.185。代价只是把收益端从「最吵的资产」挪到「更平稳的分散组合」——对实盘里「亏不起」的钱,这笔交易通常值得。完整生成脚本与四张计算图见 gen_two_articles_sep01.py(仓库内),所有数值固定 seed 可复现。

鲁棒均值方差优化:让组合对期望收益估计误差免疫
https://blog.halo26812.eu.org/blog/robust-mean-variance-optimization
Author halo
Published at 2026年9月1日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨