← 返回模块
4.4.3.3beta 可读 · 未来付费校验通过内容版本 2026-05-28

鲁棒优化与分布鲁棒投资组合优化

4.4.3 · 实践约束与压力测试 · 量化全流程

某沪深300指增私募的中级量化研究员把 L2 的成本感知优化器跑了三年。样本内纸面 Sharpe = 1.4,实盘 Sharpe = 0.7。她把回测净值拆开,发现两件事:12-1 截面动量 mu_hat 的标准误差是均值的 3-5 倍——Chopra-Ziemba(1993)《The effect of errors in means, variances, and covariances on optimal portfolio choice》(JPM)就是这个经典结论——优化器把噪声当信号在读,集中在估计误差正向最大的那几只名上。L2 用的 Ledoit-Wolf 收缩协方差 Sigma_LW 也是估计,小特征值方向上的噪声不平凡——优化器在「假性低波」(spurious low-vol)的方向上加仓,而那个方向的真实风险被样本协方差低估了。结果:纸面最优在样本外崩盘。把估计不确定性​​直接定价进优化​​是 L3 的修法:把 (mu, Sigma) 的点估计 MV 换成对 (mu, Sigma) 最坏情况(worst-case)的 min-max 问题,再叠一层区制感知(regime-aware)外壳,在低波 / 正常 / 高波 / 危机四个区制间动态调档 gammab_maxTO_max。这是 2008 之后机构风控栈真在跑的版本。

术语对齐表

本课新增的核心术语,与 data/glossaries/quant-glossary.yaml 标准译名一致:​​条件在险价值​​(conditional VaR,即 CVaR / Expected Shortfall,worst-case CVaR 形式的核心)、​​在险价值​​(value at risk,VaR,即分位数版本)、​​风险平价​​(risk parity,作为分散度比的极限基准)。L1 / L2 沿用过来:​​组合优化​​(portfolio optimization)、​​均值方差优化​​(mean-variance optimization)、​​协方差矩阵​​(covariance matrix)。后续讨论统一使用上述标准译名。

三种鲁棒 / DRO 表述的标准顺序

下面是 ​Inline-code listing​​,按固定顺序列出三种鲁棒表述:

goldfarb_iyengar_robust_mv: max_w mu_hat @ w - kappa * sqrt(w @ Sigma_mu @ w) - gamma/2 * w @ Sigma @ w; Sigma_mu = Sigma_r / T (sampling covariance of mu_hat); kappa = sqrt(chi2.ppf(confidence_level, N)) (chi-squared radius); SOCP solved by SCS / MOSEK; the sqrt(w @ Sigma_mu @ w) term is the WORST-CASE mu correction
worst_case_cvar_zhu_fukushima: min_w max_{P in P} CVaR_{alpha, P}(L(w)) via Rockafellar-Uryasev CVaR_alpha(L) = min_eta [eta + 1/(1-alpha) * E_P[max(L - eta, 0)]]; moment-based P reduces to SDP via duality; the COHERENT / FRTB-compatible robust formulation
distributionally_robust_optimisation: max_w min_{Q in P_ambig} E_Q[U(w, r)] with ambiguity set P_ambig either (a) moment-based (Delage-Ye 2010, SOCP), (b) Wasserstein (Mohajerin-Esfahani-Kuhn 2018, LP/SOCP/SDP, the MODERN PRACTITIONER DEFAULT), or (c) phi-divergence (Ben-Tal et al 2013, KL / chi^2 / TV variants)

规则:Wasserstein DRO > moment-based DRO > robust MV > plug-in MV

​Goldfarb-Iyengar(2003)鲁棒 MV​​。在 mu_hat 周围定义不确定性集 U_mu,求解

maxwminμUμ  wμγ2wΣw.\max_w \min_{\mu \in U_\mu} \; w^{\top} \mu - \frac{\gamma}{2} w^{\top} \Sigma w.

经典选择是​​椭球不确定性集​​(ellipsoidal uncertainty set)Uμ={μ:(μμ^)Σμ1(μμ^)κ2}U_\mu = \{\mu : (\mu - \hat{\mu})^{\top} \Sigma_\mu^{-1} (\mu - \hat{\mu}) \leq \kappa^2\},其中 Σμ\Sigma_\mumu_hat 的估计误差协方差。对 TT 个独立同分布、协方差为 Σr\Sigma_r 的资产收益,样本均值的估计误差协方差是 Σμ=Σr/T\Sigma_\mu = \Sigma_r / T——这就是样本均值的 CLT 标准误差。卡方半径 κ=χN2(confidence level)\kappa = \sqrt{\chi^2_{N}(\text{confidence level})} 控制保护级别:κ=0\kappa = 0 回到点估计 MV;κ=χN2(0.95)\kappa = \sqrt{\chi^2_N(0.95)} 是 95% 置信椭球(实务默认)。内层 min 有 Cauchy-Schwarz 闭式

