跳到正文

CVaR 优化,以线性规划的方式

Rockafellar & Uryasev (2000) 把一个看似要先知道分位数才能算的量,写成了一个凸最小化——于是尾部风险优化塌成一个线性规划。以及为什么真正的难点从来不在优化器。

第 11 篇 · 共 12 篇 约 12 分钟

方差在高斯世界里是个不错的风险度量。我们不在高斯世界。股票收益有肥尾,债券收益分布不对称,加密货币的下行几乎无界。方差把这些全部错过。

条件在险价值(CVaR),也叫预期短缺、预期尾部损失,或者干脆读作”最差 α% 情形下的平均损失”,是机构给出的答案。它是一致风险度量,它盯着损失真正发生的那一段分布。但让它从一个漂亮的定义变成一件能用的工具的,是 Rockafellar 和 Uryasev 2000 年那篇论文:他们证明这个看上去必须先知道分位数才能算的量,可以写成一个凸最小化问题——代入历史情景之后,整件事塌成一个线性规划。

下面先说清楚 CVaR 是什么、为什么它比方差站得住,然后把 LP 一步步搭出来。搭完之后你会发现真正的难点根本不在优化器那一侧。

方差错在哪

方差对上行和下行同等惩罚。一个 30% 上行波动、0% 下行波动的组合,与一个 0% 上行、30% 下行的组合方差相同——对拿着钱的人来说,这两件事完全不是一回事。

更麻烦的是它是二次度量,捕捉不到尾部形状。一个低方差、但有 5% 概率损失 50% 的组合,和一个没有尾部风险、日常波动中等的组合,可以有相同的”方差”。真实投资者关心的是前者那 5%。

Kritzman、Page 和 Turkington 在 Financial Analysts Journal (2012) 的 “Regime Shifts: Implications for Dynamic Strategies” 里给这件事做过实证:波动率在不同状态之间的差别,远小于尾部风险在状态之间的差别。用波动率去代理风险,你会觉得两个状态差不多;用尾部度量去看,它们不是一个东西。

CVaR 同时修掉这两处。它不对称,只看损失;它是尾部的度量,只看最差的 α% 情景。

定义,以及一个容易写反的下标

设 XX 为组合损失,XX 越大越糟,FX(x)=P(X≤x)F_X(x) = P(X \leq x) 为其累积分布函数,α∈(0,1)\alpha \in (0, 1) 为尾部概率(α=0.05\alpha = 0.05 表示最差的 5%)。

水平 α\alpha 下的在险价值(VaR)是这个阈值:

VaRα(X)=min⁡{x:FX(x)≥1−α}\text{VaR}_\alpha(X) = \min \{ x : F_X(x) \geq 1 - \alpha \}

注意右边是 1−α1 - \alpha 而不是 α\alpha。因为 XX 是损失,“最差 5%“落在分布的上尾,所以取的是 95% 分位数。这个下标反过来写是文献里最常见的笔误之一,一旦写反,后面所有 1/α1/\alpha 的系数都会失去意义。

CVaR(即水平 α\alpha 的预期短缺)是 XX 在超过 VaR 条件下的条件期望:

CVaRα(X)=E[X∣X≥VaRα(X)]\text{CVaR}_\alpha(X) = \mathbb{E}[X \mid X \geq \text{VaR}_\alpha(X)]

取最差 α% 的情形,对损失求平均。就这么简单。

对连续分布还有一个干净的积分表示:

CVaRα(X)=1α∫0αVaRu(X)du\text{CVaR}_\alpha(X) = \frac{1}{\alpha} \int_0^\alpha \text{VaR}_u(X) du

即把尾部概率从 0 扫到 α\alpha,对沿途所有 VaR 求平均。对 α=0.05\alpha = 0.05,这就是最差 5% 结果的平均值。

一致性:四条公理和两个失败者

一致风险度量(Artzner et al., 1999)要满足四条公理。单调性:若在所有状态下 X≤YX \leq Y,则 ρ(X)≤ρ(Y)\rho(X) \leq \rho(Y)。平移不变性:对任意常数 cc,ρ(X+c)=ρ(X)+c\rho(X + c) = \rho(X) + c。次可加性:ρ(X+Y)≤ρ(X)+ρ(Y)\rho(X + Y) \leq \rho(X) + \rho(Y),也就是分散化不该增加风险。正齐次性:对 λ≥0\lambda \geq 0,ρ(λX)=λρ(X)\rho(\lambda X) = \lambda \rho(X)。

