halo 的技术博客

返回

风险管理的核心不是「平均会怎样」,而是「最坏会怎样」。而金融收益最反直觉的一点就是:尾部比正态厚得多

如果你用正态分布算 99.9% VaR,会把极端亏损低估一大截——2008 年、2020 年那种「几十年一遇」的跳空,在正态假设下几乎是概率为 0 的事件,却在现实里反复发生。极端值理论(Extreme Value Theory, EVT)提供了一套只聚焦尾部、不假设整体分布的统计工具,让你用有限的历史数据,对「真正的小概率大亏损」做有依据的推断。

本文用一段 4000 个观测的 Student-t(df=4) 合成序列(理论尾指数 ξ=1/df=0.25\xi=1/\text{df}=0.25),亲手走完 EVT 的全部流程:QQ 诊断 → 选阈值 → GPD 拟合 → Hill 估计 → 计算极端 VaR/CVaR,所有数字和配图由文末代码真实生成。

一、为什么正态不够:QQ 图一眼看穿肥尾#

把样本分位对正态分位画 QQ 图。如果是正态,点应落在 45° 参考线上;金融收益的点会在两端明显翘起——同样的「理论分位数」,样本实际收益更极端。这就是肥尾:极端值比正态预言的多得多。

QQ 图:样本收益 vs 正态,尾部偏离直线 = 肥尾

本文数据峰度 11.26(正态只有 3),是典型厚尾。正态假设下算出的 VaR,在 99.9% 这种极端置信度上会系统性偏低——这正是 EVT 要纠正的。

二、极值两大定理:BM 与 POT#

EVT 有两个支柱:

  1. 区块最大值(BM):把数据分块、取每块最大值,其极限分布是广义极值分布(GEV:Gumbel/Fréchet/Weibull 三类)。
  2. 超阈值峰值(POT,本文主角):超越某个高阈值 uu超额损失 Y=XuY=X-u,其极限分布是广义帕累托分布(GPD)

Gξ,β(y)=1(1+ξyβ)1/ξ,y0G_{\xi,\beta}(y)=1-\left(1+\frac{\xi y}{\beta}\right)^{-1/\xi},\qquad y\ge 0

  • ξ\xi形状参数 / 尾指数ξ>0\xi>0 是肥尾(Pareto 型,方差可无穷),ξ=0\xi=0 是指数尾,ξ<0\xi<0 是短尾(有界)。金融里几乎总是 ξ>0\xi>0
  • β>0\beta>0:尺度参数。

POT 比 BM 更省数据:它不丢信息,用到阈值之上所有极端观测,而不是每块只保留一个最大值。

三、选阈值:平均超额函数(ME)图#

POT 的命脉是阈值 uu 的选择。太高→超额样本太少、估计噪;太低→GPD 近似不成立。诊断工具是平均超额函数

ME(u)=E[XuX>u]\text{ME}(u)=\mathbb{E}[X-u\mid X>u]

GPD 有个漂亮性质:当 uu 进入 GPD 近似区后,ME(u)\text{ME}(u) 关于 uu 近似线性(斜率 ξ/(1ξ)\xi/(1-\xi))。所以看图:选使 ME 曲线变线性的最小 uu

平均超额函数图:u 之上近似线性即可选作阈值

本文对「损失」L=RL=-R 操作(风险关心的是大亏损),取损失 95% 分位 u=2.04%u=2.04\% 为阈值,得到 Nu=200N_u=200 个超额观测——样本量充足又进入了线性区。

四、Hill 估计:只看最极端的几个点#

尾指数 ξ\xi 还有一个经典估计量——Hill 估计,直接用上尾最大的 kk 个观测:

γ^(k)=1ki=1klogX(ni+1)logX(nk)\hat\gamma(k)=\frac{1}{k}\sum_{i=1}^{k}\log X_{(n-i+1)}-\log X_{(n-k)}

对不同的 kkHill 图,取曲线平稳段的均值作为 ξ\xi 的估计。平稳段意味着「再多加几个极端点,估计也稳定」,这是估计可靠的标志。

Hill 图:损失上尾指数在 k∈[200,600] 平稳

本文 Hill 平稳段给出 γ^0.39\hat\gamma\approx 0.39。注意它略高于下面 GPD MLE 的结果——这本身就是真实陷阱(见第六节),但二者都明确指向 ξ>0\xi>0 的肥尾。

五、GPD 的 MLE 拟合与极端 VaR/CVaR#

固定 ξ\xi 后,GPD 的对数似然为

(ξ,β)=Nulogβ(1ξ+1)i=1Nulog ⁣(1+ξyiβ)\ell(\xi,\beta)=-N_u\log\beta-\left(\frac{1}{\xi}+1\right)\sum_{i=1}^{N_u}\log\!\left(1+\frac{\xi y_i}{\beta}\right)

