ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

金融时间序列波动率建模:从ARCH到GARCH模型原理与Python实践

金融时间序列波动率建模:从ARCH到GARCH模型原理与Python实践 1. 从“异方差”说起为什么传统模型在金融时间序列面前失灵了如果你做过股票、汇率或者商品期货价格的分析大概率会遇到一个让人头疼的现象用经典的线性回归或者ARIMA模型拟合出来的残差其波动性并不是一个常数。换句话说模型预测的误差时大时小在某些时期比如市场剧烈震荡时预测误差会显著放大而在另一些平静期则误差很小。这种现象在统计学上被称为“异方差性”即误差项的方差不是恒定的。传统的计量经济学模型如普通最小二乘法OLS其核心假设之一就是“同方差”——所有观测点的误差波动幅度相同。一旦这个假设被违背虽然OLS估计量仍然是无偏的但它不再是“最优”的即方差最小基于此进行的假设检验如t检验、F检验和置信区间构建都会失效。简单说你用传统模型得出的“这个因素是否显著”的结论很可能是不靠谱的。金融时间序列尤其是高频的收益率序列是异方差的“重灾区”。一个直观的感受是市场的波动往往呈现出“聚集性”大涨之后常伴随着大跌而平静期则会持续一段时间。1982年经济学家罗伯特·恩格尔Robert F. Engle正是为了刻画这种“波动率聚集”现象提出了自回归条件异方差模型也就是我们常说的ARCH模型。这个成果让他在2003年获得了诺贝尔经济学奖。ARCH模型的核心思想非常巧妙它不再假设残差的方差是一个常数而是认为当前时刻的波动率方差依赖于过去若干时刻的残差平方的大小。如果过去几期出现了大的冲击正的或负的那么模型就认为当前时刻的波动率也会变大。2. ARCH模型如何让波动率“记住”过去的冲击ARCH模型的具体数学形式并不复杂但理解其背后的逻辑至关重要。我们通常将一个金融时间序列比如日收益率建模为两部分均值方程和方差方程。均值方程描述了收益率本身的走势可以是一个常数也可以包含自回归AR、移动平均MA等成分。最常见的是将其设为一个简单的常数项或白噪声过程。例如r_t μ ε_t其中r_t是t时刻的收益率μ是平均收益率ε_t是扰动项残差。方差方程是ARCH模型的精髓所在。它规定扰动项ε_t的条件方差σ_t²给定过去所有信息下的方差不再是常数而是一个随时间变化的量ε_t σ_t * z_t, 其中z_t是一个独立同分布的标准正态随机变量均值为0方差为1。σ_t² ω α_1 * ε_{t-1}² α_2 * ε_{t-2}² ... α_q * ε_{t-q}²这个方差方程就是ARCH(q)模型。它表示t时刻的条件方差σ_t²由一个常数项ω代表长期平均波动水平和过去q期残差平方的加权和共同决定。参数α_i必须全部非负α_i ≥ 0并且所有α_i之和小于1以保证过程是平稳的。为什么是残差的平方因为波动率关心的是偏离的幅度而不关心偏离的方向涨或跌。一个大的正残差大涨和一个大的负残差大跌都会导致ε_{t-1}²很大从而传导至下一期的波动率升高。这就完美地刻画了“波动率聚集”一个大的冲击无论涨跌之后市场往往会继续波动加剧。然而标准的ARCH模型在实际应用中暴露出两个明显的局限性参数非负约束为了确保预测的方差始终为正所有α系数必须大于等于0。这在估计时可能带来麻烦。滞后阶数q可能很高为了捕捉长期的波动率记忆往往需要设定一个很大的q这意味着需要估计很多参数不仅降低了模型的自由度也使得估计不够灵活和高效。实践中ARCH模型常常需要很高的阶数才能较好地拟合数据。3. GARCH模型的诞生一个更优雅、更强大的解决方案正是为了解决ARCH模型参数过多的问题Tim Bollerslev在1986年提出了广义自回归条件异方差模型即GARCH模型。可以说GARCH是ARCH模型的自然延伸也是目前金融实证研究中应用最广泛的波动率模型。GARCH模型在方差方程中引入了一个“自回归”项。一个标准的GARCH(1,1)模型定义如下 均值方程r_t μ ε_t方差方程σ_t² ω α * ε_{t-1}² β * σ_{t-1}²与ARCH(1)模型σ_t² ω α * ε_{t-1}²相比GARCH(1,1)在等式右边多了一项β * σ_{t-1}²。这一项代表了上一期的条件方差本身对当期条件方差的影响。这带来了革命性的改进用更少的参数捕捉更长的记忆GARCH(1,1)模型只有三个参数ω, α, β但其动态特性极其丰富。它可以等价于一个无限阶的ARCH模型。系数α衡量了“新息”的影响市场对最新消息的反应速度被称为“ARCH项”系数β衡量了“持久性”或“记忆性”波动率自身的持续程度被称为“GARCH项”。更符合金融事实金融市场的波动性不仅受到昨日突发新闻ε_{t-1}²的影响更受到其自身惯性的驱动。高波动时期有持续下去的倾向β系数正是刻画这种持续性的关键。通常在股票市场数据的拟合中β的值例如0.9远大于α的值例如0.05这说明波动率的主要驱动力是其自身的持续性而非单一的外部冲击。参数约束更易满足为了保证方差为正且过程平稳GARCH(1,1)的要求是ω 0α ≥ 0β ≥ 0 且α β 1。α β的值越接近1表明波动率冲击衰减得越慢记忆性越长。注意α β的持久性。如果α β 1模型退化为IGARCH积分GARCH意味着冲击对波动率的影响是永久的这通常对应着极端不稳定的市场。如果α β 1则过程非平稳理论上条件方差会爆炸这在实际拟合中几乎不会出现如果出现则说明模型设定可能有问题。4. 从理论到实践GARCH模型建模全流程详解理解了原理我们来看如何动手建立一个GARCH模型。这里以分析某股票指数的日收益率序列为例使用Python的arch库一个专门为ARCH类模型设计的优秀库进行演示。整个过程可以分为数据准备、均值模型确定、波动率模型拟合、诊断检验和预测五个步骤。4.1 数据准备与初步检验首先我们需要获取收益率数据。通常使用对数收益率因为它具有更好的统计性质近似连续复利且更容易满足平稳性假设。import pandas as pd import numpy as np import yfinance as yf from arch import arch_model import matplotlib.pyplot as plt # 1. 下载数据例如标普500指数 sp500 yf.download(^GSPC, start2010-01-01, end2023-12-31) # 2. 计算日对数收益率 sp500[Returns] 100 * np.log(sp500[Adj Close] / sp500[Adj Close].shift(1)) returns sp500[Returns].dropna() # 3. 绘制收益率序列图 plt.figure(figsize(12,6)) plt.plot(returns.index, returns.values) plt.title(SP 500 Daily Log Returns (%)) plt.ylabel(Return) plt.grid(True) plt.show() # 4. 观察波动率聚集现象绘制收益率平方或绝对值 plt.figure(figsize(12,6)) plt.plot(returns.index, returns.values**2) # 或使用 np.abs(returns) plt.title(Squared Returns (Proxy for Volatility)) plt.ylabel(Squared Return) plt.grid(True) plt.show()通过观察“收益率平方”图你可以清晰地看到波动率的聚集在某些年份如2020年初波动剧烈且持续而在另一些年份波动则平缓得多。这是存在条件异方差的直观证据。4.2 均值模型设定与ARCH效应检验在拟合GARCH模型前我们需要确定均值方程的形式并正式检验残差是否存在ARCH效应。均值方程对于日收益率序列其自相关性通常很弱。我们可以先拟合一个简单的常数均值模型或者使用AIC/BIC准则判断是否需要加入AR项。这里为了简化假设均值为常数。ARCH效应检验最常用的方法是Ljung-Box检验针对残差平方序列。原假设是序列不存在自相关即不存在ARCH效应。如果p值很小如0.05则拒绝原假设认为存在ARCH效应适合使用GARCH建模。from statsmodels.stats.diagnostic import acorr_ljungbox # 假设均值方程为常数残差就是收益率减去其均值这里接近0 residuals returns - returns.mean() # 对残差平方进行Ljung-Box检验查看前10阶的自相关性 lb_test acorr_ljungbox(residuals**2, lags[10], return_dfTrue) print(lb_test) # 如果lb_stat的p值‘lb_pvalue’很小例如小于0.05则表明存在ARCH效应。4.3 GARCH模型拟合与参数解读确认存在ARCH效应后我们就可以使用arch库来拟合GARCH(1,1)模型。# 使用arch库拟合GARCH(1,1)模型均值设为常数‘constant’ model arch_model(returns, meanConstant, volGARCH, p1, q1) # distskewt 可以允许残差分布具有偏态和厚尾特性更符合金融数据这里先用默认正态分布 result model.fit(update_freq5, dispoff) # update_freq控制迭代信息输出频率 print(result.summary())查看输出结果你需要重点关注以下几部分均值方程参数mu通常很小且可能不显著这很正常。方差方程参数omega长期平均波动率水平。很小但必须为正。alpha[1]ARCH项系数。代表“新息”的影响。一般在0.05到0.1之间。beta[1]GARCH项系数。代表波动的持续性。在股市中通常很高在0.85到0.95之间。检查alpha[1] beta[1]。这个值非常接近1如0.99说明波动冲击衰减很慢具有长记忆性。信息准则AIC和BIC用于不同模型之间的比较值越小越好。4.4 模型诊断我们拟合得好吗拟合完模型不能直接就用必须进行诊断检验看模型是否充分捕捉了数据特征。标准化残差检验计算标准化残差z_t ε_t / σ_t。如果模型设定正确z_t应该近似为一个独立同分布的标准正态或你设定的其他分布序列。独立性检验再次对标准化残差及其平方做Ljung-Box检验。此时p值应该较大0.05表明不再存在显著的自相关和ARCH效应。如果还存在说明当前的GARCH(p,q)阶数可能不足。正态性检验使用Jarque-Bera检验或绘制QQ图。金融数据的标准化残差通常仍具有厚尾特征所以常选用学生t分布或偏t分布来拟合。绘制条件波动率将模型估计出的条件波动率σ_t画出来直观感受模型捕捉到的波动率变化。# 绘制条件波动率年化假设一年252个交易日 conditional_vol result.conditional_volatility annualized_vol conditional_vol * np.sqrt(252) plt.figure(figsize(12,6)) plt.plot(returns.index, annualized_vol) plt.title(Estimated Conditional Volatility (Annualized) from GARCH(1,1)) plt.ylabel(Volatility) plt.grid(True) plt.show() # 提取标准化残差 std_resid result.resid / result.conditional_volatility # 对标准化残差平方进行ARCH效应检验 lb_test_std acorr_ljungbox(std_resid**2, lags[10], return_dfTrue) print(\n标准化残差平方的Ljung-Box检验应无ARCH效应:) print(lb_test_std) # 理想的p值应大于0.054.5 波动率预测GARCH模型的一个重要应用是进行波动率预测。由于方差方程是递归定义的我们可以进行多期预测。# 进行未来5期的波动率预测 forecast_horizon 5 forecasts result.forecast(horizonforecast_horizon, reindexFalse) # 打印未来5天的条件方差预测值 print(forecasts.variance.iloc[-1:]) # 通常我们更关注波动率标准差 future_vol np.sqrt(forecasts.variance.iloc[-1].values) print(f未来{forecast_horizon}天的条件波动率预测: {future_vol})GARCH模型的预测有一个特点对于长期预测比如几十期以后条件波动率会逐渐收敛到一个无条件波动率水平其计算公式为σ_long_run² ω / (1 - α - β)。这个长期波动率水平是一个重要的参考基准。5. 超越基础GARCH常见变体模型与应用场景基础的GARCH(1,1)虽然强大但金融市场的复杂性催生了一系列改进模型。了解这些变体能让你在面对不同数据特征时做出更合适的选择。5.1 非对称GARCH模型TGARCH/EGARCH基础GARCH模型假设正负冲击对波动率的影响是对称的。但现实中“坏消息”价格下跌往往比“好消息”价格上涨引发更大的波动这被称为“杠杆效应”。为了捕捉这种非对称性学者们提出了TGARCH (Threshold GARCH) 或 GJR-GARCH它在方差方程中引入一个虚拟变量。当ε_{t-1} 0负冲击时该变量为1否则为0。这样负冲击的系数就变成了(α γ)如果γ 0则证明存在杠杆效应。方差方程示例σ_t² ω α * ε_{t-1}² γ * I_{t-1} * ε_{t-1}² β * σ_{t-1}²其中I_{t-1}1 if ε_{t-1}0 else 0。EGARCH (Exponential GARCH)由Nelson提出。它有两个显著优点(1) 对方程取对数无需对参数施加非负约束(2) 直接建模了冲击大小和符号的影响。方差方程示例对数形式ln(σ_t²) ω α * (|z_{t-1}| - E|z_{t-1}|) γ * z_{t-1} β * ln(σ_{t-1}²)这里的γ衡量非对称效应。如果γ 0则负的z_{t-1}即ε_{t-1} 0会对ln(σ_t²)产生更大的正向影响表明存在杠杆效应。在arch库中可以轻松指定这些模型# 拟合TGARCH(1,1,1)模型其中第三个‘1’代表非对称项的阶数 tgarch_model arch_model(returns, meanConstant, volGARCH, p1, q1, o1) # o1 即包含非对称项 tgarch_result tgarch_model.fit(update_freq5, dispoff) print(tgarch_result.summary()) # 查看参数 ‘gamma[1]‘如果显著为正则存在杠杆效应。 # 拟合EGARCH(1,1)模型 egarch_model arch_model(returns, meanConstant, volEGARCH, p1, q1) egarch_result egarch_model.fit(update_freq5, dispoff) print(egarch_result.summary())5.2 分布假设的拓展从正态分布到学生t分布我们一直假设标准化扰动z_t服从标准正态分布。但金融数据的实际分布通常表现出“尖峰厚尾”特征即极端事件发生的概率远高于正态分布的预测。使用正态分布假设会低估极端风险。因此更常见的做法是假设z_t服从标准化的学生t分布。t分布有一个额外的参数“自由度”nu自由度越小尾部越厚。在arch库中只需在模型设定时更改dist参数# 使用学生t分布拟合GARCH(1,1) model_t arch_model(returns, meanConstant, volGARCH, p1, q1, distStudentsT) result_t model_t.fit(update_freq5, dispoff) print(result_t.summary()) # 在结果中会看到 ‘nu‘ 参数它表示自由度。通常股市数据的 ‘nu‘ 在3到6之间显著小于正态分布正态分布可视为自由度无穷大的t分布。5.3 GARCH模型在数学建模竞赛中的典型应用思路在国赛、美赛等数学建模竞赛中GARCH家族模型是处理金融、经济类时间序列问题的利器。其应用场景和建模思路通常如下风险度量VaR计算这是最直接的应用。在估计出条件波动率σ_t和确定了z_t的分布如t分布后可以动态计算在险价值Value at Risk, VaR。例如t时刻对于置信水平c如95%下一期的VaR预测为VaR_{t1} μ - σ_{t1} * t_{ν}^{-1}(1-c)其中t_{ν}^{-1}是自由度为ν的t分布的分位数函数。这比使用历史模拟法或移动平均法计算的静态VaR更加灵敏和准确。资产定价与波动率溢出研究多个市场如A股和港股或多个资产如股票和债券之间的波动率联动关系。可以使用多元GARCH模型如DCC-GARCH动态条件相关GARCH来估计时变的相关性矩阵从而分析波动率是如何从一个市场传导到另一个市场的。事件研究研究某个特定事件如央行加息、公司财报发布对市场波动率的影响。可以在GARCH模型的均值方程或方差方程中加入虚拟变量事件发生日为1其余为0检验该变量的系数是否显著从而判断事件是否显著改变了市场的波动水平。波动率预测作为输入变量将GARCH模型预测得到的波动率作为另一个模型的解释变量。例如在研究“波动率对股票收益率预测的影响”或“波动率对宏观经济变量的影响”时GARCH提供的时变波动率就是一个理想的高频代理变量。6. 实操中的陷阱与心得来自多次踩坑的经验理论很美好但把GARCH模型用对、用好还需要注意很多细节。下面是我在研究和项目中总结的一些关键点。6.1 数据频率与平稳性处理数据频率选择GARCH模型对高频数据日度、日内效果最好因为能清晰捕捉波动率聚集。对于月度或季度数据波动率聚集现象不明显可能不需要复杂的GARCH模型。对于超高频数据如分笔数据则需考虑已实现波动率Realized Volatility等其他模型。收益率平稳性这是建模的前提。虽然收益率序列通常可以认为是平稳的但仍需进行ADF检验确认。绝对价格序列是非平稳的绝对不能直接对其建立GARCH模型必须先转化为收益率。异常值与结构突变金融危机、政策巨变等会导致波动率水平发生永久性改变结构突变。如果数据包含多个制度时期用一个单一的GARCH模型拟合整个样本可能效果很差。此时需要考虑马尔可夫区制转换GARCHMS-GARCH模型或者将样本分段建模。6.2 模型设定与估计的坑均值方程不能忽视虽然我们关注波动率但一个错误的均值方程设定会导致残差ε_t估计有偏进而污染方差方程的估计。务必通过ACF/PACF图或信息准则AIC/BIC为收益率序列确定一个合适的ARMA均值模型。对于有明显趋势或季节性的序列如能源价格更需小心。分布选择至关重要如前所述默认使用正态分布通常是个糟糕的选择。务必尝试学生t分布、偏t分布Skewed Student‘s t甚至广义误差分布GED。通过比较模型的对数似然值Log Likelihood越大越好和信息准则AIC/BIC越小越好来选择最优分布。画一下标准化残差的QQ图与理论分布对比是最直观的方法。收敛性问题GARCH模型的参数估计采用最大似然法有时可能不收敛或收敛到局部最优解。可以尝试提供不同的初始参数值。换用不同的优化算法如‘BFGS‘, ‘NM‘等在arch库的fit方法中通过options参数指定。简化模型比如先拟合ARCH(1)或GARCH(1,1)再用其结果作为更复杂模型的初始值。6.3 诊断检验不要只看汇总报告result.summary()给出的参数显著性只是第一步。必须进行严格的样本外诊断。标准化残差检验是底线如果标准化残差平方还存在自相关说明当前的GARCH(p,q)阶数不足以吸收所有的波动率聚类需要增加p或q或考虑更复杂的模型如APARCH。预测能力评估将样本分为训练集和测试集。用训练集估计模型预测测试集的波动率然后与测试集的真实波动率代理如已实现波动率或平方收益率进行比较。使用MSE、QLIKE等损失函数来评估不同模型的预测精度。在样本内拟合得好不代表样本外预测一定好。警惕“过度拟合”盲目增加GARCH的阶数(p, q)或添加过多解释变量到方差方程可能会在样本内获得很高的似然值但样本外预测能力急剧下降。始终用信息准则和样本外测试来约束模型复杂度。6.4 在数学建模论文中如何优雅地呈现如果你在数学建模论文中使用GARCH模型以下几点能让你的作品更出彩清晰的建模动机在模型介绍部分先用图示展示收益率序列的“波动率聚集”现象然后简要说明传统同方差假设的不足自然引出ARCH/GARCH模型。引用Engle(1982)和Bollerslev(1986)的原始论文是加分项。完整的建模流程图绘制一个从“数据预处理平稳性检验” → “均值模型识别ARMA” → “ARCH效应检验LB检验” → “GARCH模型拟合与分布选择” → “模型诊断标准化残差检验” → “应用如VaR计算”的完整流程图。详尽的诊断结果展示不要只贴一个参数估计表。把标准化残差的QQ图、残差平方的自相关图ACF放在论文里并附上说明“如图X所示经GARCH-t模型拟合后标准化残差已无显著自相关且其分布与理论t分布基本吻合表明模型设定充分。”对比分析至少对比三个模型GARCH-Normal, GARCH-t, TGARCH-t。用一张表格汇总它们的参数估计值、对数似然值、AIC/BIC以及样本外预测误差。然后基于这些客观指标结合经济含义如是否存在杠杆效应论证你最终选择的模型为何是最优的。将结果转化为直观结论不要只说“我们估计出了参数α0.08 β0.91”。要解释“我们的模型显示波动率的持续性非常高αβ0.99这意味着市场冲击的影响会持续很长时间。同时TGARCH模型中的非对称系数γ显著为正证实了‘杠杆效应’的存在即坏消息比好消息对市场波动的冲击更大。” 这样的结论才有洞察力。GARCH模型是一个强大而灵活的工具箱但它不是“一键万能”的魔法。理解其背后的经济直觉和统计原理谨慎地执行从数据准备到模型诊断的每一步并合理解读结果才能真正让这个经典模型为你的数据分析和建模工作提供坚实的支持。从我个人的经验来看成功应用GARCH模型的关键往往不在于写出最复杂的代码而在于对数据特征的深刻洞察和模型局限性的清醒认识。
返回列表