跳到正文

EVT 处理尾部风险:把 GPD 拟合到金融损失

金融 EVT 的实务:Hill 和 Moments 方法估计尾指数、GPD 的 MLE 拟合、return level 的置信区间,以及诊断图。

第 8 篇 · 共 12 篇 约 9 分钟

理论告诉我们重尾分布的尾是 GPD。实务就乱多了。我们面对的是有限数据、regime 切换、非平稳的波动率过程,以及无处不在的过拟合冲动。这篇文章走一遍把 GPD 拟合到金融损失的实务流程:估计尾指数 ξ\xi、选阈值、最大似然拟合,最后给出带诚实置信区间的 return level。

这里讲的技术对任何重尾金融序列都适用:股票收益、违约损失、信用利差、操作损失。重尾这个前提条件很关键, 如果你的数据是瘦尾,GPD 拟合会给出误导性的结果,你应该用基于正态的方法。

第一步:尾部是重尾吗?

拟合 GPD 之前,要先确认尾部是重的。三个诊断图可以在不假设分布的前提下做这件事。

对数直方图。 把损失的直方图画在双对数坐标上(对数频率 vs. 对数值)。正态尾的话,直方图在右端的下降速度比任何线性趋势都快。幂律尾 P(L>ℓ)∼ℓ−αP(L > \ell) \sim \ell^{-\alpha} 的话,互补 log-log 图 log⁡P(L>ℓ)\log P(L > \ell) 关于 log⁡ℓ\log \ell 应该是斜率为 −α-\alpha 的直线。

Mean excess plot。 画 e^(u)=1Nu∑Xi>u(Xi−u)\hat{e}(u) = \frac{1}{N_u} \sum_{X_i > u} (X_i - u) 关于 uu 的曲线。对 ξ<1\xi < 1 的 GPD,理论均值超出函数是 σu/(1−ξ)\sigma_u / (1 - \xi),关于 uu 是线性的。所以均值超出图里一段大致线性的区间,就是 GPD 形态尾部的标志(且 ξ<1\xi < 1,这在金融里很常见,ξ\xi 通常落在 (0,0.5)(0, 0.5))。

QQ plot。 把超出量 Yi=Xi−uY_i = X_i - u(对应 Xi>uX_i > u)排序,画 Y(i)Y_{(i)} 关于 G−1((i−0.5)/Nu)G^{-1}((i - 0.5)/N_u) 的曲线,其中 GG 是拟合的 GPD。偏离对角线就说明尾部行为不对。如果最大那几个点在对角线之上,你的形状就错了, 换一个更肥的 ξ\xi。

如果三个诊断都指向幂尾,再进入尾指数估计。

第二步:估计尾指数

尾指数 α=1/ξ\alpha = 1/\xi 是拟合里最重要的数字。三个广泛使用的估计量。

Hill 估计量 (1975)。 把损失从大到小排序:X(1)≥X(2)≥⋯≥X(n)X_{(1)} \ge X_{(2)} \ge \cdots \ge X_{(n)}。对某个上序统计量索引 kk,Hill 估计量为

α^k,nHill=[1k∑i=1klog⁡X(i)X(k+1)]−1\hat{\alpha}_{k,n}^{\text{Hill}} = \left[\frac{1}{k} \sum_{i=1}^k \log\frac{X_{(i)}}{X_{(k+1)}}\right]^{-1}

等价地,ξ^Hill=1/α^Hill\hat\xi^{\text{Hill}} = 1/\hat\alpha^{\text{Hill}}。渐近正态给出的标准误是

σ^α^Hill≈α^k\hat\sigma_{\hat\alpha}^{\text{Hill}} \approx \frac{\hat\alpha}{\sqrt{k}}

Hill 对 α\alpha 是一致的,也好算。它的主要缺点是对 kk 敏感:太小方差大,太大会因为混进非尾部数据而有偏。“Hill plot” 是把 α^\hat\alpha 关于 kk 画出来,应该有一段稳定区,把 kk 选在那里(数据表现好的时候通常取 k=n2/3k = n^{2/3} 左右,但实务上都是画图肉眼判断)。