(ξ,β)(\xi,\beta) 做网格搜索最大化即可(无需 scipy)。代入阈值之上的超额损失,本文得到:

ξ^=0.259,β^=0.768%\hat\xi=0.259,\qquad \hat\beta=0.768\%

几乎精确还原了理论值 ξ=0.25\xi=0.25——EVT 在这组数据上自我验证成功。

有了 (ξ^,β^,u)(\hat\xi,\hat\beta,u),极端分位有解析公式(置信度 qq,如 0.99):

VaRq=u+β^ξ^[((1q)nNu)ξ^1]\text{VaR}_q=u+\frac{\hat\beta}{\hat\xi}\left[\left(\frac{(1-q)n}{N_u}\right)^{-\hat\xi}-1\right]

CVaRq=VaRq1ξ^+β^ξ^u1ξ^\text{CVaR}_q=\frac{\text{VaR}_q}{1-\hat\xi}+\frac{\hat\beta-\hat\xi u}{1-\hat\xi}

把三种 VaR 摆在一起(均为潜在损失,正值):

置信度正态假设 VaR经验(历史) VaREVT-GPD VaREVT CVaR
95%2.32%2.04%2.04%3.07%
99%3.27%3.57%3.57%5.15%
99.9%4.34%7.99%7.24%10.10%

VaR 对比:越往尾部,正态 VaR 越低估风险

结论一目了然:越靠近尾部,正态假设越离谱。在 99.9% 置信度,正态 VaR 只有 4.34%,而 EVT 给出 7.24%、经验值更高达 7.99%——正态把极端风险低估了约 67%。这正是 2008/2020 式崩盘「模型里看不见、市场上真发生」的根因。EVT-GPD 的 CVaR(10.10%)进一步告诉我们:一旦发生超过 VaR 的极端亏损,平均还要再亏约 3 个百分点。

六、完整实现(纯 numpy 可复现)#

高斯 VaR 需要正态逆 CDF,可用 scipy.stats.norm.ppf,或一段 Acklam 近似(本文生成脚本里已内置)。正态 VaR 公式即 VaRqGauss=μL+σLΦ1(q)\text{VaR}_q^{\text{Gauss}}=\mu_L+\sigma_L\,\Phi^{-1}(q)

七、真实陷阱(踩坑清单)#

  1. 阈值主观性:不同 uu 给不同 ξ\xi、不同 VaR。务必用 ME 图 + Hill 图交叉验证,而不是拍脑袋选分位数。
  2. Hill 与 MLE 不一致:本文 Hill γ^0.39\hat\gamma\approx0.39 而 GPD MLE ξ^=0.26\hat\xi=0.26,差距来自 Hill 只用最极端的 kk 个 order statistics、对二阶偏差敏感,MLE 用到阈值之上全部样本。二者天然不同,实战里都报、都看,别迷信单一估计量。
  3. 小样本极不稳定:尾部样本本就稀少,NuN_u 从 200 掉到 50,VaR 能漂移几个百分点。极端分位估计的置信区间很宽,要当「区间」而非「点」。
  4. 单变量≠联合:EVT 在这里只建模单资产损失尾。真正的风险是联动——危机里什么都一起跌,多元尾部(t-Copula、联合 EVT)才是组合 VaR 的正确工具。
  5. 非平稳:用 2021–2023 的温和样本估出的 ξ\xi,套不到 2008 的恐慌。波动率聚集 + regime 切换意味着历史尾部不代表未来尾部,需滚动/情境化。
  6. 外推的边界:99.9% 已经接近 POT 外推极限;再往 99.99% 走,结果对阈值和 ξ\xi 高度敏感,参考价值迅速下降。EVT 不是「无限外推许可证」。

八、结论#

EVT 不承诺预测崩盘,但它做了一件更踏实的事:承认「我们没见过最坏的」,并据此给尾部一个比正态诚实得多的尺度。POT + GPD 把「超越阈值后的超额损失」单独建模,Hill 估计与 MLE 交叉确认尾指数,最终算出的极端 VaR/CVaR,是风控里真正该挂在墙上的那几个数字。记住它的边界——阈值要选对、样本要够、联动要考虑、非平稳要警惕——EVT 才会从「漂亮的公式」变成「能救命的工具」。


所有图表与统计数字(QQ、ME 图、Hill 图、GPD 拟合 ξ^=0.259\hat\xi=0.259、各置信度 VaR/CVaR)均由 generate_evt_tail_risk_images.py 真实计算生成。

极端值理论在尾部风险度量中的应用:广义帕累托(POT)与 Hill 估计
https://blog.halo26812.eu.org/blog/evt-tail-risk-gpd
Author halo
Published at 2026年7月12日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