halo 的技术博客

返回

先说结论: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 是尾部的门槛,ES 是越过门槛后的条件均值

但换标准的同时留下一个尴尬:VaR 有一套成熟的回测工具——Kupiec POF 数突破次数、Christoffersen 检验查突破扎堆、巴塞尔交通灯直接定资本乘数——而 ES 呢?

Gneiting(2011)证明了 ES 不满足 elicitability:不存在评分函数 S(预测,实现值)S(\text{预测}, \text{实现值}),使得最小化期望得分的预测恰好是真实 ES。VaR(分位数)有这样的评分函数(pinball loss),均值也有(平方损失),ES 没有。这一度被解读为”ES 无法回测”,甚至成为反对 FRTB 换标准的论据。

Acerbi 和 Szekely 在 2014 年的《Back-testing expected shortfall》里指出这是个误解:elicitability 关乎的是预测排名——比较两个模型谁更好;而回测关乎的是绝对校验——单个模型与数据是否相容。后者根本不需要 elicitability。你不需要一个评分函数来发现”模型说超出 VaR 后平均亏 3%,实际平均亏了 5%“。

Z2 统计量:一个数字管住频率和幅度#

设第 tt 天的损失为 LtL_t,模型给出的 VaR 和 ES 分别为 VaRp,tVaR_{p,t}ESp,tES_{p,t}(尾部概率 pp,FRTB 下 p=2.5%p=2.5\%),突破指示 It=1{Lt>VaRp,t}I_t = \mathbf{1}\{L_t > VaR_{p,t}\}

Acerbi-Szekely 的第二个统计量(最常用的那个)是:

Z2=1Tpt=1TLtItESp,t1Z_2 = \frac{1}{Tp}\sum_{t=1}^{T} \frac{L_t \, I_t}{ES_{p,t}} - 1

直觉拆解:分子累加的是”每次突破的损失除以模型当天声称的 ES”。如果模型正确,E[LtIt]=pESp,tE[L_t I_t] = p \cdot ES_{p,t}(尾部概率乘以尾部条件均值),于是求和的期望恰好是 TpTpZ2Z_2 的期望为 0。

  • ES 被低估(实际尾部比模型想的肥):突破更频繁、或者突破时损失相对 ESES 更大,Z2>0Z_2 > 0
  • ES 被高估(模型过度保守):Z2<0Z_2 < 0

它的精妙之处在于不需要先检验 VaR 再检验 ES——频率(ItI_t 出现的次数)和幅度(Lt/ESp,tL_t / ES_{p,t} 的大小)通过乘积同时进入统计量。与之配套的 Z1Z_1 统计量则只看幅度:

Z1=tLtIt/ESp,ttIt1Z_1 = \frac{\sum_t L_t I_t / ES_{p,t}}{\sum_t I_t} - 1

Z1Z_1 回答”给定突破发生,幅度是否超出模型预期”,把频率问题留给传统 VaR 检验。实务上 Z2Z_2 是主力,Z1Z_1 是归因工具。

p 值:没有解析分布,用模型自己模拟#

Z2Z_2 在原假设下的分布依赖模型的整条预测分布序列,没有 χ2\chi^2 那样的解析形式。Acerbi-Szekely 的处理是纯蒙特卡洛:从模型自己声称的预测分布里模拟几千条同长度的损失路径,每条算一个 Z2Z_2,看观测值在这堆”模型自认为会发生的 Z2Z_2“里排第几

注意单侧检验的方向:监管和风控只关心 ES 被低估Z2Z_2 偏大)。模型过度保守浪费资本,但那是 CFO 的问题,不是风控检验要拒绝的方向。

实验:1000 天,三个 ES 模型#

数据生成过程用 GARCH(1,1) + t(6) 创新——有波动聚集、有肥尾,是日频收益的合理近似。三个待检模型在 97.5% 层级上报 ES:

  1. GARCH-t(6):动态波动 + 正确尾部(真实模型);
  2. GARCH-正态:动态波动,但用正态尾部算 ES;
  3. 静态正态:无条件波动 + 正态尾部。

结果(1000 天,理论期望突破 25 次):

模型突破次数Z1(幅度)Z2蒙特卡洛 p 值
GARCH-t(6)(正确)24-0.016-0.0560.586
GARCH-正态24+0.119+0.0740.342
静态正态15+0.459-0.1250.721

Z2 统计量与蒙特卡洛 p 值对比

这组数字比”坏模型全被拒绝”的教科书结局有信息量得多,值得逐行读:

正确模型一切正常:突破 24 次贴着期望 25,Z1Z_1Z2Z_2 都贴着 0,p 值 0.59。检验的 size 没有问题。

GARCH-正态暴露在 Z1Z_1:突破次数和正确模型一样是 24 次——纯看频率的 VaR 检验对它无能为力。但 Z1=0.119Z_1 = 0.119 意味着每次突破的实际损失平均比模型声称的 ES 高 12%:正态尾部在 97.5% 门槛的位置差得不多,但对门槛之外的深尾一贯低估。这正是 ES 回测存在的理由——它看的是 VaR 检验看不到的”破了之后多惨”。不过在 T=1000T=1000 下这 12% 的幅度偏差还没积累到统计显著(p=0.34),这是小样本功效问题,下一节量化它。