Moments 估计量 (Dekkers-Einmahl-de Haan, 1989)。 用 log-exceedance 的二阶矩。还是同一组序统计量:

α^Mom=Mn(2)−(Mn(1))2/2Mn(2)−Mn(1)\hat\alpha^{\text{Mom}} = \frac{M_n^{(2)} - (M_n^{(1)})^2/2}{M_n^{(2)} - M_n^{(1)}}

其中 Mn(r)=1k∑i=1k[log⁡(X(i)/X(k+1))]rM_n^{(r)} = \frac{1}{k} \sum_{i=1}^k [\log(X_{(i)}/X_{(k+1)})]^r。这个估计量对 kk 的选择比 Hill 更稳健,渐近方差也更小。

Pickands 估计量 (1975)。 用相邻序统计量之间的间距。对上序统计量索引 kk(1≤k≤n/41 \le k \le n/4):

α^k,nPick=1log⁡2log⁡X(k)−X(2k)X(2k)−X(4k)\hat\alpha^{\text{Pick}}_{k,n} = \frac{1}{\log 2} \log \frac{X_{(k)} - X_{(2k)}}{X_{(2k)} - X_{(4k)}}

等价地,ξ^Pick=1/α^Pick\hat\xi^{\text{Pick}} = 1/\hat\alpha^{\text{Pick}}。注意 X(k)≥X(2k)≥X(4k)X_{(k)} \ge X_{(2k)} \ge X_{(4k)}(因为序统计量按降序排),所以比值里两个间距都是非负的。这个估计量对 α\alpha 一致,但有限样本下方差非常大, 在同样的 kk 下,渐近方差大约是 Hill 估计量的 5 倍 (Drees et al., 2000)。多数应用场景下,Hill 和 Moments 更受青睐。

对 1980–2020 年的标普 500 日收益,三个估计量给出的 α^\hat\alpha 都在 3–5 区间(也就是 ξ^\hat\xi 在 0.2–0.33),其中 Moments 通常最稳。

第三步:选阈值

有了尾指数估计量给出的 ξ\xi 大致概念之后,就该为正式的 GPD 拟合选阈值。三条经验法则,按我推荐使用的顺序:

  1. ξ^\hat\xi 的稳定性: 在数据的 80、85、90、95、97.5、99 分位作为阈值处拟合 GPD 的 MLE,画 ξ^(u)\hat\xi(u) 关于分位数的曲线。找那个分位数之上 ξ^(u)\hat\xi(u) 大致常数的区间。这就是渐近区域。

  2. σ^u+ξu\hat\sigma_u + \xi u 的稳定性: GPD 的尺度参数大致满足 σu=σ+ξ(u−μ)\sigma_u = \sigma + \xi (u - \mu),所以 σ^u+ξ^u\hat\sigma_u + \hat\xi u 应该大致常数。画这个量关于 uu 的曲线。曲线平坦的那段就是渐近理论成立的阈值区间。

  3. 95 分位经验法则: 如果没有别的线索,就用 90 或 95 分位作为 uu。这样给出 5–10% 的超出率,对 MLE 通常已经够稳。要注明这是经验法则。

一个细节:uu 增大时,超出减少,MLE 方差增大。所以存在一个偏差-方差权衡, “小 uu = 更多数据但偏差大” vs. “大 uu = 更少数据但偏差小”。诊断图能帮你找出最佳点。

第四步:最大似然拟合

GPD 的密度(ξ≠0\xi \ne 0 时)为

f(y)=1σ(1+ξyσ)−1−1/ξf(y) = \frac{1}{\sigma} \left(1 + \xi \frac{y}{\sigma}\right)^{-1 - 1/\xi}

y>0y > 0 且 1+ξy/σ>01 + \xi y/\sigma > 0。NN 个超出的对数似然是

ℓ(ξ,σ)=−Nlog⁡σ−(1+1ξ)∑i=1Nlog⁡(1+ξyiσ)\ell(\xi, \sigma) = -N \log \sigma - \left(1 + \frac{1}{\xi}\right) \sum_{i=1}^N \log\left(1 + \xi \frac{y_i}{\sigma}\right)

