超阈值 POT 建模:用广义帕累托分布拟合尾部超额
区组极大值法每个月块只留一个数,剩下 20 个观测全扔——POT(Peaks Over Threshold)是数据效率更高的另一条 EVT 路线:定一个高阈值,把所有超过它的观测都拿来建模。Pickands-Balkema-de Haan 定理保证:阈值足够高时,超额分布收敛到广义帕累托分布(GPD),形状参数 ξ 与 GEV 完全同一个。GARCH-t(5) 模拟 40 年日损失、95% 分位做阈值(504 个超额)实测:GPD 估出 ξ=0.14,KS p=0.93;同样数据 GEV 区组法只有 480 个块。外推对比:99.9% VaR 正态公式报 2.89%、POT 报 4.54%(经验值 4.58%),99.99% 层级正态 3.48% vs POT 7.36%——差一倍以上。附平均超额图选阈值、阈值敏感性走廊(ξ 从 0.09 漂到 0.18 但 VaR 外推稳定在 4.4-4.6%)、ES 闭式解、以及波动聚集破坏 iid 时超额扎堆的 declustering 讨论(中阶)。
上一篇讲了极值理论的区组极大值路线:把 40 年日损失切成 480 个月块,每块取最大值,拟合 GEV。方法有定理背书,但有个让人心疼的浪费——每个月约 21 个观测,只留 1 个进模型,其余 20 个全扔。如果某个月出现了当年第二大和第三大的损失,它们对尾部估计的信息量明明很大,区组法却看都不看。
结论先放这:POT(Peaks Over Threshold,超阈值法)是极值理论的另一条主干路线,数据效率显著更高——定一个高阈值 u,把所有超过 u 的观测的超额部分拿来建模。Pickands-Balkema-de Haan 定理保证:阈值足够高时,超额分布收敛到广义帕累托分布(GPD),且形状参数 ξ 和 GEV 的 ξ 是同一个数。GARCH-t(5) 模拟 40 年日损失、95% 分位做阈值实测:504 个超额观测拟合 GPD 得 ξ=0.14,KS 检验 p=0.93 不可拒绝;外推 99.9% VaR 报 4.54%(样本内经验值 4.58%,正态公式只报 2.89%),99.99% 层级 POT 报 7.36% 而正态报 3.48%——正态假设在深尾把风险砍掉一半以上。
第二个极值定理#
区组极大值背后是 Fisher-Tippett-Gnedenko 定理。POT 背后是 Pickands-Balkema-de Haan 定理(1974/1975),陈述同样干净:设 的分布在 GEV 吸引域内,定义阈值 之上的超额分布
那么当 趋近分布右端点时, 收敛到广义帕累托分布(GPD):
两个参数:尺度 β 和形状 ξ。ξ 的语义与 GEV 完全一致:
- ξ > 0:幂律尾(Pareto 型)。t(ν) 分布对应 ξ = 1/ν,尾部按 衰减,是金融日收益的常态。
- ξ = 0:指数尾。GPD 退化成指数分布——这是薄尾世界。
- ξ < 0:有限右端点,损失有硬上限(金融里基本不出现)。
两个定理是一体两面:同一个分布,块最大值收敛到 GEV(ξ),超阈值超额收敛到 GPD(ξ),同一个 ξ。区别只在你怎么切数据——按时间切块取最大,还是按数值定阈取超额。
实验:GARCH-t(5) 的尾巴#
数据生成与上一篇完全相同:GARCH(1,1)-t(5) 模拟 40 年(10080 个交易日)日损失,真实尾部指数 ξ = 1/5 = 0.2,日损失峰度 8.6——标准的肥尾+波动聚集组合。
import numpy as np
from scipy import stats
# GARCH(1,1)-t(5) 模拟日损失(略,见上篇),loss 为百分比损失
u = np.quantile(loss, 0.95) # 阈值取 95% 分位
exc = loss[loss > u] - u # 超额序列
n_exc, n = len(exc), len(loss) # 504 / 10080
# GPD 拟合(位置固定为 0,这是超额分布的定义所要求的)
xi, _, beta = stats.genpareto.fit(exc, floc=0)
# xi = 0.141, beta = 0.599
# 尾部分位数外推:P(X > u) = zeta,则
# VaR_p = u + beta/xi * [((1-p)/zeta)^(-xi) - 1]
zeta = n_exc / n
def pot_var(p):
return u + beta / xi * (((1 - p) / zeta) ** (-xi) - 1)
# ES 有闭式解(xi < 1 时)
def pot_es(p):
return (pot_var(p) + beta - xi * u) / (1 - xi)python两个实现细节值得强调。第一,floc=0 不是偷懒——超额分布的定义就是从 0 开始的,让位置参数自由浮动是常见错误,会把 ξ 估歪。第二,外推公式里的 用经验频率 n_exc/n 估计,它是把「条件超额分布」翻译回「无条件尾部分位数」的桥梁。

