
汇率交易台上最容易被低估的一件事就是波动率本身也在波动。很多人第一次接触汇率数据看到的就是一条价格曲线涨涨跌跌似乎只要判断方向就够了。但真正做过外汇风控或者量化研究的人都知道方向只是表象波动率的聚集效应才是决定仓位、止损和期权定价的关键。我最早接触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_t0对波动率的提升大于正冲击也就是存在杠杆效应。γ的经济含义很直观γ的绝对值越大非对称性越强。我估计过的一段数据γ-0.12显著为负说明汇率贬值方向的波动率冲击比升值方向大12%左右。这个数字对期权定价和风险价值计算都有直接影响因为传统的对称模型会低估贬值方向的风险。EGARCH还有一个好处是它对参数没有非负约束优化起来更稳定。GARCH有时候会因为α或β接近零边界导致估计困难EGARCH基本不会遇到这个问题。但EGARCH也有代价对数变换让模型对极端值的敏感度降低如果数据里有超级异常值EGARCH的反应可能不如GARCH直接。3.3 EGARCH与GJR-GARCH的选型对比除了EGARCHGJR-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的非对称项在起作用值得保留。这个简单的可视化对比比看一堆统计量更直观也更容易向非技术背景的同事解释。