halo 的技术博客

返回

先说结论:“肥尾”不该是个形容词,该是个数。尾部指数 α 就是这个数:P(X>x)xαP(X > x) \sim x^{-\alpha},α 越小尾巴越肥,而且它直接判决矩的生死——α<4 时峰度不存在,α<2 时连方差都没了(你算的历史波动率是个不收敛的随机数)。Hill 估计量是从数据里榨出 α 的经典工具,但它同时也是量化圈误用重灾区:实测显示 n=250(一年日线)时估计值 2.52±0.47(真值 3.0)——系统性负偏加上巨大方差,一年数据测尾部指数等于用体温计量海深

一、尾部指数:一个数判决矩的生死#

幂律尾 P(X>x)=CxαP(X>x) = C x^{-\alpha} 有个残酷的性质:k 阶矩存在当且仅当 k < α。对照表:

α 范围后果
α > 4峰度存在,接近”温和肥尾”
3 < α ≤ 4峰度不存在——样本峰度随样本量增长而发散
2 < α ≤ 3偏度不存在,方差勉强活着
α ≤ 2方差不存在,均值-方差框架整体报废

实证文献对股票日收益的共识大致是 α∈[3, 5]:方差存在(谢天谢地),峰度悬。这意味着任何依赖四阶矩的方法(比如用样本峰度做风控指标)在数学上就站不住。

二、Hill 估计量:对数间距的平均#

把样本降序排列 X(1)X(2)X_{(1)} \ge X_{(2)} \ge \cdots,取前 k 个”尾部样本”,Hill 估计量是:

α^k=[1ki=1klnX(i)X(k+1)]1\hat{\alpha}_k = \left[ \frac{1}{k} \sum_{i=1}^{k} \ln \frac{X_{(i)}}{X_{(k+1)}} \right]^{-1}

直觉:如果尾部真是幂律,顺序统计量的对数间距近似指数分布,其均值就是 1/α。代码只有三行:

import numpy as np

def hill(sorted_desc, k):
    """sorted_desc: 降序排列的正样本"""
    xk = sorted_desc[k]
    return 1.0 / np.mean(np.log(sorted_desc[:k] / xk))
python

先在已知真值上验货#

三个真值已知的分布,n=10000,画 α̂ 随 k 变化的 Hill Plot:

rng = np.random.default_rng(7)
cases = {
    "Pareto α=2":     np.abs(rng.pareto(2.0, 10000) + 1),   # 真值 2
    "Student-t df=3": np.abs(rng.standard_t(3, 10000)),      # 真值 3
    "Student-t df=5": np.abs(rng.standard_t(5, 10000)),      # 真值 5
}
python

已知分布 Hill Plot

k=250 处的成绩单:

  • Pareto:真值 2.0,估出 2.02——近乎完美,因为 Pareto 是”纯”幂律,任何 k 都无偏
  • t(3):真值 3.0,估出 2.73——负偏 9%
  • t(5):真值 5.0,估出 3.87——负偏 23%!

这就是 Hill 估计量的第一课:它只对”渐近幂律”无偏,而 t 分布的尾部要走到很深才”变直”。α 越大(尾越薄),进入幂律区越慢,有限样本下的负偏越狠。看到论文报”某资产 α̂=3.5”,真值很可能在 4 以上。

三、上金融数据:左右尾各有多肥#

用 GARCH(1,1)+t(4) 合成 5000 天收益(同前一篇 EVT 文的生成过程),左尾(损失)右尾(盈利)分开估:

金融收益 Hill Plot

k=150 处:左尾 α̂=2.65,右尾 α̂=2.59。有意思的是创新项明明是 t(4)(α=4),无条件分布的尾巴却肥得多——GARCH 波动聚集把尾部进一步增肥:极端收益 = 肥尾创新 × 高波动状态,两个随机数的乘积比任何一个都更极端。这是特征不是 bug——真实市场同时具备两种机制,无条件尾部指数天然低于”创新项”的尾部指数。

log-log 生存函数图给出最直观的视觉证据:

log-log 生存函数

