CVaR 优化,以线性规划的方式
Rockafellar & Uryasev (2000) 把一个看似要先知道分位数才能算的量,写成了一个凸最小化——于是尾部风险优化塌成一个线性规划。以及为什么真正的难点从来不在优化器。
方差在高斯世界里是个不错的风险度量。我们不在高斯世界。股票收益有肥尾,债券收益分布不对称,加密货币的下行几乎无界。方差把这些全部错过。
条件在险价值(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 同时修掉这两处。它不对称,只看损失;它是尾部的度量,只看最差的 α% 情景。
定义,以及一个容易写反的下标
设 为组合损失, 越大越糟, 为其累积分布函数, 为尾部概率( 表示最差的 5%)。
水平 下的在险价值(VaR)是这个阈值:
注意右边是 而不是 。因为 是损失,“最差 5%“落在分布的上尾,所以取的是 95% 分位数。这个下标反过来写是文献里最常见的笔误之一,一旦写反,后面所有 的系数都会失去意义。
CVaR(即水平 的预期短缺)是 在超过 VaR 条件下的条件期望:
取最差 α% 的情形,对损失求平均。就这么简单。
对连续分布还有一个干净的积分表示:
即把尾部概率从 0 扫到 ,对沿途所有 VaR 求平均。对 ,这就是最差 5% 结果的平均值。
一致性:四条公理和两个失败者
一致风险度量(Artzner et al., 1999)要满足四条公理。单调性:若在所有状态下 ,则 。平移不变性:对任意常数 ,。次可加性:,也就是分散化不该增加风险。正齐次性:对 ,。
方差一上来就挂在第一条和第二条:它根本不度量损失,而且给所有结果加一个常数它纹丝不动。VaR 挂在第三条,这是个著名结论——两个各自 VaR 为 $10 的组合,合并之后 VaR 可以超过 $20。这不是病态构造,两笔尾部不重叠的违约敞口就能做出来。一个会因为你分散而变大的风险数字,没法拿来做限额。
CVaR 四条全过。这就是它在机构风险管理里成为数学上站得住的那个选择的原因。
Rockafellar-Uryasev 公式
上面的定义有个实操上的麻烦:要算 CVaR,你得先知道 VaR,而 VaR 是个分位数——分位数关于权重 既不连续也不凸,直接塞进优化器是灾难。
Rockafellar 和 Uryasev 的做法是把分位数从”要先求出来的东西”变成”顺带解出来的东西”:
其中 , 是一个自由变量。对 求最小,最优的 恰好等于 ,而最优目标值恰好等于 。你不必事先知道分位数,优化会把它交出来。
这个结果之所以关键,是因为 是 的分布的线性泛函,而 是分段线性的。凸性有了,线性结构也有了。
搭成 LP
把它接到组合上。设 为权重, 为资产 的收益, 为损失,组合损失是
在目标收益约束下最小化 CVaR:
是历史情景数 , 是目标预期收益。变量有三组: 是资产权重, 是 VaR 估计, 每个情景一个,用来捕捉超出 VaR 的那部分损失。 和 两条约束合起来就是 ——这是把分段线性函数塞进 LP 的标准手法。
目标和约束对所有变量都是线性的,所以这是个货真价实的线性规划。矩阵规模约为 ,情景数在一万以内都很轻松。
这件事的好处有三层,值得分开说。第一层是凸:它是 LP,所以现成求解器就能上,拿到的是全局最优,不必像 Sharpe 比率优化(分数规划、非凸)那样操心局部极小。第二层是无分布假设:你在一组离散历史情景上优化,不假设任何参数分布,情景有肥尾它就尊重肥尾,情景来自压力时期它就捕获那段压力。第三层是读得懂: 的最优值就是 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 里没有”真实分布”这个东西。目标里的 是经验 CVaR,即最差 α% 的历史情景的平均。这是对真实 CVaR 的样本均值近似(SAA)。真实 CVaR 需要知道潜在的收益分布,而我们没有。
SAA 在 时收敛到真实 CVaR,有限 下有差距,而且这个差距的大小可以估:
是尾部结果的方差。分母上的 是重点:真正参与估计的样本量不是 而是 。要把方差减半,需要 4 倍情景。
实践上这意味着:情景要够多。几百个够撑起一个稳定的 CVaR 估计,几千个更好;5 年日度收益约 1,260 个情景,通常够用。想更严格,可以对权重加一点显式正则化(比如 L2)来应付 SAA 噪声。但要清楚这只是在压噪声的方差,压不掉情景本身的偏差——那是下面那件事。
情景才是真正的输入
优化器给你的答案完全由你喂进去的情景决定。这句话在生产里的分量比前面所有数学都重:换一段样本窗口,最优权重会变得面目全非。用 2008-2009 的数据,你会得到一个防御性组合;用 2017 的数据,你会得到一个动量倾斜的组合。情景窗口的选择和风险度量的选择同等重要,而前者通常没人写进方法论文档。
所以情景应当反映未来收益的分布,而不只是复述历史。常见的生成方式有五种,各有各的破绽。历史情景直接取一段历史收益,依赖结构真实,但情景数量有限且默认未来长得像过去。过滤后的历史情景在历史收益上套一层 GARCH 之类的模型以加入波动率聚集,能捕获状态条件动态,代价是引入模型依赖。蒙特卡洛情景从拟合好的模型(多元正态、t 分布、偏 t)模拟,情景要多少有多少,代价是模型误设风险。Bootstrap 情景有放回地重抽样历史收益,非参数,但受制于和历史情景一样的局限。压力情景为已知风险(金融危机、衰退、通胀飙升)手工构造,风险覆盖是显式的,代价是主观。
多数机构系统是混着用的:以过滤后历史为底,加上针对已知风险的压力情景。结果是一个既捕获统计规律、又不假装尾部不存在的情景集合。
加约束几乎不要钱
CVaR 优化和其他约束天然兼容,因为大部分现实约束本身就是线性的。交易成本 关于权重变化线性,可以进约束也可以进目标;行业上限 线性;杠杆限制 线性(带绝对值,但权重全非负时它就是普通求和);换手率上限 同理。
唯一跳出去的是基数约束 ,它非凸,需要混合整数规划或松弛。带基数约束的 MILP 版本计算昂贵,所以大部分生产系统干脆丢掉它,改用”软”版本:在目标里对非零权重施加惩罚。
多期再平衡也接得上。把交易成本写进目标:
约束为
这仍然是 LP(允许离散再平衡决策时变成 MILP), 就是线性交易成本惩罚。一些机构资产管理人在用这个公式,它的实际效果是抑制过度再平衡:即使 CVaR 最优的再平衡建议你大额调仓,成本项会先问一句值不值。
至于真正的多期问题——不同时期收益相关、财富过程复利——有两条路。一条是模拟路径再在路径上优化:生成 条多期收益路径,对每条算给定权重下的终端财富,对终端财富算 CVaR,然后优化。计算昂贵但灵活,CVaR 可以针对任何量(终端财富、回撤等等)。另一条是把它写成带补偿的随机规划,通过 Benders 分解或 progressive hedging 求解,理论上更干净但需要专门求解器。多数机构系统为省事走第一条。
α 不是可以随便填的
是尾部概率,越小越厌恶风险(盯更极端的尾),越大越接近均值-方差(盯不那么极端的尾)。这个敏感性比方差优化对参数的敏感性大得多: 时优化器极度规避风险,(最差四分之一)时它的行为已经很接近均值-方差。理论上没有哪个值有特权,但四个常用刻度各有出处: 极度厌恶风险; 是 Basel III 市场风险资本的标准; 是机构最常用的默认值; 明显更宽松。多数机构应用取 0.05,风险资本计算取 0.025 或 0.01。机构通常会跑多个 再混合,因为单点取值本身就是一个未经检验的假设。
之所以成为默认,是因为它对应的”最差 5% 结果”在日度数据上大致是每月 1-2 天、或每 5 年一个季度,和大多数机构的观察期限对得上——你得能在合理时间内积累到足够多的尾部事件,才谈得上验证。
读论文时留一个心眼:这里的 是下尾概率,有些作者把 定义为置信水平(上尾),数字就整个反过来。这和前面 VaR 定义里那个 是同一个坑。
回测:这套东西最薄的地方
均值-方差有一个干净的样本外评价指标:实现 Sharpe 比率。CVaR 没有干净的等价物,因为实现 CVaR 依赖于未来最差 α% 的结果,而那是个极小的样本。日度收益、,一年大约只有 20 个尾部观测——用 20 个点去检验一个尾部平均值,能做的推断很有限。
标准流程仍然要走:
- 样本内跑 CVaR 优化。
- 样本外持有组合。
- 计算实现损失。
- 计算水平 下的实现 VaR,检查突破率(应该约等于 )。
- 计算实现 CVaR(突破期的平均损失),与样本内 CVaR 对照。
突破率远高于 ,说明 VaR 模型不行;实现 CVaR 远高于样本内 CVaR,说明模型校准不当。VaR 的检验用 Christoffersen (1998) 是标准做法,要检验完整分布则 Berkowitz (2001) 更严格。
诚实的说法是:多数机构并不严格回测 CVaR。他们回测 VaR(容易得多),然后假设 VaR 没问题 CVaR 就没问题。这个假设在尾部形状变化时会失效,而尾部形状变化恰恰是你用 CVaR 的原因。知道自己在做这个妥协,比假装没做要好。
同一个 LP 结构还能换个损失定义重用。CVaR 度量的是固定时间窗内的损失,条件回撤(CDaR)度量的是相对峰值的回撤。对财富过程 ,设运行最大值 ,回撤为 ,则
其中 DaR 是回撤在险值,即回撤分布的相应分位数。对退休组合这类真正在意回撤路径的应用,CDaR 比 CVaR 更贴题,而它的优化同样是一个带辅助变量的线性规划——Rockafellar-Uryasev 那个技巧对任何这种”尾部条件期望”都管用。
它已经是监管语言
CVaR 现在是央行、主权财富基金和多数大型机构资产管理人的主导风险度量,Basel III 用预期短缺(CVaR 的一个变体)计算市场风险资本。这一步跨过去之后,用不用 CVaR 就不再是品味问题:如果你在搭机构风险系统,你需要它。
真正需要提醒自己的是分工。LP 是最不容易出错的那一环——凸、全局最优、毫秒级、库很成熟。会出错的是它上游的那些东西:你选的情景窗口、你选的 、你没能力严格回测的那个尾部。优化器不会替你承担这些选择,它只会把它们放大成权重。
参考文献
- 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 方法,被形式化为机构应用。