在 {(ξ,σ):1+ξyi/σ>0 for all i}\{(\xi, \sigma) : 1 + \xi y_i/\sigma > 0 \text{ for all } i\} 上有效。

只要数据支撑超过边界,MLE 对任意 ξ>−1/2\xi > -1/2 都存在。标准误由观察 Fisher 信息的逆矩阵给出:

I(ξ,σ)=−∂2ℓ∂(ξ,σ)2I(\xi, \sigma) = -\frac{\partial^2 \ell}{\partial (\xi, \sigma)^2}

小样本下,MLE 在有限样本上可能有严重的偏差,特别是 ξ\xi 接近 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}")

跑一下,应该会得到 ξ^\hat\xi 接近 0.25。return level 会远大于数据的 95 分位, 这是设计的,因为 250 个交易日的 return level 是 250 个交易日才出现一次的最差,比最差 5% 的日子稀有得多。

第五步:Profile Likelihood 给置信区间

只有点估计 ξ^\hat\xi 是不够的,我们要置信区间。

默认的 Wald 区间 ξ^±1.96σ^ξ\hat\xi \pm 1.96 \hat\sigma_\xi 在 NN 小或 ξ\xi 接近边界时是错的。更合适的是 profile likelihood 区间:

对目标 ξ0\xi_0,找最大化 profile log-likelihood ℓp(ξ0)=max⁡σℓ(ξ0,σ)\ell_p(\xi_0) = \max_\sigma \ell(\xi_0, \sigma) 的 σ^(ξ0)\hat\sigma(\xi_0)。95% profile likelihood 区间是集合

{ξ:ℓp(ξ)≥ℓp(ξ^)−1.92}\{\xi : \ell_p(\xi) \ge \ell_p(\hat\xi) - 1.92\}

(1.92 = 0.5 × χ1,0.952\chi^2_{1, 0.95})。

对 GPD 尾指数,这个方法给出的区间是不对称的且尊重边界(ξ>0\xi > 0 对应肥尾)。Wald 区间做不到。

Bootstrap 是最通用的方法。重复有放回地重抽样超出,拟合 GPD,取 2.5/97.5 分位。B=1000B = 1000 次 bootstrap 就能得到比较稳的区间,而且不需要对 MLE 的分布做任何假设。

第六步:Return Level 的置信区间

把所有东西拼起来:POT 下 TT-观测 return level 是

z^T=u+σ^uξ^[(ζ^uT)ξ^−1]\hat z_T = u + \frac{\hat\sigma_u}{\hat\xi}\left[(\hat\zeta_u T)^{\hat\xi} - 1\right]

对非常大的 TT,z^T≈(ζ^uT)ξ^⋅σ^u/ξ^+u\hat z_T \approx (\hat\zeta_u T)^{\hat\xi} \cdot \hat\sigma_u / \hat\xi + u, 关于 TT 是幂律。

要算 zTz_T 的置信区间,对 (ξ^,σ^u,log⁡ζ^u)(\hat\xi, \hat\sigma_u, \log\hat\zeta_u) 的渐近联合正态分布用 delta method(注意:是超出率的对数近似正态,不是超出率本身)。大 TT 极限下 log⁡z^T\log \hat z_T 的方差是

Var(log⁡z^T)≈Var(ξ^)(log⁡(ζ^uT))2+Var(σ^u)σ^u2−2Cov(ξ^,σ^u)log⁡(ζ^uT)σ^u+1Nu\text{Var}(\log \hat z_T) \approx \text{Var}(\hat\xi) (\log(\hat\zeta_u T))^2 + \frac{\text{Var}(\hat\sigma_u)}{\hat\sigma_u^2} - \frac{2 \text{Cov}(\hat\xi, \hat\sigma_u) \log(\hat\zeta_u T)}{\hat\sigma_u} + \frac{1}{N_u}

对 250 个交易日的 return level,超出数 Nu≈250N_u \approx 250(也就是约 10 年数据 + 95 分位阈值),典型的 95% 置信区间大概是点估计的 ±30%\pm 30\%。数据更短或阈值更高时会更宽。