幂律尾在双对数轴上是直线(斜率 -α),正态分布则是不断加速的跳水曲线。数据点在尾部乖乖趴在直线上,离正态曲线越来越远——肥尾不需要检验统计量,肉眼可辨。

四、Weissman 外推:给”百年一遇”标价#

有了 α̂ 就能外推样本外的深尾分位数(Weissman 公式):

x^p=X(k)(knp)1/α^\hat{x}_p = X_{(k)} \cdot \left( \frac{k}{np} \right)^{1/\hat{\alpha}}

算”20 年一遇”和”百年一遇”的单日损失:

事件幂律外推正态外推样本内最差实际
20 年一遇9.0%2.7%7.16%
100 年一遇16.5%3.0%

正态说百年一遇是 3.0%——但样本内实际发生过 7.16%,是正态”百年一遇”的两倍还多,而样本只有 20 年。幂律外推的 9.0%(20 年)和实际最差 7.16% 在同一个量级,靠谱得多。对照现实:标普 500 在 1987 年 10 月 19 日单日 -20.5%,用正态外推那是”宇宙年龄内不该发生”的事件,用 α≈3 的幂律看只是个正常的世纪级样本。

五、最重要的一节:小样本下 Hill 是个危险玩具#

对 t(3)(真值 α=3)做 300 次蒙特卡洛,样本量从 250 到 10000:

样本量α̂ 均值 ± 标准差
250(一年日线)2.52 ± 0.47
1000(四年)2.62 ± 0.32
5000(二十年)2.76 ± 0.21
10000(四十年)2.78 ± 0.17

小样本偏差

两个扎心事实:

  1. 一年数据的 95% 区间横跨 [1.6, 3.4]——从”方差不存在”到”温和肥尾”全覆盖,等于什么都没说
  2. 偏差不随样本量消失:四十年数据 α̂ 仍是 2.78,负偏 7%。因为 t 分布尾部收敛慢,加样本只能压方差,压不掉进入幂律区之前的结构性偏差

六、三个必躲的坑#

坑一:Hill horror plot——k 的选择能操纵结论#

Hill Plot 理想情况是”先抖动后走平”,取平台值。但很多真实数据的 Hill Plot 根本没有平台,一路斜下去(文献里叫 Hill horror plot),此时取 k=50 和 k=500 能给出差一倍的 α̂。诚实做法:报告整条 Hill Plot 而非单点;或用 bootstrap 选 k 的自动化方法(Danielsson et al.),但要接受它也只是把主观性藏进了另一层。

坑二:对绝对值、左尾、右尾分开估,结论可能不同#

实证上股票左尾常比右尾肥(崩盘比暴涨更极端)。把正负收益混在一起取绝对值估一个”总 α”,会掩盖这种不对称——风控关心的是左尾,就单独估左尾。

坑三:外推的杠杆效应#

Weissman 公式里 α̂ 在指数上:α̂ 从 2.65 挪到 3.0(都在置信区间内),百年一遇的估计从 16.5% 掉到 11%。外推越深,α̂ 的估计误差被放大得越狠。深尾外推的正确姿势是给区间不给点,且明说”这是模型外推,不是测量”。

七、实务清单#

  • 20 年以上日线(n>5000)再谈尾部指数,一年数据出来的数字请当噪声
  • 报告 α̂ 必须带 Hill Plot 全图 + k 的选择依据,单点数字没有审计价值
  • 左右尾分开估;对 GARCH 滤波后的残差再估一次,分清”波动聚集贡献的肥”和”创新项本身的肥”
  • α̂<3 时警惕一切依赖方差稳定性的模型(均值-方差优化、Sharpe 排名),α̂<4 时别再引用样本峰度
  • Hill 告诉你尾巴的斜率,EVT/GPD 给出完整的尾部分布——前者是诊断,后者才是定价工具,配合使用

“肥尾”从形容词变成一个带置信区间的数,风险管理才算从文学进入了科学。

Hill 估计量与尾部指数:量化收益分布到底有多肥
https://blog.halo26812.eu.org/blog/hill-estimator-tail-index
Author halo
Published at 2026年7月25日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