拟合结果:ξ = 0.14,bootstrap 90% 区间 [0.06, 0.22],盖住理论值 0.2;KS 检验 p = 0.93 不可拒绝。作为对照,强行用指数分布(ξ=0)拟合同一批超额,KS p = 0.08——在 504 个观测下勉强没被处决,但对数纵轴的密度图上能看到指数尾在深处系统性低估(下图左)。这是个值得诚实标注的现象:ξ=0.14 离 0 不算远,有限样本下 GPD 和指数的区分需要足够深的尾部观测,这也是为什么外推层级越深、模型选择错误的代价越大。

阈值怎么选:平均超额图#
POT 的自由裁量点从「块多长」换成了「阈值多高」,权衡结构一模一样:
- 阈值太低:超额分布还没收敛到 GPD,近似偏差污染估计;
- 阈值太高:超额观测太少,方差爆炸。
经典诊断工具是平均超额函数(mean excess function):。GPD 有个漂亮性质——如果超额真的服从 GPD(ξ, β),那么 是 u 的线性函数,斜率 。所以实操是:画出经验平均超额对候选阈值的曲线,从图上找它开始变直的位置,从那里往上都是 GPD 领地。

本实验中曲线在 90% 分位之后斜率转正且大体线性(正斜率 = 肥尾),95% 分位是个稳妥的选择——留下 504 个超额,均衡了偏差与方差。
更系统的做法是阈值敏感性扫描:把阈值从 85% 分位滑到 99% 分位,看 ξ 和外推 VaR 是否稳定:
| 阈值分位 | 超额数 | ξ 估计 | 99.9% VaR 外推 |
|---|---|---|---|
| 0.85 | 1512 | 0.10 | 4.45% |
| 0.90 | 1008 | 0.11 | 4.46% |
| 0.95 | 504 | 0.14 | 4.54% |
| 0.98 | 202 | 0.18 | 4.55% |
| 0.99 | 101 | 0.09 | 4.57% |
这张表有两个教科书不太爱讲的诚实信息。第一,ξ 随阈值升高从 0.10 爬向 0.18 再在 99% 分位跳回 0.09——前半段是近似偏差逐渐消退(低阈值混入了非尾部观测,把 ξ 往下拽),最后一跳是 101 个观测的纯方差噪声。第二,也是更重要的:尽管 ξ 在 0.09-0.18 之间漂移,99.9% VaR 的外推始终稳在 4.4-4.6% 的窄带里。因为 ξ 和 β 的估计误差在外推公式里部分对冲——这正是实务上该看的稳定性:别只盯参数,盯你真正要用的那个输出量。