minμUμ  wμ=wμ^κwΣμw,\min_{\mu \in U_\mu} \; w^{\top} \mu = w^{\top} \hat{\mu} - \kappa \sqrt{w^{\top} \Sigma_\mu w},

外层 max 变成 SOCP maxw  wμ^κwΣμw(γ/2)wΣw\max_w \; w^{\top} \hat{\mu} - \kappa \sqrt{w^{\top} \Sigma_\mu w} - (\gamma/2) w^{\top} \Sigma w,约束沿用 L1 + L2。κwΣμw\kappa \sqrt{w^{\top} \Sigma_\mu w} 项是​​最坏情况修正​​(worst-case correction):对 mu_hat 估计误差敏感的组合(单只资产权重 w 大的)会得到大惩罚;分散组合得到小惩罚。鲁棒最优是「alpha 捕获」与「最坏情况 mu 保护」之间的最优权衡。

​最坏情况 CVaR(Zhu-Fukushima 2009)​​。当损失分布本身不确定时,把点估计 CVaR 换成在分布族 P\mathcal{P} 上的最坏情况 CVaR:

minwmaxPP  CVaRα,P(L(w)).\min_w \max_{P \in \mathcal{P}} \; \text{CVaR}_{\alpha, P}(L(w)).

Rockafellar-Uryasev(2000)等价表达 CVaRα(L)=minη[η+(1α)1EP[max(Lη,0)]]\text{CVaR}_\alpha(L) = \min_\eta [\eta + (1 - \alpha)^{-1} \mathbb{E}_P[\max(L - \eta, 0)]] 让内层期望对 P 线性,所以矩约束模糊集 Pmom={P:EP[r]=μ,EP[(rμ)(rμ)]=Σ}\mathcal{P}_{\text{mom}} = \{P : \mathbb{E}_P[r] = \mu, \mathbb{E}_P[(r - \mu)(r - \mu)^{\top}] = \Sigma\} 通过对偶可以把最坏情况 CVaR 化成半定规划(SDP)。这是符合 Basel-III FRTB 的「coherent」鲁棒表述——FRTB 的标准监管风险度量就是 97.5% Expected Shortfall(条件在险价值),最坏情况 CVaR 层即其 DRO 版本。

​分布鲁棒优化(DRO)​​。最一般的形式:maxwminQPambigEQ[U(w,r)]\max_w \min_{Q \in \mathcal{P}_{\text{ambig}}} \mathbb{E}_Q[U(w, r)],其中模糊集 Pambig\mathcal{P}_{\text{ambig}} 可以是 (a) ​矩约束​​(Delage-Ye 2010, Operations Research,SOCP 可处理);(b) ​Wasserstein​​(Mohajerin-Esfahani 与 Kuhn 2018, MP,现代实务默认——根据支撑集和效用函数为 LP / SOCP / SDP);(c) ​phi-散度​​(Ben-Tal 等 2013,KL / chi-squared / TV 三种变种)。带半径 ϵ\epsilonp-Wasserstein 球围绕经验分布的 DRO 是主流选择——epsilon 通过交叉验证调参;得到的组合可证地对 Wasserstein 距离不超过 epsilon 的所有分布鲁棒。

区制感知外壳的标准顺序

下面是 ​Inline-code listing​​,按固定顺序列出五项外壳要素:

regime_indicator: us = VIX level (US-exchange 30-day SPX implied vol); cn = 21-day EWMA of cross-sectional realised vol on CSI 300 constituents (default; alternative = 中证波动率指数 if liquid)
regime_thresholds: low_vol < 15 (or < 15% annualised cross-sec vol for cn); normal 15-25; high_vol 25-40; crisis > 40
gamma_schedule: gamma_low = 1.0, gamma_normal = 2.0, gamma_high = 5.0, gamma_crisis = 10.0
b_max_schedule: b_max_low_normal = 0.05, b_max_high_crisis = 0.02 (tighter position limits in crisis)
TO_max_schedule: TO_max_normal = 0.20, TO_max_crisis = 0.05 (less trading in crisis to avoid forced selling)

规则:the regime overlay AUTOMATICALLY de-risks in high-vol / crisis regimes, raising gamma + tightening b_max + tightening TO_max simultaneously