方差一上来就挂在第一条和第二条:它根本不度量损失,而且给所有结果加一个常数它纹丝不动。VaR 挂在第三条,这是个著名结论——两个各自 VaR 为 $10 的组合,合并之后 VaR 可以超过 $20。这不是病态构造,两笔尾部不重叠的违约敞口就能做出来。一个会因为你分散而变大的风险数字,没法拿来做限额。

CVaR 四条全过。这就是它在机构风险管理里成为数学上站得住的那个选择的原因。

Rockafellar-Uryasev 公式

上面的定义有个实操上的麻烦:要算 CVaR,你得先知道 VaR,而 VaR 是个分位数——分位数关于权重 ww 既不连续也不凸,直接塞进优化器是灾难。

Rockafellar 和 Uryasev 的做法是把分位数从”要先求出来的东西”变成”顺带解出来的东西”:

CVaRα(X)=min⁡ζ{ζ+1αE[(X−ζ)+]}\text{CVaR}_\alpha(X) = \min_{\zeta} \left\{ \zeta + \frac{1}{\alpha} \mathbb{E}[(X - \zeta)^+] \right\}

其中 (X−ζ)+=max⁡(X−ζ,0)(X - \zeta)^+ = \max(X - \zeta, 0),ζ\zeta 是一个自由变量。对 ζ\zeta 求最小,最优的 ζ⋆\zeta^\star 恰好等于 VaRα(X)\text{VaR}_\alpha(X),而最优目标值恰好等于 CVaRα(X)\text{CVaR}_\alpha(X)。你不必事先知道分位数,优化会把它交出来。

这个结果之所以关键,是因为 E[(X−ζ)+]\mathbb{E}[(X - \zeta)^+] 是 XX 的分布的线性泛函,而 max⁡(⋅,0)\max(\cdot, 0) 是分段线性的。凸性有了,线性结构也有了。

搭成 LP

把它接到组合上。设 ww 为权重,rjr_j 为资产 jj 的收益,Lj=−rjL_j = -r_j 为损失,组合损失是

X(w)=−w⊤r=∑jwjLjX(w) = -w^\top r = \sum_j w_j L_j

在目标收益约束下最小化 CVaR:

min⁡w,ζζ+1αT∑t=1Tuts.t.ut≥−w⊤r(t)−ζ,∀tut≥0,∀t1⊤w=1,w≥0w⊤rˉ≥rˉmin⁡\begin{aligned} \min_{w, \zeta} \quad & \zeta + \frac{1}{\alpha T} \sum_{t=1}^T u_t \\ \text{s.t.} \quad & u_t \geq -w^\top r^{(t)} - \zeta, \quad \forall t \\ & u_t \geq 0, \quad \forall t \\ & \mathbf{1}^\top w = 1, \quad w \geq 0 \\ & w^\top \bar{r} \geq \bar{r}_{\min} \end{aligned}

TT 是历史情景数 r(1),…,r(T)r^{(1)}, \ldots, r^{(T)},rˉmin⁡\bar{r}_{\min} 是目标预期收益。变量有三组:ww 是资产权重,ζ\zeta 是 VaR 估计,utu_t 每个情景一个,用来捕捉超出 VaR 的那部分损失。ut≥0u_t \geq 0 和 ut≥损失−ζu_t \geq \text{损失} - \zeta 两条约束合起来就是 max⁡(⋅,0)\max(\cdot, 0)——这是把分段线性函数塞进 LP 的标准手法。

目标和约束对所有变量都是线性的,所以这是个货真价实的线性规划。矩阵规模约为 (T+N+1)×(N+T+1)(T + N + 1) \times (N + T + 1),情景数在一万以内都很轻松。

这件事的好处有三层,值得分开说。第一层是凸:它是 LP,所以现成求解器就能上,拿到的是全局最优,不必像 Sharpe 比率优化(分数规划、非凸)那样操心局部极小。第二层是无分布假设:你在一组离散历史情景上优化,不假设任何参数分布,情景有肥尾它就尊重肥尾,情景来自压力时期它就捕获那段压力。第三层是读得懂:ζ\zeta 的最优值就是 VaR,目标的最优值就是 CVaR,权重就是配置,没有隐藏的正则化项,没有变换。

