汇率波动率建模:从GARCH到EGARCH的实战指南
2026/9/19 6:34:59 网站建设 项目流程

汇率交易台上最容易被低估的一件事,就是波动率本身也在波动。很多人第一次接触汇率数据,看到的就是一条价格曲线,涨涨跌跌,似乎只要判断方向就够了。但真正做过外汇风控或者量化研究的人都知道,方向只是表象,波动率的聚集效应才是决定仓位、止损和期权定价的关键。我最早接触GARCH模型是在处理一段欧元兑美元的日频数据时,当时用简单的移动标准差去估计波动率,结果发现每次市场剧烈波动之后,模型给出的风险值总是慢半拍,等它反应过来,行情已经走完了。后来换成GARCH(1,1),拟合效果明显改善,但新的问题又出现了——杠杆效应完全捕捉不到,也就是汇率下跌时波动率放大、上涨时波动率收缩的这种不对称性,GARCH对此视而不见。这才有了从GARCH到EGARCH的演进需求。

这篇文章面向的是有一定统计学基础、正在做汇率波动率建模的从业者或者金融方向的研究生。我会把整个建模流程拆开,从数据获取与清洗、ARCH效应检验、GARCH模型定阶与估计,一直讲到EGARCH对非对称效应的处理,中间穿插我自己踩过的坑和参数调优的经验。你不需要是计量经济学博士,但最好对时间序列的基本概念有所了解,比如平稳性、自相关、条件异方差这些。读完之后,你应该能独立完成一套汇率波动率的建模流程,并且知道每个步骤背后的逻辑是什么,而不是机械地跑代码。

1. 汇率数据的前期处理与波动率特征识别

1.1 为什么汇率收益率比汇率价格更适合建模

拿到汇率数据的第一件事,不是急着往模型里塞,而是想清楚建模对象到底是什么。原始汇率价格序列,比如USD/CNY或者EUR/USD的每日收盘价,几乎可以肯定是不平稳的。价格序列存在趋势性和随机游走特征,直接对它建模会得到虚假回归的结果,R方很高但毫无意义。所以标准做法是取对数收益率:

r_t = ln(P_t / P_{t-1})

这里P_t是第t日的汇率价格。取对数而不是简单差分,原因有两个:一是对数收益率具有可加性,多期收益率等于各期之和,方便跨期聚合;二是对数变换能压缩极端值的量级,让分布更接近正态。我实测过,对EUR/USD日频数据,原始价格序列的ADF检验统计量在-1.5附近,根本无法拒绝单位根假设,但取对数收益率之后,ADF统计量直接跳到-30以下,平稳性非常显著。

还有一个细节值得注意:汇率数据和其他金融资产一样,存在交易日不连续的问题。周末和节假日没有交易,如果直接按日历日排列,会出现大量空值。我的处理方式是只保留有交易的日期,不做插值填充。插值会人为制造出低波动的假象,对后续波动率建模是致命的。另外,如果做的是高频数据,还要考虑不同时区的收盘时间差异,比如东京市场和纽约市场的收盘价对应的时刻不同,混在一起会引入微观结构噪声。

1.2 波动率聚集效应:从图形到统计检验

把对数收益率画成时序图,你会看到一种非常典型的模式:大幅波动后面跟着大幅波动,小幅波动后面跟着小幅波动。这就是波动率聚集效应,也是ARCH类模型存在的根本理由。我第一次看到这个图形的时候,直觉上觉得这不就是自相关吗?但用Ljung-Box检验去测收益率序列的自相关,往往不显著,说明收益率本身没有明显的线性自相关。真正有自相关的是收益率的平方或者绝对值。

具体操作上,我会做两步检验。第一步,对收益率序列做Ljung-Box检验,滞后阶数取10或者20,如果p值大于0.05,说明线性自相关不显著,可以排除ARMA结构。第二步,对收益率的平方做同样的Ljung-Box检验,如果p值极小,比如小于0.001,那就说明存在显著的ARCH效应,条件异方差是真实存在的。我处理过的一段英镑兑美元数据,收益率本身的Ljung-Box检验p值是0.32,但平方序列的p值小于1e-10,差距非常明显。

除了Ljung-Box,还可以用Engle的LM检验,也就是拉格朗日乘数检验,专门针对ARCH效应。这个检验的原假设是没有ARCH效应,如果拒绝原假设,就可以放心地往GARCH方向走。我一般两个检验都做,互相印证,避免单一检验的偶然性。

1.3 数据频率选择与样本区间的取舍

汇率数据有日内高频、日频、周频、月频多种选择。频率越高,数据量越大,但微观结构噪声也越严重。日频数据是波动率建模最常用的频率,兼顾了数据量和信噪比。如果做日内高频,比如5分钟或者1分钟数据,需要额外处理日内周期性模式,比如开盘和收盘时段的波动率明显高于盘中,这需要用周期调整或者引入日内虚拟变量。

