EVT 处理尾部风险:把 GPD 拟合到金融损失
金融 EVT 的实务:Hill 和 Moments 方法估计尾指数、GPD 的 MLE 拟合、return level 的置信区间,以及诊断图。
理论告诉我们重尾分布的尾是 GPD。实务就乱多了。我们面对的是有限数据、regime 切换、非平稳的波动率过程,以及无处不在的过拟合冲动。这篇文章走一遍把 GPD 拟合到金融损失的实务流程:估计尾指数 、选阈值、最大似然拟合,最后给出带诚实置信区间的 return level。
这里讲的技术对任何重尾金融序列都适用:股票收益、违约损失、信用利差、操作损失。重尾这个前提条件很关键, 如果你的数据是瘦尾,GPD 拟合会给出误导性的结果,你应该用基于正态的方法。
第一步:尾部是重尾吗?
拟合 GPD 之前,要先确认尾部是重的。三个诊断图可以在不假设分布的前提下做这件事。
对数直方图。 把损失的直方图画在双对数坐标上(对数频率 vs. 对数值)。正态尾的话,直方图在右端的下降速度比任何线性趋势都快。幂律尾 的话,互补 log-log 图 关于 应该是斜率为 的直线。
Mean excess plot。 画 关于 的曲线。对 的 GPD,理论均值超出函数是 ,关于 是线性的。所以均值超出图里一段大致线性的区间,就是 GPD 形态尾部的标志(且 ,这在金融里很常见, 通常落在 )。
QQ plot。 把超出量 (对应 )排序,画 关于 的曲线,其中 是拟合的 GPD。偏离对角线就说明尾部行为不对。如果最大那几个点在对角线之上,你的形状就错了, 换一个更肥的 。
如果三个诊断都指向幂尾,再进入尾指数估计。
第二步:估计尾指数
尾指数 是拟合里最重要的数字。三个广泛使用的估计量。
Hill 估计量 (1975)。 把损失从大到小排序:。对某个上序统计量索引 ,Hill 估计量为
等价地,。渐近正态给出的标准误是
Hill 对 是一致的,也好算。它的主要缺点是对 敏感:太小方差大,太大会因为混进非尾部数据而有偏。“Hill plot” 是把 关于 画出来,应该有一段稳定区,把 选在那里(数据表现好的时候通常取 左右,但实务上都是画图肉眼判断)。
Moments 估计量 (Dekkers-Einmahl-de Haan, 1989)。 用 log-exceedance 的二阶矩。还是同一组序统计量:
其中 。这个估计量对 的选择比 Hill 更稳健,渐近方差也更小。
Pickands 估计量 (1975)。 用相邻序统计量之间的间距。对上序统计量索引 ():
等价地,。注意 (因为序统计量按降序排),所以比值里两个间距都是非负的。这个估计量对 一致,但有限样本下方差非常大, 在同样的 下,渐近方差大约是 Hill 估计量的 5 倍 (Drees et al., 2000)。多数应用场景下,Hill 和 Moments 更受青睐。
对 1980–2020 年的标普 500 日收益,三个估计量给出的 都在 3–5 区间(也就是 在 0.2–0.33),其中 Moments 通常最稳。
第三步:选阈值
有了尾指数估计量给出的 大致概念之后,就该为正式的 GPD 拟合选阈值。三条经验法则,按我推荐使用的顺序:
-
的稳定性: 在数据的 80、85、90、95、97.5、99 分位作为阈值处拟合 GPD 的 MLE,画 关于分位数的曲线。找那个分位数之上 大致常数的区间。这就是渐近区域。
-
的稳定性: GPD 的尺度参数大致满足 ,所以 应该大致常数。画这个量关于 的曲线。曲线平坦的那段就是渐近理论成立的阈值区间。
-
95 分位经验法则: 如果没有别的线索,就用 90 或 95 分位作为 。这样给出 5–10% 的超出率,对 MLE 通常已经够稳。要注明这是经验法则。
一个细节: 增大时,超出减少,MLE 方差增大。所以存在一个偏差-方差权衡, “小 = 更多数据但偏差大” vs. “大 = 更少数据但偏差小”。诊断图能帮你找出最佳点。
第四步:最大似然拟合
GPD 的密度( 时)为
且 。 个超出的对数似然是
在 上有效。
只要数据支撑超过边界,MLE 对任意 都存在。标准误由观察 Fisher 信息的逆矩阵给出:
小样本下,MLE 在有限样本上可能有严重的偏差,特别是 接近 0.5 时。Bootstrap 或 jackknife 标准误比 MLE 标准误更可靠。
实务中拟合 GPD 到金融损失,按这个流程来:
import numpy as np
from scipy.stats import genpareto
from scipy.optimize import minimize
# 模拟金融损失:重尾,shape = 0.25
np.random.seed(42)
xi_true = 0.25
sigma_true = 0.01
n_days = 5000
losses = genpareto.rvs(c=-1/xi_true, scale=sigma_true, size=n_days)
# 阈值取 95 分位
u = np.quantile(losses, 0.95)
exceedances = losses[losses > u] - u
# MLE 拟合 GPD
xi_hat, _, scale_hat = genpareto.fit(exceedances, floc=0)
# T = 250 天的 return level
T = 250
zeta_u = len(exceedances) / n_days
z_T = u + (scale_hat / xi_hat) * ((zeta_u * T) ** xi_hat - 1)
print(f"True shape: {xi_true}")
print(f"Estimated shape: {xi_hat:.3f}")
print(f"Estimated scale: {scale_hat:.5f}")
print(f"Threshold u: {u:.5f}")
print(f"Exceedance rate: {zeta_u:.4f}")
print(f"Return level for T=250: {z_T:.5f}")
跑一下,应该会得到 接近 0.25。return level 会远大于数据的 95 分位, 这是设计的,因为 250 个交易日的 return level 是 250 个交易日才出现一次的最差,比最差 5% 的日子稀有得多。
第五步:Profile Likelihood 给置信区间
只有点估计 是不够的,我们要置信区间。
默认的 Wald 区间 在 小或 接近边界时是错的。更合适的是 profile likelihood 区间:
对目标 ,找最大化 profile log-likelihood 的 。95% profile likelihood 区间是集合
(1.92 = 0.5 × )。
对 GPD 尾指数,这个方法给出的区间是不对称的且尊重边界( 对应肥尾)。Wald 区间做不到。
Bootstrap 是最通用的方法。重复有放回地重抽样超出,拟合 GPD,取 2.5/97.5 分位。 次 bootstrap 就能得到比较稳的区间,而且不需要对 MLE 的分布做任何假设。
第六步:Return Level 的置信区间
把所有东西拼起来:POT 下 -观测 return level 是
对非常大的 ,, 关于 是幂律。
要算 的置信区间,对 的渐近联合正态分布用 delta method(注意:是超出率的对数近似正态,不是超出率本身)。大 极限下 的方差是
对 250 个交易日的 return level,超出数 (也就是约 10 年数据 + 95 分位阈值),典型的 95% 置信区间大概是点估计的 。数据更短或阈值更高时会更宽。
完整示例
让我走一遍合成的端到端例子。从 Student- 分布生成 5 年的日损失,自由度 ,尺度 0.01。Student- 的尾指数是 ( 时),其生存函数 (所以 )。
第一步:生成数据。第二步:画诊断图。第三步:Hill plot 找稳定的 。第四步:在 = 95 分位拟合 GPD。第五步:报告 250 个交易日的 return level 及置信区间。
这里不把所有图都放进来,但流程就是上面那段代码。Hill plot 通常给出 ,跟真实 一致。GPD MLE 给出 ,跟真实值吻合。250 个交易日的 return level 大约是数据标准差的 8–10 倍,95% 置信区间大概是 到 。
常见坑
下面这些坑,每一个我都见过真实的项目踩进去。
坑 1:阈值取得太低。 如果你在 50 分位拟合 GPD,渐近理论根本不成立。估计会被非尾部数据污染,尾指数偏向分布的中段(一般 偏大, 偏小)。一定要用诊断图,在稳定区里选阈值。
坑 2:把 GPD 当黑盒。 genpareto.fit() 对任何数据都会给一个答案。如果数据是正态的,它会给你一个很小的 , 大致对,但没信息(你想估计的是错误的分布)。总是先看诊断图。
坑 3:把 GPD 跟 GEV 弄混。 区组最大值法拟合 GEV;POT 法拟合 GPD。如果数据一致,两者给的答案相关,但是是不同的模型类。如果你有区组最大值,用 GEV。如果你有连续损失序列,用 GPD。
坑 4:忽略时间相关性。 日损失是自相关的。高波动率日的聚集(GARCH 效应)意味着超出之间不是独立的。多数 EVT 软件假设独立性。要么先去聚类(提取”独立”的超出),要么用能处理聚集的 EVT 变种。
坑 5:return level 的 太小。 return level 在大 (年度、十年级)时最有信息量。如果算的是 10 个交易日的 return level,你其实是在数据内部做插值,用 EVT 没必要, 经验分位数就够了。用 EVT 的理由恰好是你要外推到观测数据之外。
实务结论
GPD 适用的场景:
- 你的数据明显是重尾(mean excess plot 是正斜率的直线,Hill plot 在 稳定)。
- 阈值之上至少 100 个超出。
- 你要外推到观测分位数之外,比如超出率 1/(T) 对应的 大于阈值的 。
不要用 GPD 的场景:
- 尾部是正态的(用基于高斯的 VaR / ES)。
- 数据很少(用经验分位数,但要谦逊)。
- 过程非平稳又没有显式的时变模型(比如带时变尺度的 GPD)。
做完 GPD 拟合之后,总是汇报:
- 阈值 及其选取理由。
- 及其 95% 置信区间。
- return level 及其 95% 置信区间,至少给 和 两个。
- 支撑阈值选择的诊断图。
如果风险报告只有一个数字, “99% VaR 是 500 万美元”, 又没这些诊断,你看到的就是某个糟糕的 VaR 估计。如果它写的是”基于 EVT 的 250 个交易日 99.5% VaR 是 2300 万美元(95% CI [1800 万,3100 万],,阈值在 95 分位, 个超出)“,你看到的就是一个有意义的数字。
参考文献
Balkema, A. A., & de Haan, L. (1974). Residual life time at great age. Annals of Probability, 2(5), 792-804.
Coles, S. (2001). An Introduction to Statistical Modeling of Extreme Values. Springer.
Dekkers, A. L. M., & de Haan, L. (1989). On the estimation of the extreme-value index and large quantile estimation. Annals of Statistics, 17(4), 1795-1832.
Hill, B. M. (1975). A simple general approach to inference about the tail of a distribution. Annals of Statistics, 3(5), 1163-1174.
McNeil, D., Frey, R., & Embrechts, P. (2010). Quantitative Risk Management. Princeton University Press. Chs. 5-6.
Pickands, J. (1975). Statistical inference using extreme order statistics. Annals of Statistics, 3(1), 119-131.