CN 区制指标的默认选择是「沪深300 成分股横截面已实现波动率」的 21 日 EWMA——把 300 只成分股每日的横截面标准差按 EWMA 平滑;一旦 中证波动率指数(中证 vol index)进入活跃报价区间也可以直接用,但 2026 年仍以横截面已实现波动率为主流默认。低波(< 15% 年化横截面波动)对应 2017 的「白马大盘行情」与 2024 上半年的低波区间;15%-25% 是正常波动(历史观测的主体);25%-40% 是高波压力,沪深300 在 2018 Q4、2022 春节后、2024 春节后短暂的区间;40%+ 是危机区制,典型如 2015 年 6-7 月股灾(Sharpe 跌穿 0、千股跌停)、2020 年 1-3 月新冠急跌、2024 年 1 月雪球敲入冲击。Hamilton(1989)Econometrica《A new approach to the analysis of nonstationary time series and the business cycle》的马尔可夫切换(Markov-switching)模型是学界标准,但实务上交易台仍用阈值版,因为它零滞后、可直接喂进 T+1 调仓流程。

gamma_schedule 阶梯 1.0 → 2.0 → 5.0 → 10.0 嵌入了机构风控委员会在「危机预案」里写下的风险厌恶。MV 目标 wμ(γ/2)wΣww^{\top} \mu - (\gamma/2) w^{\top} \Sigma wgamma 上升时把组合推向最小方差,gamma = 10 时基本相当于在解风险平价问题。b_max 从 5% 收紧到 2% 减少危机区制单名的特异风险;TO_max 从 20% 收紧到 5% 避免 2015 股灾 / 2020 新冠急跌时优化器追跌的连环踩踏——一旦优化器在流动性枯竭时硬切主动风险,反而要在最差的时点为最大的成本拖累买单。这一外壳的关键是「自动化」:PM 不需要手动介入,区制指标穿越阈值的瞬间外壳就接管参数切换。

实现:solve_robust_mv

import cvxpy as cp
import numpy as np
import scipy.stats

def solve_robust_mv(
    mu_hat: np.ndarray,
    Sigma: np.ndarray,
    Sigma_mu: np.ndarray,
    w_prev: np.ndarray,
    w_B: np.ndarray,
    B_sector: np.ndarray,
    ADV: np.ndarray,
    c_linear: np.ndarray,
    c_q: float = 1.0,
    V_0: float = 1.0,
    gamma: float = 2.0,
    kappa: float = None,
    confidence_level: float = 0.95,
    b_max: float = 0.05,
    AS_min: float = 0.30,
    TO_max: float = 0.20,
    solver: str = 'SCS',
) -> dict:
    # Sigma_mu:mu_hat 的估计误差协方差(典型 Sigma_LW / T)。
    # kappa:卡方半径。None 时由 confidence_level 算出(0.95、N=30 时约 7.5)。
    # SCS 是 cvxpy 解 SOCP 的默认后端;MOSEK 是机构生产首选。
    N = len(mu_hat)
    if kappa is None:
        kappa = float(np.sqrt(scipy.stats.chi2.ppf(confidence_level, N)))
    w = cp.Variable(N)
    trade = w - w_prev
    Sigma_mu_chol = np.linalg.cholesky(Sigma_mu)
    robust_correction = kappa * cp.norm(Sigma_mu_chol @ w, 2)
    objective = cp.Maximize(
        mu_hat @ w
        - robust_correction
        - gamma / 2 * cp.quad_form(w, Sigma)
        - c_linear @ cp.abs(trade) * V_0
        - c_q * cp.quad_form(trade, np.diag(1.0 / ADV)) * V_0
    )
    constraints = [
        cp.sum(w) == 1,
        w >= 0,
        B_sector.T @ (w - w_B) == 0,
        cp.abs(w - w_B) <= b_max,
        0.5 * cp.sum(cp.abs(w - w_B)) >= AS_min,
        cp.norm(trade, 1) <= TO_max,
    ]
    prob = cp.Problem(objective, constraints)
    prob.solve(solver=getattr(cp, solver))
    assert prob.status == 'optimal', f'solver failed: {prob.status}'
    w_optimal = w.value
    utility = float(prob.value)
    realised_robust_correction = float(kappa * np.sqrt(w_optimal @ Sigma_mu @ w_optimal))
    diversification = float(np.sum(w_optimal ** 2) / np.sum(np.diag(Sigma) * w_optimal ** 2))
    return {
        'w_optimal': w_optimal,
        'utility': utility,
        'realised_robust_correction': realised_robust_correction,
        'diversification': diversification,
        'kappa': kappa,
        'status': prob.status,
    }