具体地,用 cvxpy 的一个可工作实现:

import cvxpy as cp
import numpy as np

# Historical return scenarios: shape (T, N)
returns_scenarios = returns_hist.values  # T scenarios, N assets

T, N = returns_scenarios.shape
alpha = 0.05  # Worst 5%
target_return = 0.008  # 0.8% monthly

# Variables
w = cp.Variable(N)
zeta = cp.Variable()  # VaR estimate
u = cp.Variable(T)    # Excess losses

# Portfolio losses (positive = loss)
losses = -returns_scenarios @ w  # shape (T,)

# Objective: minimize CVaR
objective = cp.Minimize(zeta + 1.0 / (alpha * T) * cp.sum(u))

# Constraints
constraints = [
    u >= losses - zeta,    # u_t = max(loss_t - VaR, 0)
    u >= 0,
    cp.sum(w) == 1,        # Fully invested
    w >= 0,                # Long-only
    returns_scenarios.mean(axis=0) @ w >= target_return
]

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

print("CVaR-optimal weights:", w.value.round(4))
print("Estimated VaR:", zeta.value)
print("Estimated CVaR:", problem.value)

典型规模下毫秒级出解,输出是一个不做空的组合,权重偏向在历史最差 5% 情景里表现好的资产。

把这个组合和同一批数据上的方差最优组合摆在一起,差别是有规律的。CVaR 最优组合的左尾风险更低,这是它被优化的方向;它在防御性资产上更集中,这是同一件事的另一种说法;而它的平均收益通常更低,因为方差会惩罚右尾的爆发,CVaR 不惩罚右尾,却也不会去追它。至于中位数收益谁高,取决于情景集合,别把它当成一条规律。这些都是定性方向而非定量结论——换一段情景,幅度会变,符号偶尔也会变。

你优化的其实是一个样本

上面这个 LP 里没有”真实分布”这个东西。目标里的 1αT∑ut\frac{1}{\alpha T}\sum u_t 是经验 CVaR,即最差 α% 的历史情景的平均。这是对真实 CVaR 的样本均值近似(SAA)。真实 CVaR 需要知道潜在的收益分布,而我们没有。

SAA 在 T→∞T \to \infty 时收敛到真实 CVaR,有限 TT 下有差距,而且这个差距的大小可以估:

Var(CVaR^)≈σtail2αT\text{Var}(\widehat{\text{CVaR}}) \approx \frac{\sigma_{\text{tail}}^2}{\alpha T}

σtail2\sigma_{\text{tail}}^2 是尾部结果的方差。分母上的 α\alpha 是重点:真正参与估计的样本量不是 TT 而是 αT\alpha T。要把方差减半,需要 4 倍情景。

实践上这意味着:情景要够多。几百个够撑起一个稳定的 CVaR 估计,几千个更好;5 年日度收益约 1,260 个情景,通常够用。想更严格,可以对权重加一点显式正则化(比如 L2)来应付 SAA 噪声。但要清楚这只是在压噪声的方差,压不掉情景本身的偏差——那是下面那件事。

情景才是真正的输入

优化器给你的答案完全由你喂进去的情景决定。这句话在生产里的分量比前面所有数学都重:换一段样本窗口,最优权重会变得面目全非。用 2008-2009 的数据,你会得到一个防御性组合;用 2017 的数据,你会得到一个动量倾斜的组合。情景窗口的选择和风险度量的选择同等重要,而前者通常没人写进方法论文档。

所以情景应当反映未来收益的分布,而不只是复述历史。常见的生成方式有五种,各有各的破绽。历史情景直接取一段历史收益,依赖结构真实,但情景数量有限且默认未来长得像过去。过滤后的历史情景在历史收益上套一层 GARCH 之类的模型以加入波动率聚集,能捕获状态条件动态,代价是引入模型依赖。蒙特卡洛情景从拟合好的模型(多元正态、t 分布、偏 t)模拟,情景要多少有多少,代价是模型误设风险。Bootstrap 情景有放回地重抽样历史收益,非参数,但受制于和历史情景一样的局限。压力情景为已知风险(金融危机、衰退、通胀飙升)手工构造,风险覆盖是显式的,代价是主观。