样本区间的选择也很关键。汇率市场经历过多次 regime shift,比如重大货币政策调整、突发事件冲击等,不同区间的波动率特征可能完全不同。我的经验是,样本区间至少覆盖一个完整的市场周期,通常3到5年的日频数据比较合适。太短的话,模型参数估计不稳定;太长的话,早期数据可能和当前市场结构不匹配。如果确实需要长样本,可以考虑滚动窗口估计,或者引入结构突变检验,比如Bai-Perron检验,来识别断点。

还有一个实操中的坑:不同数据源的汇率报价方式可能不同,有的用直接标价法,有的用间接标价法。建模之前一定要统一口径,否则收益率的方向和量级都会出问题。我一般统一转换成直接标价法,也就是一单位外币等于多少本币,这样汇率上升代表本币贬值,符合大多数人的直觉。

2. GARCH模型的定阶、估计与诊断

2.1 GARCH(p,q)的阶数选择:不是越复杂越好

GARCH模型的核心思想是,条件方差不仅依赖于过去的残差平方,还依赖于过去的条件方差。GARCH(1,1)的形式是:

σ²_t = ω + α·ε²_{t-1} + β·σ²_{t-1}

其中ω是常数项,α是ARCH项系数,β是GARCH项系数。α衡量的是新信息对波动率的冲击,β衡量的是波动率的持续性。α+β越接近1,说明波动率冲击的衰减越慢,持续性越强。

很多人会问,p和q到底取多少合适?我的经验是,对于汇率日频数据,GARCH(1,1)在绝大多数情况下已经足够。我试过GARCH(2,1)、GARCH(1,2)、GARCH(2,2),AIC和BIC的改善非常有限,有时候甚至因为参数过多导致估计不收敛。GARCH(1,1)只有三个参数,估计稳定,解释性强,是性价比最高的选择。如果确实需要更高阶,建议先检查数据是否存在特殊的周期性或者结构突变,而不是盲目增加阶数。

定阶的正式方法可以看ACF和PACF of squared residuals,但说实话,在GARCH框架下这两个图往往不够清晰。更实用的做法是:从GARCH(1,1)开始,逐步增加p和q,比较AIC/BIC,同时检查参数显著性和残差诊断。如果高阶模型的参数不显著,或者残差诊断没有明显改善,就果断回到GARCH(1,1)。

2.2 参数估计:从最大似然到数值优化

GARCH模型的参数估计通常用最大似然估计(MLE)。假设残差服从正态分布,对数似然函数是:

LL = -0.5 · Σ [ln(2π) + ln(σ²_t) + ε²_t / σ²_t]

优化算法方面,我常用的是BFGS或者Nelder-Mead。BFGS收敛快,但对初值敏感;Nelder-Mead更稳健,但收敛慢。实际操作中,我会先用网格搜索找一组合理的初值,再用BFGS精细优化。初值的选择很重要,如果随便给,很容易陷入局部最优。我的经验初值是:ω取样本方差的0.1倍,α取0.1,β取0.8,这样α+β=0.9,接近但不超过1,符合大多数汇率数据的特征。

估计出来之后,必须检查参数约束:ω>0,α≥0,β≥0,α+β<1。如果α+β≥1,说明波动率冲击不衰减,模型不稳定,这时候要么数据有问题,要么需要换模型,比如IGARCH或者FIGARCH。我遇到过一次α+β=1.02的情况,后来发现是数据里有一段异常值没有处理,修正之后参数就正常了。

还有一个细节:标准误的计算。MLE的标准误基于Hessian矩阵,但如果模型设定有误,标准误可能不可靠。稳健标准误(robust standard errors)是更好的选择,很多软件包都支持。我一般会同时报告普通标准误和稳健标准误,如果差异很大,说明模型设定可能有问题。

2.3 残差诊断:模型跑通了不等于模型对了

参数估计出来,α和β都显著,α+β=0.95,看起来不错。但这不代表模型就是对的。残差诊断是必须做的。标准化的残差是:

z_t = ε_t / σ_t

如果模型正确,z_t应该是白噪声,没有自相关,也没有ARCH效应。我会对z_t做Ljung-Box检验,对z²_t做Engle的LM检验。如果z²_t还有显著的ARCH效应,说明GARCH(1,1)没有完全捕捉波动率动态,需要考虑更高阶或者非对称模型。

另外,还要检查z_t的分布。汇率收益率往往有厚尾特征,正态分布假设可能不成立。我一般会看z_t的偏度和峰度,如果峰度远大于3,说明厚尾严重。这时候可以考虑用t分布或者GED分布替代正态分布。我用t分布重新估计过一段数据,AIC改善了将近20个点,效果非常明显。t分布的自由度参数本身也有经济含义,自由度越小,尾部越厚,反映极端事件发生的概率越高。