函数签名、默认值、返回 dict 的键与美国版按字节对齐,只有注释翻译。Cholesky 因子 Sigma_mu_chol 把二次型 w @ Sigma_mu @ w 化成向量范数 ||Sigma_mu_chol @ w||_2,cvxpy / SCS 把它原生当二阶锥约束处理。输出 realised_robust_correction 是优化器为「mu_hat 误判保险」自愿让出的年化 bp——30 只 CSI 300 大盘股、95% 置信水平下典型 30-80 bp 年化。

实现:regime_aware_overlay

def regime_aware_overlay(
    regime_indicator: float,
    base_params: dict = None,
) -> dict:
    # regime_indicator:US -> VIX 水平;CN -> CSI 300 横截面已实现波动 21 日 EWMA。
    # base_params:可选,覆盖区制条件参数 dict。
    if regime_indicator < 15:
        regime = 'low_vol'
    elif regime_indicator < 25:
        regime = 'normal'
    elif regime_indicator < 40:
        regime = 'high_vol'
    else:
        regime = 'crisis'
    params = {
        'low_vol': {'gamma': 1.0, 'b_max': 0.05, 'TO_max': 0.20},
        'normal': {'gamma': 2.0, 'b_max': 0.05, 'TO_max': 0.20},
        'high_vol': {'gamma': 5.0, 'b_max': 0.03, 'TO_max': 0.10},
        'crisis': {'gamma': 10.0, 'b_max': 0.02, 'TO_max': 0.05},
    }
    if base_params is not None:
        for k, v in base_params.items():
            for p_name, p_val in v.items():
                params[k][p_name] = p_val
    return {
        'regime': regime,
        'gamma': params[regime]['gamma'],
        'b_max': params[regime]['b_max'],
        'TO_max': params[regime]['TO_max'],
    }

函数名、参数名、区制标签、阈值、参数值与美国版按字节对齐,只有注释翻译。CN 账户的 regime_indicator 用沪深300 横截面已实现波动率的 21 日 EWMA,直接从 Tushare / Wind 的成分股 30 日历史日收益拿;US 账户用对应交易所的 VIX 实时报价。

读鲁棒 + 区制诊断量

Formula Explorer

x^2

三个诊断量重要。realised_robust_correction 是纸面 Sharpe 的保险费——超过 L2 纸面 Sharpe 的 20% 就说明鲁棒修正过紧(把 kappa 从 95% 信心降到 90% 信心);​​分散度比​​(diversification ratio,Herfindahl 比加权方差 Herfindahl)衡量组合分散程度,接近 1 表示单名集中,接近 N 表示风险平价极限。区制时间序列应该和 PM 的宏观读判一致:CSI 300 横截面波动突破 40% 进入「危机」时,优化器自动切到 gamma = 10b_max = 2%TO_max = 5%——去风险化配置。如果外壳和 PM 读判分歧(比如波动率不高但信用利差或人民币离岸汇率已经预警),需要补充第二个区制指标——可以选 10 年期国开债收益率波动、人民币离岸 1 周隐含波动、或者大宗商品(铁矿 / 原油)的国内连续合约 IV。

工作示例:7 年期三条管线

把上面 Fenced Python 块 solve_robust_mv + regime_aware_overlay 拼到 30 只 CSI 300 行业龙头基础上的 7 年月度回测里:Sigma_LW 用滚动 60 月,Sigma_mu = Sigma_LW / 60,mu_hat 用 12-1 截面动量,L2 的 CN 成本向量,沪深300 成分股横截面已实现波动 21 日 EWMA 作区制指标。三条管线:(a) L2 基线 kappa = 0gamma = 2;(b) 鲁棒 MV kappa = sqrt(chi2.ppf(0.95, 30))gamma = 2;(c) 区制外壳 kappa = 0、四档区制调参。2015 年 6 月股灾、2018 Q4 贸易战、2020 年 1-3 月新冠、2024 年 1 月雪球敲入冲击,是外壳把 gamma 从 2 切到 10、b_max 收紧到 2% 的四次大事件——(c) 在这些区间的最大回撤比 (a) 小 30%-50%。2015 年 5 月「股神」热潮、2020 年 7 月新基狂热是外壳过度反应的反例——阈值需要在多个周期上交叉验证再线上化。事后归因看,鲁棒 MV (b) 在样本外 7 年里付出大约 50-80 bp 年化的「保险费」,换取最大回撤从 35% 缩到 22%——这一保险费是头部量化私募在《年度风控白皮书》里写明的成本预算,通常占总管理费的 20%-30%。区制外壳 (c) 比 (b) 更激进:在低波区制把 gamma 调到 1.0,允许优化器在风平浪静的时段放大头寸吃 alpha;在危机区制把 gamma 调到 10.0,直接逼近最小方差组合。两套机制叠加(同时打开 kappa > 0 与区制外壳)是头部私募的实际生产配置——一份组合既对参数估计稳健,又对宏观区制切换敏感。