多数机构系统是混着用的:以过滤后历史为底,加上针对已知风险的压力情景。结果是一个既捕获统计规律、又不假装尾部不存在的情景集合。

加约束几乎不要钱

CVaR 优化和其他约束天然兼容,因为大部分现实约束本身就是线性的。交易成本 c⊤∣w−wcurrent∣c^\top |w - w_{\text{current}}| 关于权重变化线性,可以进约束也可以进目标;行业上限 ∑j∈sectorwj≤bsector\sum_{j \in \text{sector}} w_j \leq b_{\text{sector}} 线性;杠杆限制 ∑j∣wj∣≤L\sum_j |w_j| \leq L 线性(带绝对值,但权重全非负时它就是普通求和);换手率上限 ∑j∣wj−wj,current∣≤Tmax⁡\sum_j |w_j - w_{j,\text{current}}| \leq T_{\max} 同理。

唯一跳出去的是基数约束 ∑j1[wj>0]≤K\sum_j \mathbb{1}[w_j > 0] \leq K,它非凸,需要混合整数规划或松弛。带基数约束的 MILP 版本计算昂贵,所以大部分生产系统干脆丢掉它,改用”软”版本:在目标里对非零权重施加惩罚。

多期再平衡也接得上。把交易成本写进目标:

min⁡w,ζ,u,vζ+1αT∑tut+c∑tvt\min_{w, \zeta, u, v} \quad \zeta + \frac{1}{\alpha T} \sum_t u_t + c \sum_t v_t

约束为

ut≥−w⊤r(t)−ζ,∀tut≥0,∀tvt=∑i∣wi(t)−wi(t−1)∣budget and other constraints\begin{aligned} & u_t \geq -w^\top r^{(t)} - \zeta, \quad \forall t \\ & u_t \geq 0, \quad \forall t \\ & v_t = \sum_i |w_i^{(t)} - w_i^{(t-1)}| \\ & \text{budget and other constraints} \end{aligned}

这仍然是 LP(允许离散再平衡决策时变成 MILP),c∑tvtc \sum_t v_t 就是线性交易成本惩罚。一些机构资产管理人在用这个公式,它的实际效果是抑制过度再平衡:即使 CVaR 最优的再平衡建议你大额调仓,成本项会先问一句值不值。

至于真正的多期问题——不同时期收益相关、财富过程复利——有两条路。一条是模拟路径再在路径上优化:生成 KK 条多期收益路径,对每条算给定权重下的终端财富,对终端财富算 CVaR,然后优化。计算昂贵但灵活,CVaR 可以针对任何量(终端财富、回撤等等)。另一条是把它写成带补偿的随机规划,通过 Benders 分解或 progressive hedging 求解,理论上更干净但需要专门求解器。多数机构系统为省事走第一条。

α 不是可以随便填的

α\alpha 是尾部概率,越小越厌恶风险(盯更极端的尾),越大越接近均值-方差(盯不那么极端的尾)。这个敏感性比方差优化对参数的敏感性大得多:α=0.01\alpha = 0.01 时优化器极度规避风险,α=0.25\alpha = 0.25(最差四分之一)时它的行为已经很接近均值-方差。理论上没有哪个值有特权,但四个常用刻度各有出处:α=0.01\alpha = 0.01 极度厌恶风险;α=0.025\alpha = 0.025 是 Basel III 市场风险资本的标准;α=0.05\alpha = 0.05 是机构最常用的默认值;α=0.10\alpha = 0.10 明显更宽松。多数机构应用取 0.05,风险资本计算取 0.025 或 0.01。机构通常会跑多个 α\alpha 再混合,因为单点取值本身就是一个未经检验的假设。

α=0.05\alpha = 0.05 之所以成为默认,是因为它对应的”最差 5% 结果”在日度数据上大致是每月 1-2 天、或每 5 年一个季度,和大多数机构的观察期限对得上——你得能在合理时间内积累到足够多的尾部事件,才谈得上验证。

读论文时留一个心眼:这里的 α\alpha 是下尾概率,有些作者把 α\alpha 定义为置信水平(上尾),数字就整个反过来。这和前面 VaR 定义里那个 1−α1-\alpha 是同一个坑。

回测:这套东西最薄的地方