还有一个容易被忽略的诊断:符号偏差检验。这个检验看的是正残差和负残差对波动率的影响是否对称。如果检验显著,说明存在杠杆效应,GARCH不够用,需要上EGARCH或者GJR-GARCH。我建议在GARCH阶段就把这个检验做了,不要等到发现拟合不好再回头。

3. EGARCH如何捕捉汇率波动的非对称性

3.1 杠杆效应的经济含义与统计表现

杠杆效应最早是在股票市场发现的:股价下跌时波动率上升的幅度大于股价上涨时波动率下降的幅度。汇率市场也有类似现象,但机制不完全一样。对于汇率,非对称性可能来源于央行干预、避险情绪、以及不同货币的利差交易平仓行为。比如,当风险事件发生时,资金往往涌向避险货币,导致汇率剧烈波动,而这种波动在贬值方向往往更剧烈。

统计上,杠杆效应表现为残差符号对条件方差的影响不对称。GARCH模型里,ε²_{t-1}不管正负,对σ²_t的影响是一样的,因为平方之后符号消失了。但现实中,负的冲击往往比正的冲击带来更大的波动率上升。EGARCH通过引入一个非对称项来解决这个问题。

检验杠杆效应的方法,我常用的是Engle-Ng符号偏差检验,或者直接看GARCH残差的符号偏差。如果检验显著,就说明GARCH不够,需要EGARCH。我处理过的一段日元兑美元数据,符号偏差检验的p值小于0.01,杠杆效应非常明显,换成EGARCH之后,残差诊断才通过。

3.2 EGARCH的模型形式与参数解读

EGARCH(p,q)的形式是:

ln(σ²_t) = ω + Σ β_i·ln(σ²_{t-i}) + Σ α_j·[|z_{t-j}| - E|z_{t-j}|] + Σ γ_j·z_{t-j}

其中z_t = ε_t / σ_t是标准化残差。关键变化有三个:一是对条件方差取对数,保证σ²_t永远为正,不需要对参数施加非负约束;二是引入了|z_{t-j}| - E|z_{t-j}|这一项,衡量的是冲击的绝对大小对波动率的影响;三是引入了γ_j·z_{t-j},这就是非对称项。如果γ<0,说明负冲击(z_t<0)对波动率的提升大于正冲击,也就是存在杠杆效应。

γ的经济含义很直观:γ的绝对值越大,非对称性越强。我估计过的一段数据,γ=-0.12,显著为负,说明汇率贬值方向的波动率冲击比升值方向大12%左右。这个数字对期权定价和风险价值计算都有直接影响,因为传统的对称模型会低估贬值方向的风险。

EGARCH还有一个好处是,它对参数没有非负约束,优化起来更稳定。GARCH有时候会因为α或β接近零边界导致估计困难,EGARCH基本不会遇到这个问题。但EGARCH也有代价:对数变换让模型对极端值的敏感度降低,如果数据里有超级异常值,EGARCH的反应可能不如GARCH直接。

3.3 EGARCH与GJR-GARCH的选型对比

除了EGARCH,GJR-GARCH也是处理非对称性的常用模型。GJR-GARCH的形式是:

σ²_t = ω + α·ε²_{t-1} + γ·ε²_{t-1}·I(ε_{t-1}<0) + β·σ²_{t-1}

其中I(·)是指示函数,当ε_{t-1}<0时取1,否则取0。如果γ>0,说明负冲击对波动率的影响更大。

EGARCH和GJR-GARCH的区别在于:EGARCH对波动率取对数,非对称性是指数级的;GJR-GARCH是线性的,非对称性是加性的。实际选型时,我会两个都估计,比较AIC/BIC和残差诊断。我的经验是,对于汇率数据,EGARCH往往拟合更好,因为汇率的波动率变化幅度较大,对数变换更合适。但如果样本量较小,GJR-GARCH的参数更容易估计,收敛更快。

还有一个实践中的考虑:如果后续要做波动率预测或者期权定价,EGARCH的预测公式更复杂,因为对数变换需要还原。GJR-GARCH的预测更直接。所以如果预测是主要目的,GJR-GARCH可能更实用。但如果重点是理解非对称性的结构和量级,EGARCH的解释性更强。

4. 模型验证、预测与实操中的坑

4.1 样本外预测评估:不要只看样本内拟合

模型估计完,样本内拟合好,不代表预测能力强。我见过太多人拿着样本内的R方或者AIC就下结论,结果样本外一塌糊涂。正确的做法是划分训练集和测试集,用滚动窗口或者扩展窗口做样本外预测,然后用损失函数评估,比如MSE、MAE,或者专门针对波动率的QLIKE损失函数。