完整示例

让我走一遍合成的端到端例子。从 Student-tt 分布生成 5 年的日损失,自由度 ν=4\nu = 4,尺度 0.01。Student-tt 的尾指数是 α=ν\alpha = \nu(ν>1\nu > 1 时),其生存函数 P(T>t)∼t−νP(T > t) \sim t^{-\nu}(所以 ξ=1/ν=1/4=0.25\xi = 1/\nu = 1/4 = 0.25)。

第一步:生成数据。第二步:画诊断图。第三步:Hill plot 找稳定的 kk。第四步:在 uu = 95 分位拟合 GPD。第五步:报告 250 个交易日的 return level 及置信区间。

这里不把所有图都放进来,但流程就是上面那段代码。Hill plot 通常给出 α^≈4\hat\alpha \approx 4,跟真实 α=ν=4\alpha = \nu = 4 一致。GPD MLE 给出 ξ^≈0.25\hat\xi \approx 0.25,跟真实值吻合。250 个交易日的 return level 大约是数据标准差的 8–10 倍,95% 置信区间大概是 7σ7\sigma 到 14σ14\sigma。

常见坑

下面这些坑,每一个我都见过真实的项目踩进去。

坑 1:阈值取得太低。 如果你在 50 分位拟合 GPD,渐近理论根本不成立。估计会被非尾部数据污染,尾指数偏向分布的中段(一般 α^\hat\alpha 偏大,ξ^\hat\xi 偏小)。一定要用诊断图,在稳定区里选阈值。

坑 2:把 GPD 当黑盒。 genpareto.fit() 对任何数据都会给一个答案。如果数据是正态的,它会给你一个很小的 ξ^≈0\hat\xi \approx 0, 大致对,但没信息(你想估计的是错误的分布)。总是先看诊断图。

坑 3:把 GPD 跟 GEV 弄混。 区组最大值法拟合 GEV;POT 法拟合 GPD。如果数据一致,两者给的答案相关,但是是不同的模型类。如果你有区组最大值,用 GEV。如果你有连续损失序列,用 GPD。

坑 4:忽略时间相关性。 日损失是自相关的。高波动率日的聚集(GARCH 效应)意味着超出之间不是独立的。多数 EVT 软件假设独立性。要么先去聚类(提取”独立”的超出),要么用能处理聚集的 EVT 变种。

坑 5:return level 的 TT 太小。 return level 在大 TT(年度、十年级)时最有信息量。如果算的是 10 个交易日的 return level,你其实是在数据内部做插值,用 EVT 没必要, 经验分位数就够了。用 EVT 的理由恰好是你要外推到观测数据之外。

实务结论

GPD 适用的场景:

  • 你的数据明显是重尾(mean excess plot 是正斜率的直线,Hill plot 在 α^∈(2,6)\hat\alpha \in (2, 6) 稳定)。
  • 阈值之上至少 100 个超出。
  • 你要外推到观测分位数之外,比如超出率 1/(T) 对应的 TT 大于阈值的 TT。

不要用 GPD 的场景:

  • 尾部是正态的(用基于高斯的 VaR / ES)。
  • 数据很少(用经验分位数,但要谦逊)。
  • 过程非平稳又没有显式的时变模型(比如带时变尺度的 GPD)。

做完 GPD 拟合之后,总是汇报:

  • 阈值 uu 及其选取理由。
  • ξ^\hat\xi 及其 95% 置信区间。
  • return level z^T\hat z_T 及其 95% 置信区间,至少给 T=100T = 100 和 T=250T = 250 两个。
  • 支撑阈值选择的诊断图。

如果风险报告只有一个数字, “99% VaR 是 500 万美元”, 又没这些诊断,你看到的就是某个糟糕的 VaR 估计。如果它写的是”基于 EVT 的 250 个交易日 99.5% VaR 是 2300 万美元(95% CI [1800 万,3100 万],ξ^=0.28\hat\xi = 0.28,阈值在 95 分位,Nu=320N_u = 320 个超出)“,你看到的就是一个有意义的数字。

参考文献

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.