均值-方差有一个干净的样本外评价指标:实现 Sharpe 比率。CVaR 没有干净的等价物,因为实现 CVaR 依赖于未来最差 α% 的结果,而那是个极小的样本。日度收益、α=0.05\alpha = 0.05,一年大约只有 20 个尾部观测——用 20 个点去检验一个尾部平均值,能做的推断很有限。

标准流程仍然要走:

  1. 样本内跑 CVaR 优化。
  2. 样本外持有组合。
  3. 计算实现损失。
  4. 计算水平 α\alpha 下的实现 VaR,检查突破率(应该约等于 α\alpha)。
  5. 计算实现 CVaR(突破期的平均损失),与样本内 CVaR 对照。

突破率远高于 α\alpha,说明 VaR 模型不行;实现 CVaR 远高于样本内 CVaR,说明模型校准不当。VaR 的检验用 Christoffersen (1998) 是标准做法,要检验完整分布则 Berkowitz (2001) 更严格。

诚实的说法是:多数机构并不严格回测 CVaR。他们回测 VaR(容易得多),然后假设 VaR 没问题 CVaR 就没问题。这个假设在尾部形状变化时会失效,而尾部形状变化恰恰是你用 CVaR 的原因。知道自己在做这个妥协,比假装没做要好。

同一个 LP 结构还能换个损失定义重用。CVaR 度量的是固定时间窗内的损失,条件回撤(CDaR)度量的是相对峰值的回撤。对财富过程 WtW_t,设运行最大值 Mt=max⁡s≤tWsM_t = \max_{s \leq t} W_s,回撤为 Dt=Mt−WtD_t = M_t - W_t,则

CDaRα=E[Dt∣Dt≥DaRα]\text{CDaR}_\alpha = \mathbb{E}[D_t \mid D_t \geq \text{DaR}_\alpha]

其中 DaR 是回撤在险值,即回撤分布的相应分位数。对退休组合这类真正在意回撤路径的应用,CDaR 比 CVaR 更贴题,而它的优化同样是一个带辅助变量的线性规划——Rockafellar-Uryasev 那个技巧对任何这种”尾部条件期望”都管用。

它已经是监管语言

CVaR 现在是央行、主权财富基金和多数大型机构资产管理人的主导风险度量,Basel III 用预期短缺(CVaR 的一个变体)计算市场风险资本。这一步跨过去之后,用不用 CVaR 就不再是品味问题:如果你在搭机构风险系统,你需要它。

真正需要提醒自己的是分工。LP 是最不容易出错的那一环——凸、全局最优、毫秒级、库很成熟。会出错的是它上游的那些东西:你选的情景窗口、你选的 α\alpha、你没能力严格回测的那个尾部。优化器不会替你承担这些选择,它只会把它们放大成权重。

参考文献

  • Rockafellar & Uryasev (2000). “Optimization of Conditional Value-at-Risk.” Journal of Risk 2(3): 21-41. LP 公式,开创性论文。
  • Rockafellar & Uryasev (2002). “Conditional Value-at-Risk for General Loss Distributions.” Journal of Banking & Finance 26(7): 1443-1471. 扩展到非正态分布。
  • Artzner, Delbaen, Eber & Heath (1999). “Coherent Measures of Risk.” Mathematical Finance 9(3): 203-228. 一致性公理。
  • Acerbi & Tasche (2002). “Expected Shortfall: A Natural Coherent Alternative to Value at Risk.” Economic Notes 31(2): 379-388.
  • Krokhmal, Palmquist & Uryasev (2002). “Portfolio Optimization with Conditional Value-At-Risk Objective and Constraints.” Journal of Risk 4: 43-68. 完整组合公式。
  • Sarykalin, Serraino & Uryasev (2008). “Value-at-Risk vs. Conditional Value-at-Risk: A Comparison.” In Risk Management: Value at Risk and Beyond. Cambridge University Press.
  • Kritzman, Page & Turkington (2012). “Regime Shifts: Implications for Dynamic Strategies.” Financial Analysts Journal 68(3). 状态切换下波动率与尾部风险的差异。
  • Basel Committee on Banking Supervision (2016). “Minimum Capital Requirements for Market Risk.” Bank for International Settlements. 监管采纳。

下一篇文章:重采样效率。Michaud 的 bootstrap 方法,被形式化为机构应用。