CN 实务上还有一个补丁:​​国内宏观区制指标增强​​。沪深300 横截面波动率有时滞后大宗商品 / 离岸人民币几个交易日,可在 regime_indicator 加权融合三个序列——Indicator_HS300_RV + Indicator_USDCNH_Vol + Indicator_CGB10Y_RV,权重通过对 2015-06、2018-Q4、2020-Q1、2024-Q1 四次危机的 ROC 曲线优化得到,可把领先信号提前 5-10 个交易日。头部量化私募(明汯、幻方、九坤、灵均、衍复)在他们的 2023 年度风控白皮书里都披露过类似的多指标融合做法,各家的具体权重略有差异但思路一致:Vol-Surface、Credit-Spread、Currency-Vol 三大块协同打分。

练习

Exercise

在 30 只 CSI 300 行业龙头(china_a_30_universe.csv)、2018-2023 月度样本内 + 2024-2025 样本外,给定 (i) 每个再平衡日的 12-1 截面动量信号 mu_hat_t,(ii) 滚动 60 月 Ledoit-Wolf 协方差 Sigma_LW_t,(iii) Sigma_mu_t = Sigma_LW_t / 60(60 月样本均值的抽样协方差),(iv) ADV_t、L2 的 CN c_linearc_q,(v) 区制指标时序 regime_indicator_t(沪深300 横截面已实现波动率 21 日 EWMA):对比 7 年回测里的三条月度再平衡管线。(a) L2 基线——无鲁棒 / 无区制的成本感知 MV(gamma=2.0 恒定、kappa=0.0 失活鲁棒修正)。(b) 鲁棒 MV——每次再平衡调用 solve_robust_mvkappa = sqrt(chi2.ppf(0.95, N))gamma=2.0 恒定。(c) 区制感知外壳——每次再平衡先调 regime_aware_overlay(regime_indicator_t) 拿到 (gamma, b_max, TO_max),再用这些区制参数调 L2 的 solve_cost_aware_mv(kappa=0.0)。对每条管线 (a)-(c) 在 7 年回测里报告 (i) 样本外年化 Sharpe,(ii) 样本外最大回撤,(iii) 样本外实盘波动率,(iv) 对管线 (c),报告四档区制(low_vol / normal / high_vol / crisis)各自占比。验证管线 (b) 与 (c) 把样本外最大回撤比 (a) 降低 30%-50%,代价是样本外 Sharpe 下降 5%-15%。识别管线 (c) 的危机区制去风险化机制:把 gamma_t、区制指标、实盘回撤画到一张图上;验证去风险化事件(gamma_t 跳到 5.0 或 10.0)领先最大回撤 1-3 个月(CN:2015-06、2018-Q4、2021-Q3、2022-04)。

提示
kappa=0.0 失活鲁棒;用恒定 gamma=2.0, b_max=0.05, TO_max=0.20 失活区制。保持 (a)/(b)/(c) 间 cvxpy 图结构稳定。
提示
样本外最大回撤是 2024-2025 累计收益的「峰底比」。区制外壳在 CSI 300 横截面波动穿越 25% 时切换,你的 gamma_t 时序应该在阈值穿越点上有阶跃跳变。

桥接 L4

L1 + L2 + L3 三套机件:仅做多约束 + 成本感知 + 鲁棒修正 + 区制外壳,合在一起就是机构优化器。L4 把它们串成机构每次再平衡真在跑的「七阶段端到端生产管线」:从 alpha 信号引入(4.2.3 输出)→ Barra 风险模型(4.4.2 L1 的 Sigma = B Sigma_F B' + D)→ L1 约束栈 → L2 成本感知 → L3 鲁棒 + 区制 → 事前压力测试(pre-trade stress test)→ 绿灯 / 黄灯 / 红灯(green-light / yellow-light / red-light)部署门禁 → 事后归因(post-rebalance reconciliation)。压轴是「部署工程师的一天」:把研究端给出的 alpha 向量塞进管线、压力测试通过、上线、T+1 对账、给风控委员会出日报。这是从研究到生产到合规的全栈视角,也是当下中国头部私募基金在量化研究院和交易台中间设立「策略部署组」的核心职能,贯穿日内、日终与跨日三个工作流环节。