QLIKE损失函数的优势是它对波动率的低估和高估惩罚不对称,更符合风险管理的要求。具体形式是:

QLIKE = (1/T)·Σ [σ²_t / h_t - ln(σ²_t / h_t) - 1]

其中σ²_t是实际波动率的代理变量,h_t是模型预测的条件方差。实际波动率通常用日内高频数据计算的已实现波动率(realized volatility)来代理,或者用收益率的平方作为粗略代理。我用已实现波动率做过对比,EGARCH的QLIKE损失比GARCH低15%左右,说明非对称性建模确实提升了预测精度。

滚动窗口的设置也有讲究。窗口太短,参数估计不稳定;窗口太长,模型无法适应市场结构变化。我的经验是,日频数据用500到1000个观测值的滚动窗口比较合适。如果市场波动剧烈,可以缩短到250个观测值,让模型更快适应。

4.2 波动率预测的期限结构与置信区间

GARCH和EGARCH都可以做多期预测。GARCH的预测公式是解析的,可以直接递推。EGARCH因为是对数形式,预测需要先预测ln(σ²_t),再取指数,但取指数之后是有偏的,需要做偏差修正。具体来说,如果ln(σ²_t)的预测是μ_t,方差是v_t,那么σ²_t的预测是exp(μ_t + v_t/2)。这个修正项很多人会忽略,导致预测偏低。

多期预测的期限结构也很有意思。GARCH的预测会随着期限增加收敛到无条件方差,收敛速度取决于α+β。α+β越接近1,收敛越慢,长期预测越接近当前水平。EGARCH的收敛速度类似,但因为对数变换,收敛路径可能更平滑。我做过一个对比,在α+β=0.98的情况下,GARCH需要大约100期才能收敛到无条件方差,而EGARCH只需要60期左右。

置信区间的计算也很重要。波动率预测本身是不确定的,给出点预测而不给区间,在实际风险管理中是不够的。我一般用bootstrap方法构造置信区间,重抽样残差,重新估计模型,重复1000次,取分位数。这个方法计算量大,但结果可靠。如果追求速度,可以用解析的渐近方差,但精度差一些。

4.3 实操中最容易踩的五个坑

第一个坑:忽略数据频率的一致性。有人用日频数据估计模型,然后用日内数据做验证,频率不匹配,结论完全不可比。一定要保证训练和验证的数据频率一致。

第二个坑:正态分布假设不检验。汇率收益率的厚尾特征非常普遍,直接用正态分布估计,参数会有偏,预测区间会过窄。我建议默认用t分布,然后检验自由度是否显著。

第三个坑:α+β接近1时不处理。如果α+β=0.99,说明波动率冲击几乎不衰减,这时候GARCH的预测会非常依赖初值,长期预测不可靠。可以考虑IGARCH或者FIGARCH,或者检查数据是否有结构突变。

第四个坑:样本外预测用固定窗口。市场结构在变,固定窗口的模型会逐渐失效。滚动窗口或者指数加权窗口更合适。

第五个坑:忽略交易成本和时间成本。波动率建模不是学术练习,最终要落到交易或者风控上。如果模型复杂度带来的精度提升不足以覆盖计算成本和执行成本,那就没必要上复杂模型。GARCH(1,1)在很多场景下已经够用,EGARCH是在非对称性显著时才值得上。

4.4 从建模到落地的完整流程回顾

把整个流程串起来:第一步,获取汇率数据,统一标价方式,取对数收益率,做平稳性检验。第二步,做Ljung-Box和LM检验,确认ARCH效应存在。第三步,估计GARCH(1,1),检查参数显著性和残差诊断。第四步,做符号偏差检验,如果显著,估计EGARCH,比较AIC/BIC和残差诊断。第五步,划分训练测试集,做样本外预测,用QLIKE评估。第六步,根据预测结果做风险管理或者交易决策。

每一步都有细节,每一步都可能出问题。我的建议是,不要跳过任何一步诊断,不要因为模型跑通了就认为模型对了。波动率建模是一个迭代的过程,数据在变,市场在变,模型也需要不断调整。我自己的习惯是每季度重新估计一次模型,检查参数是否稳定,残差诊断是否通过。如果参数漂移严重,就要考虑模型是否需要重新设定。

最后分享一个我常用的技巧:把GARCH和EGARCH的波动率预测画在一起,对比它们的差异。如果差异很小,说明非对称性不显著,用GARCH就够了;如果差异很大,尤其是在市场下跌期间,那就说明EGARCH的非对称项在起作用,值得保留。这个简单的可视化对比,比看一堆统计量更直观,也更容易向非技术背景的同事解释。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询