5D Library › 信贷周期、自组织临界性与市场相变的统计物理 · English
第四章 波动率聚类与 GARCH
大波动之后是大波动
1963 年,曼德博研究棉花价格的变动,发现它们的分布比正态分布有厚得多的尾部,并且注意到:大的变动往往跟着大的变动(方向不定),小的变动往往跟着小的变动 (Mandelbrot 1963)。这就是波动率聚类。
孔特把资产收益率的这类规律总结为一组「典型事实」,其中包括:收益率本身几乎没有自相关(今天涨不能预测明天涨);收益率的尾部比正态分布厚;收益率的绝对值或平方却有明显的、衰减很慢的自相关,也就是波动率聚类 (Cont 2001)。这几条同时成立:方向难以预测,但「会不会大幅波动」在一定程度上可以预测。
ARCH 与 GARCH
恩格尔在 1982 年提出了自回归条件异方差(ARCH)模型 (Engle 1982):今天收益率的方差取决于过去几天收益率的平方。他最初用它研究英国的通胀,后来它成为金融计量的基本工具;恩格尔因这一方法获得 2003 年诺贝尔经济学奖。博勒斯莱夫在 1986 年把它推广为 GARCH 模型 (Bollerslev 1986),最常用的是 GARCH(1,1):
衡量昨天的冲击对今天波动的影响, 衡量波动本身的持续性; 越接近 1,波动冲击消退得越慢。即使 服从正态分布, 的分布也会有厚尾,因为它是许多方差不同的正态分布的混合。
推导
模拟 5,000 个交易日(约 20 年)的 GARCH(1,1) 收益率,、,这是股票指数日收益率估计中常见的量级;长期日波动率为 1%。然后看三件事:尾部与峰度,收益率与收益率平方的自相关,以及用固定波动率的正态模型计算 99% 单日风险价值(VaR)的表现。
# GARCH(1,1) (Engle 1982; Bollerslev 1986): today's variance depends on yesterday's squared return
# s2[t] = omega + alpha * r[t-1]^2 + beta * s2[t-1], r[t] = s[t] * z[t], z ~ N(0, 1)
# alpha = 0.10, beta = 0.88 are typical of daily stock-index estimates; omega gives a long-run daily
# sd of 1 %. Twenty simulated years (5,000 days) - not real data.
import math, random, statistics as st
rnd = random.Random(2)
a, b = 0.10, 0.88
om = 1e-4 * (1 - a - b)
s2, r, sig = 1e-4, [], []
for t in range(5000):
s = math.sqrt(s2); x = s * rnd.gauss(0, 1)
r.append(x); sig.append(s)
s2 = om + a * x * x + b * s2
def acf(x, k):
m = st.fmean(x); v = sum((u - m) ** 2 for u in x)
return sum((x[i] - m) * (x[i + k] - m) for i in range(len(x) - k)) / v
sd = st.pstdev(r)
kurt = st.fmean([(u / sd) ** 4 for u in r]) - 3
theory = 3 * (1 - (a + b) ** 2) / (1 - (a + b) ** 2 - 2 * a * a) - 3
print(f"daily sd {sd:.2%}; excess kurtosis {kurt:.2f} (theory for these parameters {theory:.2f}; normal 0)")
print(f"autocorrelation at lag 1: returns {acf(r, 1):+.3f}, squared returns {acf([u * u for u in r], 1):+.3f};"
f" squared returns at lag 20 {acf([u * u for u in r], 20):+.3f}")
big = sum(1 for u in r if abs(u) > 4 * sd)
print(f"days beyond 4 sd: {big}; a normal distribution predicts {5000 * math.erfc(4 / math.sqrt(2)):.2f}")
# 99 % one-day value at risk from a constant-sd normal model, estimated on the whole sample
var = 2.326 * sd
hits = [u < -var for u in r]
qs = sorted(sig); lo, hi = qs[1250], qs[3750]
rate = lambda sel: sum(h for h, s in zip(hits, sig) if sel(s)) / sum(1 for s in sig if sel(s))
print(f"constant-sd 99 % VaR = {var:.2%}: breached on {sum(hits) / 50:.2f} % of days overall,"
f" {rate(lambda s: s >= hi):.2%} in the most volatile quarter, {rate(lambda s: s <= lo):.2%} in the calmest")
w = max(sum(hits[i:i + 20]) for i in range(len(hits) - 19))
print(f"most breaches in any 20-day window: {w} (with independent 1 % breaches, 4 or more in a given window"
f" has probability {1 - sum(math.comb(20, k) * 0.01 ** k * 0.99 ** (20 - k) for k in range(4)):.1e})")
g = sum(1 for u, s in zip(r, sig) if u < -2.326 * s) / 50
print(f"VaR using the true GARCH sd of each day: breached on {g:.2f} % of days")
# daily sd 0.95%; excess kurtosis 1.25 (theory for these parameters 3.06; normal 0)
# autocorrelation at lag 1: returns +0.026, squared returns +0.201; squared returns at lag 20 +0.123
# days beyond 4 sd: 7; a normal distribution predicts 0.32
# constant-sd 99 % VaR = 2.21%: breached on 1.58 % of days overall, 4.72% in the most volatile quarter, 0.00% in the calmest
# most breaches in any 20-day window: 7 (with independent 1 % breaches, 4 or more in a given window has probability 4.3e-05)
# VaR using the true GARCH sd of each day: breached on 1.06 % of days结果说明了几件事。
厚尾。 超过 4 个标准差的日子有 7 天,正态分布预计的是 0.3 天。
聚类。 收益率本身的一阶自相关接近零(+0.03),收益率平方的一阶自相关约 +0.20,滞后 20 天仍有约 +0.12:方向无法预测,波动的大小可以部分预测。
峰度很难测准。 这组参数的理论超额峰度约为 3.1,而 20 年模拟数据测得的只有约 1.3。原因是峰度由极少数极端日子决定,20 年里这样的日子太少。这本身就是重尾的一个后果:连「尾部有多厚」都不容易从有限的数据中测准。
固定波动率的风险价值会在最需要的时候失灵。 用全样本标准差算出的 99% VaR 约为 2.2%。整体上它被突破的天数是 1.58%,只比设计的 1% 多一些,看起来「大致可用」;但在波动最高的四分之一日子里,突破率高达约 4.7%,在最平静的四分之一日子里则为零。突破成群出现:在某个 20 天窗口里出现了 7 次,而如果突破彼此独立、概率为 1%,一个给定窗口出现 4 次以上的概率只有约十万分之四。用每天真实的 GARCH 波动率计算 VaR,突破率回到约 1.06%。
注
GARCH 也不是终点。 用正态分布的 的 GARCH 模型,通常仍然低估真实收益率的尾部,所以实践中常改用 分布等更厚尾的冲击;GARCH(1,1) 的波动自相关按指数衰减,而真实数据中的衰减往往更慢。模型在平静时期估计的参数,在危机中可能不再适用。本节的要点不是「用 GARCH 就安全了」,而是固定波动率的正态假设会系统地在动荡时期低估风险,而且这种低估会集中出现。
假说 · 尚未验证
风险报告的条件覆盖假说(尚未确立)。对个人投资者展示的风险指标(例如「最大可能损失」)如果按固定波动率计算,那么在波动率高于长期平均的时期,实际损失超出所报指标的频率会明显高于名义水平。可以用公开的基金或产品风险说明与其随后的实际表现检验。如果在高波动时期的超出频率与名义水平没有差别,这一假说就被削弱。
本章小结
资产收益率方向难以预测,但波动的大小会成群出现,分布有厚尾。GARCH(1,1) 模型用很少的参数重现了这些特征。模拟显示,有限样本中的峰度会被明显低估;用固定波动率的正态模型计算的风险价值整体上看起来接近名义水平,却在高波动时期频繁而成群地被突破。下一章从期权价格的角度看市场怎样为这些尾部风险定价。
参考文献
Fan, Y. (2026). Credit Cycles, Self-Organised Criticality and the Statistical Physics of Market Phase Transitions: From Minsky's Financial Instability Hypothesis and Sandpile Power-Law Avalanches to Implied-Volatility Skew, Read Beside Classical Chinese Thought on Rise and Decline [信贷周期、自组织临界性与市场相变的统计物理] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23754711 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).