先说结论:ES(预期短缺)曾被认为”不可回测”,因为它不满足 elicitability——不存在一个评分函数让真实 ES 成为唯一最优预测。Acerbi 和 Szekely(2014)绕开了这个理论障碍:不去比较预测的优劣,而是直接检验”模型声称的 ES 与实际观测是否相容”。他们的 Z2 统计量把突破频率和突破幅度揉进同一个数字,在模型正确时期望为 0,ES 被低估时显著为正。我在 GARCH-t(6) 模拟的 1000 天数据上实测:波动被低估 10% 时 Z2 检验的功效已达 53%,低估 20% 时达 96%——比出了名疲软的 VaR 突破次数检验灵敏得多。但它也有一个结构性盲区:频率误差和幅度误差方向相反时会互相抵消。
为什么 ES 的回测是个问题#
巴塞尔委员会在 FRTB 里把市场风险资本的计量标准从 99% VaR 换成了 97.5% ES。理由充分:VaR 只报告尾部的门槛,对门槛之外发生什么完全沉默;ES 是越过门槛后损失的条件期望,直接回答”破了之后平均多惨”。

但换标准的同时留下一个尴尬:VaR 有一套成熟的回测工具——Kupiec POF 数突破次数、Christoffersen 检验查突破扎堆、巴塞尔交通灯直接定资本乘数——而 ES 呢?
Gneiting(2011)证明了 ES 不满足 elicitability:不存在评分函数 ,使得最小化期望得分的预测恰好是真实 ES。VaR(分位数)有这样的评分函数(pinball loss),均值也有(平方损失),ES 没有。这一度被解读为”ES 无法回测”,甚至成为反对 FRTB 换标准的论据。
Acerbi 和 Szekely 在 2014 年的《Back-testing expected shortfall》里指出这是个误解:elicitability 关乎的是预测排名——比较两个模型谁更好;而回测关乎的是绝对校验——单个模型与数据是否相容。后者根本不需要 elicitability。你不需要一个评分函数来发现”模型说超出 VaR 后平均亏 3%,实际平均亏了 5%“。
Z2 统计量:一个数字管住频率和幅度#
设第 天的损失为 ,模型给出的 VaR 和 ES 分别为 和 (尾部概率 ,FRTB 下 ),突破指示 。
Acerbi-Szekely 的第二个统计量(最常用的那个)是:
直觉拆解:分子累加的是”每次突破的损失除以模型当天声称的 ES”。如果模型正确,(尾部概率乘以尾部条件均值),于是求和的期望恰好是 , 的期望为 0。
- ES 被低估(实际尾部比模型想的肥):突破更频繁、或者突破时损失相对 更大,;
- ES 被高估(模型过度保守):。
它的精妙之处在于不需要先检验 VaR 再检验 ES——频率( 出现的次数)和幅度( 的大小)通过乘积同时进入统计量。与之配套的 统计量则只看幅度:
回答”给定突破发生,幅度是否超出模型预期”,把频率问题留给传统 VaR 检验。实务上 是主力, 是归因工具。
p 值:没有解析分布,用模型自己模拟#
在原假设下的分布依赖模型的整条预测分布序列,没有 那样的解析形式。Acerbi-Szekely 的处理是纯蒙特卡洛:从模型自己声称的预测分布里模拟几千条同长度的损失路径,每条算一个 ,看观测值在这堆”模型自认为会发生的 “里排第几。
import numpy as np
from scipy import stats
def z2_stat(loss, var, es, p):
"""Acerbi-Szekely Z2:模型正确时期望为 0"""
I = (loss > var).astype(float)
return np.sum(loss * I / es) / (len(loss) * p) - 1.0
def mc_pvalue(sig_model, p, nu, loss_obs, var, es, n_sim=5000, rng=None):
"""从模型的预测分布模拟 Z2 的零分布,返回单侧 p 值"""
T = len(sig_model)
z2_obs = z2_stat(loss_obs, var, es, p)
scale = np.sqrt((nu - 2) / nu)
z2_null = np.empty(n_sim)
for i in range(n_sim):
sim_loss = -(sig_model * scale * rng.standard_t(nu, T))
z2_null[i] = z2_stat(sim_loss, var, es, p)
return np.mean(z2_null >= z2_obs) # 大 Z2 = ES 被低估python注意单侧检验的方向:监管和风控只关心 ES 被低估( 偏大)。模型过度保守浪费资本,但那是 CFO 的问题,不是风控检验要拒绝的方向。
实验:1000 天,三个 ES 模型#
数据生成过程用 GARCH(1,1) + t(6) 创新——有波动聚集、有肥尾,是日频收益的合理近似。三个待检模型在 97.5% 层级上报 ES:
- GARCH-t(6):动态波动 + 正确尾部(真实模型);
- GARCH-正态:动态波动,但用正态尾部算 ES;
- 静态正态:无条件波动 + 正态尾部。
结果(1000 天,理论期望突破 25 次):
| 模型 | 突破次数 | Z1(幅度) | Z2 | 蒙特卡洛 p 值 |
|---|---|---|---|---|
| GARCH-t(6)(正确) | 24 | -0.016 | -0.056 | 0.586 |
| GARCH-正态 | 24 | +0.119 | +0.074 | 0.342 |
| 静态正态 | 15 | +0.459 | -0.125 | 0.721 |