外推对决:正态 vs 经验 vs POT#
风控真正的考题是深尾分位数。三个方法同台:
| 层级 | 正态公式 | 样本经验分位 | POT 外推 | POT ES |
|---|---|---|---|---|
| 99% | 2.17% | 2.45% | 2.50% | 3.37% |
| 99.5% | 2.41% | 3.02% | 3.04% | 4.01% |
| 99.9% | 2.89% | 4.58% | 4.54% | 5.75% |
| 99.99% | 3.48% | 6.24% | 7.36% | 9.03% |
三个读法。第一,正态公式全程系统性低估,且越深越离谱:99.9% 层级只报 2.89%,是经验值的 63%;99.99% 层级报 3.48%,不到 POT 的一半。这不是正态「误差大」,是它的指数平方尾在结构上就装不下幂律尾。第二,POT 在 99.9% 层级和经验分位几乎重合(4.54% vs 4.58%)——这是模型正确性的交叉验证:10080 个样本在 99.9% 深度还有约 10 个观测点,经验分位数还能站住,两者互相印证。第三,99.99% 层级经验分位(6.24%)开始低于 POT(7.36%)——40 年样本在这个深度只有 1 个观测,经验分位数本质上就是样本最大值附近,它只能低估没见过的极端;POT 的参数化外推正是为这个深度存在的。99.9% VaR 的 bootstrap 90% 区间是 [4.14%, 4.91%],宽度约 ±9%——把不确定性一起报出去,比给一个假装精确的点估计诚实。
另一个 POT 独有的红利:ES(预期短缺)有闭式解 (要求 ξ<1)。ES 的回测难,但在 POT 框架下 ES 的计算是免费的,且 VaR 与 ES 的比值 直接由尾部形状决定——ξ=0.14 时 ES 约为 VaR 的 1.16 倍再加常数项,肥尾越重这个倍数越大。
POT vs 区组极大值:怎么选#
同一份 40 年数据:区组法得到 480 个块最大值,POT 在 95% 阈值下得到 504 个超额——数量看起来接近,但信息质量不同。区组法的 480 个点里,平静年份的「块最大值」其实是尾部无关的普通观测(那个月根本没出大事),被迫进了模型;POT 的 504 个点全部真正来自尾部。反过来,区组法天然对波动聚集更钝感(一个月内的扎堆突破只贡献一个块最大值),POT 则会把聚集的超额全部收进来,破坏超额之间的独立性假设。
实务准则:
- 数据紧、只关心尾部 → POT,数据效率高,ES 有闭式解;
- 数据充裕、担心序列依赖 → 区组法更稳健,或 POT + declustering(聚簇消除:一个波动簇里只保留峰值超额);
- 最干净的路线:先 GARCH 滤波把波动聚集吸掉,对标准化残差做 POT——滤波管动态,GPD 管尾形,各司其职。
诚实的边界#
超额不独立是本实验的已知瑕疵。 GARCH 数据的超阈值观测在时间上扎堆(高波动周里连环突破),而 GPD 的似然写法假设超额 iid。后果不是 ξ 有偏,而是有效样本量虚高、置信区间过窄——504 个超额的「等效独立样本」可能只有三四百个(extremal index < 1)。严格做法是 declustering 或先滤波,本文直接拟合是为了和上篇 GEV 保持同一份原始数据可比。
外推是条件陈述。 POT 说的是「如果尾部机制不变,99.99% 分位在 7.4% 附近」。它管不了结构断裂——2008 之前的数据外推不出流动性螺旋,管制市场的历史外推不出制度变化。EVT 是把已有尾部信息用到极致的工具,不是预言机。
ξ 接近 0 时模型选择敏感。 本实验 ξ=0.14,bootstrap 区间下沿到 0.06——离指数尾不远。如果真实 ξ 更小,GPD 和指数的深尾外推差距会以指数速度放大对样本的要求。层级越深,越应该同时报多个模型的外推加区间,而不是单点。
阈值选择仍是研究者自由度。 平均超额图的「变直位置」有目测成分,敏感性扫描能兜底但不能消除。预注册阈值规则(比如固定 95% 分位)比事后挑一个好看的阈值诚实。
POT 和区组极大值构成了 EVT 的两条主干;配合 VaR 回测系列的检验工具,尾部风险的「估计-外推-验证」闭环就完整了:POT 负责把深尾量级估对,回测负责监督它每天有没有说谎。