静态正态是 Z2Z_2 的教学级盲区Z1=0.459Z_1 = 0.459——突破时实际损失比声称的 ES 高 46%,幅度错得离谱。但它只突破了 15 次(静态波动在平静期给的 VaR 过高,频率端过度保守),频率端的”多余保守”和幅度端的”严重低估”在 Z2Z_2 的乘积结构里相互抵消Z2=0.125Z_2 = -0.125 甚至是负的,p 值 0.72 安然通过。

GARCH-正态模型的 Z2 蒙特卡洛零分布

这个抵消不是实现 bug,是 Z2Z_2 的定义使然:它检验的是 E[LtIt/ESt]E[L_t I_t / ES_t] 这个乘积的总量,频率和幅度只要乘起来对就行。所以实务准则是:Z2Z_2 不能单独使用,必须搭配突破频率检验(Kupiec)和 Z1Z_1 一起看。三个数字各管一段:频率对不对、幅度对不对、总量对不对。静态正态在 Kupiec 双侧检验下会因突破过少(15 < 期望 25)暴露,Z1=0.46Z_1 = 0.46 更是直接指认幅度问题。

功效:比 VaR 次数检验灵敏一个档次#

ES 检验的核心卖点是功效。VaR 突破次数检验的功效臭名昭著——Kupiec POF 那篇里量化过,风险低估 50% 时 1000 天只有 25% 的概率识破。Z2Z_2 呢?

实验:真实过程还是 GARCH-t(6),模型用正确的分布形状但波动被系统性低估 x%σ^=σ/k\hat\sigma = \sigma / k),每个低估幅度跑 300 次独立试验,统计 5% 显著性下的拒绝率:

波动低估幅度Z2 功效
0%(模型正确)5.0%(= 名义水平,size 正确)
10%53.3%
20%96.0%
30%99.7%
40%100%

Z2 检验功效曲线

对比一下量级:波动低估 20% 大致对应突破率从 2.5% 升到 4% 出头,Kupiec 检验在这个偏离水平上功效大约只有一半;Z2Z_2 已经 96%。原因很直白——幅度信息是连续的。次数检验把每天压缩成一个 0/1,突破 30 次和 31 次只差一个比特;Z2Z_2 里每次突破都带着”超出多少”的连续信息,低估波动的模型不仅突破更频繁,每次突破的 Lt/EStL_t/ES_t 都系统性偏大,两股证据同向叠加。

这也是 FRTB 虽然资本用 ES 计量、回测却仍做在 VaR 上的一个反讽:监管选择了保守务实的路线(VaR 回测的法律确定性高),但学术工具箱里其实已经有了更锋利的刀。

工程实现清单#

把它搬进生产环境的几个要点:

  1. 每天存三样东西:实际损失 LtL_t、模型的 VaRp,tVaR_{p,t}、模型的 ESp,tES_{p,t}。ES 回测比 VaR 回测多的存储成本只有一列数字,没有理由不存。
  2. 蒙特卡洛零分布需要完整预测分布:模拟 Z2Z_2 的零分布时要从模型的预测分布抽样,这意味着回测系统得能”重放”模型当天的分布假设(分布族 + 当天参数),只存 VaR/ES 两个数不够。设计数据 schema 时把分布参数一并落库。
  3. 三件套一起报:Kupiec 突破次数(双侧)+ Z1Z_1 幅度 + Z2Z_2 总量。任何一个亮红灯都值得查,”Z2Z_2 通过”单独不构成结论——上面的静态正态就是反例。
  4. 数值细节Z1Z_1 在零突破时未定义(分母为 0),代码里要单独分支;p=2.5%p=2.5\% 下 250 天期望突破仅 6.25 次,Z1Z_1 的估计方差很大,年度回测建议用 500 天以上窗口或在 5% 层级平行跑一套。
  5. 方向锁定单侧:拒绝域在 Z2Z_2 右尾。如果你同时想抓”过度保守浪费资本”,另开一个双侧口径,别混在合规检验里。

诚实边界#

  • 频率-幅度抵消Z2Z_2 的结构性盲区,本文实验里静态正态模型演示了完整的抵消路径。解法不是改统计量,是组合使用多个检验。
  • 蒙特卡洛 p 值依赖模型自己的分布假设:零分布是”假设模型对,会看到什么”。如果模型的分布族本身选错(比如真实世界是跳跃扩散而模型是连续路径),p 值的含义会变形——它检验的是参数校准,不是模型选择。
  • 小样本下幅度检验噪声大:97.5% 层级 250 天只有约 6 次突破,Z1Z_1 基本是在用 6 个样本估均值。ES 回测天然比 VaR 回测更饿数据,这是尾部越深信息越稀的物理规律,换统计量绕不开。
  • 仍然不解决 elicitabilityZ2Z_2 能回答”这个模型与数据相容吗”,不能回答”A 模型和 B 模型谁的 ES 预测更好”。模型比较要用 Fissler-Ziegel 联合评分函数(VaR-ES 联合 elicitable),那是另一篇的主题。

ES 检验的故事有个值得记住的元教训:“理论上不可回测”和”实务上无法校验”是两回事。elicitability 的缺失堵死的是评分排名这一条路,不是所有路。当一个理论结论被引用来论证”某事做不了”时,先看清它到底排除了什么。

Acerbi-Szekely ES 检验:给预期短缺一个可执行的回测
https://blog.halo26812.eu.org/blog/acerbi-szekely-es-test
Author halo
Published at 2026年7月27日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