风险度量的核心矛盾是:你要把一整条损失分布压缩成一个数字,交给风控、资金分配、监管报表去用。压缩必然丢信息,问题是丢哪些、留哪些。VaR 只留一个分位点,ES 留下尾部的平均,而谱风险度量(Spectral Risk Measure,SRM)给了一个更一般、也更诚实的答案:用一个「风险厌恶权重函数」把从最好到最坏的每一个分位数都称一遍重,再加权求和。这个框架不仅统一了 VaR 和 ES,还告诉你为什么 ES 是「一致的」而 VaR 不是。
从 VaR 的三宗罪说起#
先把 VaR 的问题摆出来。95% VaR 的定义很简单:损失分布的 95 分位数。也就是说,「有 95% 的把握,损失不超过这个数」。它直观、好算、监管认,但有三个结构性缺陷。
第一,它对尾部形状完全失明。 VaR 只看那一个分位点,超过这个点之后是缓缓下滑还是断崖式崩盘,它一个字都不说。两个策略可以有完全相同的 95% VaR,但一个的极端损失是 -5%,另一个是 -50%,VaR 看不出任何区别。
第二,它不满足次可加性。 把两个资产合成一个组合,直觉上分散化应该让风险下降或至少不上升:VaR(A+B) ≤ VaR(A) + VaR(B)。但 VaR 在非正态、尤其是有跳跃或离散损失的情况下会违反这条——合并后的 VaR 反而更大。这在数学上意味着 VaR 不是一个「一致风险度量」(coherent risk measure),用它做资本分配可能鼓励人为拆分组合来虚降风险。
第三,它不告诉你「破了以后有多惨」。 监管和风控真正怕的不是「有没有超过 VaR」,而是「超过之后的损失有多大」。VaR 恰恰对这个问题闭口不谈。
ES(Expected Shortfall,又叫 CVaR)修好了前两条:它是「超过 VaR 那部分损失的条件均值」,把整条尾部平均进来,并且满足次可加性、是一致风险度量。这也是巴塞尔协议 III 用 ES 取代 VaR 的原因。但 ES 仍然有一个隐含假设——它对尾部里的每一块损失一视同仁:损失是 -5% 还是 -50%,只要都在尾部,权重完全相同。这对一个极度厌恶巨灾的投资者来说,还是不够。
谱风险度量就是来解决这最后一层的。
什么是谱风险度量#
谱风险度量的定义可以写成一个加权积分。把损失按从最好到最坏排序,用分位数 p ∈ [0,1] 索引(p=0 是最好情形,p=1 是最坏情形),设 q(p) 是这个分位数上的损失,φ(p) 是一个权重函数,那么:
SRM = ∫₀¹ φ(p) · q(p) dpplaintext要让 SRM 成为一个「一致风险度量」,权重函数 φ(p) 必须满足两个条件:
- 非负且积分为 1:φ(p) ≥ 0,∫φ(p)dp = 1。它是一个概率密度,把总权重分配到各个分位数上。
- 单调不减:φ(p) 随 p 增大而不减。也就是越坏的情形(p 越大)权重越高——这正是「风险厌恶」的数学表达。
第二条是灵魂。它说:一个理性的、厌恶风险的人,应该对更糟糕的结果给更高的关注。只要权重函数满足「越坏越重视」,得到的风险度量就自动是一致的。
在这个框架下,VaR 和 ES 都是特例:
- VaR 对应 φ 是一个狄拉克脉冲,全部权重压在单个分位点 p=α 上。它显然不满足「单调不减」(除了那一点其他地方权重为 0),所以 VaR 不是一致风险度量——这从权重函数的角度一眼就能看出来。
- ES 5% 对应 φ 在尾部 [0, 0.05] 上均匀分布(值为 1/0.05=20),其余为 0。它满足非负、积分为 1,但「均匀」意味着尾部内部权重恒定——是「阶梯型」而非严格递增。ES 是一致的,但它是谱风险度量里最「粗糙」的那一档。
下面这张图把三者的权重函数画在一起,一眼看清区别:

VaR 是一根竖线(单点),ES 是一个矩形台阶(尾部均匀),而指数谱是一条从最坏损失处向内平滑衰减的曲线——越靠近最坏情形,权重越高。这条平滑曲线才是谱风险度量真正的用武之地。
指数谱:一个可调风险厌恶的实用选择#
理论上 φ 可以是任何满足条件的函数,但实践中最常用的是指数谱风险厌恶函数:
φ(p) = k · e^(-k·(1-p)) / (1 - e^(-k))plaintext这里 k > 0 是风险厌恶系数。k 越大,权重越集中在最坏的尾部;k → 0 时 φ 趋于均匀(退化成对整条分布求期望,也就是只看均值损失)。这个函数来自指数效用理论——一个具有常绝对风险厌恶(CARA)效用的投资者,其风险度量恰好是这个形式。换句话说,k 不是随便拍的参数,它有明确的经济含义:投资者的绝对风险厌恶程度。
用 Python 实现非常直接。核心思路是:把历史损失(或蒙特卡洛模拟的损失)从最坏到最好排序,给每个分位数按 φ 算权重,加权求和。
import numpy as np
def spectral_risk_measure(returns, k=25.0):
"""
指数谱风险度量。
returns: 收益序列(正=盈利,负=亏损)
k: 风险厌恶系数,越大越关注极端尾部
返回: 谱风险值(正数表示损失规模)
"""
losses = -np.asarray(returns) # 损失 = 负收益
losses_sorted = np.sort(losses)[::-1] # 从最坏损失到最好,降序
n = len(losses_sorted)
# 每个排序位置对应的分位数(用中点,避免 0/1 边界)
# p=1 对应最坏损失,所以权重应最大
u = (np.arange(1, n + 1) - 0.5) / n
phi = k * np.exp(-k * u) / (1.0 - np.exp(-k))
phi = phi / phi.sum() # 数值归一化,确保权重和为 1
return float(np.sum(losses_sorted * phi))
def value_at_risk(returns, alpha=0.95):
losses = -np.asarray(returns)
return float(np.quantile(losses, alpha))
def expected_shortfall(returns, alpha=0.95):
losses = -np.asarray(returns)
var = np.quantile(losses, alpha)
tail = losses[losses >= var]
return float(tail.mean()) if len(tail) else float(var)python注意 losses_sorted 是降序的(最坏在前),对应的 u 从接近 0 到接近 1,而指数权重 k·e^(-k·u) 在 u 小时最大——所以最坏损失(排在最前、u 最小)拿到最高权重。这与 φ(p) 定义里「p→1(最坏)权重最大」是同一件事,只是索引方向反过来,实现时对齐好即可。这类方向对齐是谱风险度量最容易写错的地方,务必用一个已知分布验证一遍。
三种度量在同一分布上的读数#
光有公式不够,要看它们在真实分布上给出什么数字。用一个自由度为 4 的 t 分布模拟日收益(尖峰厚尾,接近真实股票),比较三者:
np.random.seed(42)
returns = np.random.standard_t(4, 20000) * 0.012 + 0.0003
var95 = value_at_risk(returns, 0.95)
es95 = expected_shortfall(returns, 0.95)
srm = spectral_risk_measure(returns, k=25.0)
print(f"VaR95 = {var95*100:.2f}%")
print(f"ES95 = {es95*100:.2f}%")
print(f"SRM = {srm*100:.2f}%")
# VaR95 = 2.50%
# ES95 = 3.84%
# SRM = 3.65%python
左图是日收益分布,三条竖线分别标出 VaR95、ES95 和指数谱 SRM 的位置;右图把三个数字并排比较。可以看到一个清晰的递进:VaR95 = 2.50% 只是尾部入口的那一点;ES95 = 3.84% 把 5% 尾部整体平均进来,明显更大;而 SRM(k=25)= 3.65% 介于两者之间——它没有像 ES 那样只盯着最尾的 5% 均匀平均,而是把整条分布都纳入,但给尾部指数级的高权重。
这里有个容易误解的点:SRM 不一定比 ES95 大。它们衡量的是不同的东西。ES95 是「最坏 5% 的条件均值」,只看尾部;SRM 是「全分布的风险厌恶加权」,包含中间那些小损失甚至盈利(权重很低但非零)。谁大谁小取决于 k 和 α 的具体取值。真正的重点不是绝对大小,而是 SRM 允许你用一个连续参数 k 去调节「你到底有多怕极端情形」,而不是像 ES 那样被 α 一刀切死。
风险厌恶系数 k 的作用#
k 是谱风险度量的方向盘。下面这张图扫描了 k 从 1 到 80 时 SRM 的变化:

k 很小时(接近 0),权重几乎均匀,SRM 趋近于「平均损失」——那条灰色虚线,也就是最不厌恶风险的读数。随着 k 增大,权重不断向最坏尾部集中,SRM 单调爬升,逐渐逼近甚至超过 ES95。这条曲线的形状本身就是一份风险偏好菜单:一个养老金账户可能选很大的 k(极度厌恶巨灾),一个对冲基金的自营台可能选较小的 k(能承受尾部波动换取更高杠杆)。
关键洞察是:风险度量的选择本质上是一个偏好陈述,而不是一个客观事实。 VaR 假装尾部形状不重要,ES 假装尾部内部人人平等,谱风险度量把这个假装撕掉了——它逼你显式地写下「我有多怕最坏情形」,然后诚实地把这个偏好算进最终那个数字里。这也是它相比 VaR/ES 最大的价值:它把一个被藏在方法论里的主观选择,变成一个可以讨论、可以校准、可以对不同投资者不同设置的显式参数。
落地时的几个实操要点#
用蒙特卡洛或历史模拟喂损失分布。 谱风险度量对分布的尾部形状高度敏感,因此喂进去的损失分布质量决定一切。如果你用历史模拟,样本量要足够大(几千到上万条),否则最尾部几个点的权重畸高,SRM 会剧烈抖动。更稳的做法是先拟合一个厚尾分布(如前面文章讲过的 NIG、Johnson SU),再从中大量抽样。
k 要和你的效用/资本约束对齐。 不要拍脑袋填 k。一个可操作的校准方法:找到一个你「绝对不能接受」的损失水平(比如触发平仓的回撤线),调 k 使得 SRM 恰好落在那附近,让风险度量的读数与你的实际风控阈值对齐。
跨组合比较时 k 必须一致。 谱风险度量的一致性(次可加性)只在同一个 φ 下成立。比较两个策略或做资本分配时,必须用相同的 k,否则数字没有可比性。
小结#
谱风险度量的价值不在于它给出一个「更准」的数字——风险本来就没有唯一正确答案——而在于它提供了一个统一、诚实的框架:所有一致风险度量都是某个「越坏越重视」权重函数下的加权平均,VaR 和 ES 只是这个谱系的两个端点或特例。当你选择用 VaR,你其实是在说「我只关心一个分位点」;选择 ES,你在说「我关心尾部但内部平等」;选择指数谱并设定 k,你在诚实地写下「我对极端损失的厌恶程度是这么多」。把主观偏好从方法论的暗处拽到参数的明处,这本身就是风险管理的一大进步。
诚实边界:谱风险度量继承了所有基于分布的风险度量的通病——它只和你喂进去的损失分布一样可靠,样本外的黑天鹅它一样抓不住;最尾部的权重最高,而最尾部恰恰是样本最稀、估计误差最大的地方,因此 SRM 在小样本下方差很大,务必配合厚尾分布拟合与大样本蒙卡;k 的选择虽然有理论依据,但校准到具体数值仍带主观性,不同 k 会给出不同结论,报数字时必须同时报 k。(中阶)