这组数字比”坏模型全被拒绝”的教科书结局有信息量得多,值得逐行读:
正确模型一切正常:突破 24 次贴着期望 25,、 都贴着 0,p 值 0.59。检验的 size 没有问题。
GARCH-正态暴露在 上:突破次数和正确模型一样是 24 次——纯看频率的 VaR 检验对它无能为力。但 意味着每次突破的实际损失平均比模型声称的 ES 高 12%:正态尾部在 97.5% 门槛的位置差得不多,但对门槛之外的深尾一贯低估。这正是 ES 回测存在的理由——它看的是 VaR 检验看不到的”破了之后多惨”。不过在 下这 12% 的幅度偏差还没积累到统计显著(p=0.34),这是小样本功效问题,下一节量化它。
静态正态是 的教学级盲区:——突破时实际损失比声称的 ES 高 46%,幅度错得离谱。但它只突破了 15 次(静态波动在平静期给的 VaR 过高,频率端过度保守),频率端的”多余保守”和幅度端的”严重低估”在 的乘积结构里相互抵消, 甚至是负的,p 值 0.72 安然通过。

这个抵消不是实现 bug,是 的定义使然:它检验的是 这个乘积的总量,频率和幅度只要乘起来对就行。所以实务准则是: 不能单独使用,必须搭配突破频率检验(Kupiec)和 一起看。三个数字各管一段:频率对不对、幅度对不对、总量对不对。静态正态在 Kupiec 双侧检验下会因突破过少(15 < 期望 25)暴露, 更是直接指认幅度问题。
功效:比 VaR 次数检验灵敏一个档次#
ES 检验的核心卖点是功效。VaR 突破次数检验的功效臭名昭著——Kupiec POF 那篇里量化过,风险低估 50% 时 1000 天只有 25% 的概率识破。 呢?
实验:真实过程还是 GARCH-t(6),模型用正确的分布形状但波动被系统性低估 x%(),每个低估幅度跑 300 次独立试验,统计 5% 显著性下的拒绝率:
| 波动低估幅度 | Z2 功效 |
|---|---|
| 0%(模型正确) | 5.0%(= 名义水平,size 正确) |
| 10% | 53.3% |
| 20% | 96.0% |
| 30% | 99.7% |
| 40% | 100% |

对比一下量级:波动低估 20% 大致对应突破率从 2.5% 升到 4% 出头,Kupiec 检验在这个偏离水平上功效大约只有一半; 已经 96%。原因很直白——幅度信息是连续的。次数检验把每天压缩成一个 0/1,突破 30 次和 31 次只差一个比特; 里每次突破都带着”超出多少”的连续信息,低估波动的模型不仅突破更频繁,每次突破的 都系统性偏大,两股证据同向叠加。
这也是 FRTB 虽然资本用 ES 计量、回测却仍做在 VaR 上的一个反讽:监管选择了保守务实的路线(VaR 回测的法律确定性高),但学术工具箱里其实已经有了更锋利的刀。
工程实现清单#
把它搬进生产环境的几个要点:
- 每天存三样东西:实际损失 、模型的 、模型的 。ES 回测比 VaR 回测多的存储成本只有一列数字,没有理由不存。
- 蒙特卡洛零分布需要完整预测分布:模拟 的零分布时要从模型的预测分布抽样,这意味着回测系统得能”重放”模型当天的分布假设(分布族 + 当天参数),只存 VaR/ES 两个数不够。设计数据 schema 时把分布参数一并落库。
- 三件套一起报:Kupiec 突破次数(双侧)+ 幅度 + 总量。任何一个亮红灯都值得查,” 通过”单独不构成结论——上面的静态正态就是反例。
- 数值细节: 在零突破时未定义(分母为 0),代码里要单独分支; 下 250 天期望突破仅 6.25 次, 的估计方差很大,年度回测建议用 500 天以上窗口或在 5% 层级平行跑一套。
- 方向锁定单侧:拒绝域在 右尾。如果你同时想抓”过度保守浪费资本”,另开一个双侧口径,别混在合规检验里。
诚实边界#
- 频率-幅度抵消是 的结构性盲区,本文实验里静态正态模型演示了完整的抵消路径。解法不是改统计量,是组合使用多个检验。
- 蒙特卡洛 p 值依赖模型自己的分布假设:零分布是”假设模型对,会看到什么”。如果模型的分布族本身选错(比如真实世界是跳跃扩散而模型是连续路径),p 值的含义会变形——它检验的是参数校准,不是模型选择。
- 小样本下幅度检验噪声大:97.5% 层级 250 天只有约 6 次突破, 基本是在用 6 个样本估均值。ES 回测天然比 VaR 回测更饿数据,这是尾部越深信息越稀的物理规律,换统计量绕不开。
- 仍然不解决 elicitability: 能回答”这个模型与数据相容吗”,不能回答”A 模型和 B 模型谁的 ES 预测更好”。模型比较要用 Fissler-Ziegel 联合评分函数(VaR-ES 联合 elicitable),那是另一篇的主题。
ES 检验的故事有个值得记住的元教训:“理论上不可回测”和”实务上无法校验”是两回事。elicitability 的缺失堵死的是评分排名这一条路,不是所有路。当一个理论结论被引用来论证”某事做不了”时,先看清它到底排除了什么。