☰
动态预测波动率:ARCH与Heston模型组合实战指南
2026/10/27 2:59:34 网站建设 项目流程

做量化研究这些年,被问得最多的问题之一就是"波动率到底怎么预测才靠谱"。很多人一上来就搬出GARCH家族,跑个模型出个图,觉得完事了;也有人迷信Heston那套随机波动率框架,觉得带跳跃、带均值回归才够"高级"。但真到了实盘或者回测环节,两种模型给出的结果经常打架,甚至方向都相反。这篇就聊聊我在这两个模型之间反复横跳、踩坑、最后形成自己一套组合打法的完整过程。核心关键词是动态预测波动率、ARCH模型和Heston模型,适合有一定统计基础、正在做波动率建模或者准备把波动率预测接入策略的从业者参考,小白也能看懂大框架,因为我会尽量用生活化的类比把原理掰开。

先说清楚这两个模型各自解决什么问题。ARCH(Autoregressive Conditional Heteroskedasticity,自回归条件异方差)的核心思想特别朴素:今天的波动率受昨天波动率的影响,大波动后面往往跟着大波动,小波动后面跟着小波动,这叫波动率聚集。Heston模型则更进一步,它认为波动率本身也是一个随机过程,有自己的随机扰动项,并且波动率会向长期均值回归,同时还允许波动率和资产价格之间存在相关性。打个比方,ARCH像是看一个人昨天脾气大不大来猜他今天脾气大不大;Heston则是给这个人的情绪建了一个完整的动力学方程,考虑情绪的自然回落、外界刺激的随机冲击,以及情绪和行为的联动。两者没有绝对优劣,关键看你拿波动率去干什么。

1. 为什么波动率预测这件事不能只跑一个模型

我最早做波动率预测的时候,思路特别直线:数据扔进GARCH(1,1),AIC选个最优阶数,预测出未来N期的条件方差,直接拿去用。前几个月回测曲线还挺好看,后来遇到一段市场剧烈震荡的行情,模型预测的波动率明显滞后,等它反应过来,仓位已经被打穿了。那次之后我才认真去想:波动率预测的误差到底来自哪里。

拆开来看,误差至少有三个来源。第一是模型设定误差,ARCH族假设波动率是过去残差平方的确定性函数,这个假设在平稳期够用,但在结构突变时就会失灵。第二是参数估计误差,样本窗口选多长、用日频还是高频、要不要加外生变量,每一个选择都会让参数漂移。第三是预测目标本身的定义,你要预测的是未来一天的条件方差,还是未来一个月的已实现波动率?这两个目标对应的模型和评估方式完全不同。很多人把这三层混在一起,模型跑出来效果不好就换模型,换了一圈还是不好,其实是目标没对齐。

Heston模型吸引我的地方,恰恰是它在结构突变时的表现更"有弹性"。因为它把波动率建模成一个均值回归的随机过程,当市场从低波动突然跳到高波动时,均值回归项会提供一个拉力,同时随机项允许波动率继续发散,这种"拉而不死"的特性在震荡市里比GARCH的机械外推更合理。但Heston的代价是参数多、校准难,尤其是相关性参数和波动率的波动率,用不同方法校准出来的结果能差出一大截。

所以我的结论是:不要指望单一模型包打天下。ARCH族适合做短周期、高频更新的条件方差预测,计算快、参数少、可解释性强;Heston适合做中长周期、需要考虑波动率微笑和期权定价的场景,结构更完整但校准成本高。真正实用的做法是让两者互为参照,甚至做模型组合。下面几节我会把两条路线分别拆透,再讲怎么把它们拼起来用。

1.1 两个模型在预测目标上的根本分歧

这里必须把一件事讲透,否则后面所有操作都是空中楼阁。ARCH模型预测的是条件方差,也就是给定今天所有信息,明天收益率的方差是多少。它是一个条件矩的概念,天然对应"下一期"这个时间尺度。你拿GARCH去预测未来30天的波动率,严格来说是在做多步外推,误差会随步长快速累积。

Heston模型预测的是瞬时方差过程的演化路径,它给出的是一条方差随时间的期望轨迹,天然适合做期限结构。也就是说,如果你关心的是未来一周、一个月甚至一个季度的波动率曲面,Heston的框架更自然;如果你只关心明天或者下一小时的波动率,GARCH族更直接。

这个分歧直接决定了评估方式。评估ARCH预测,我通常用MSE或者QLIKE损失,对比预测条件方差和实际 squared return;评估Heston,除了看方差路径,还要看它隐含的波动率微笑能不能拟合市场报价。用同一套指标去比较两个模型,本身就是方法论错误。我见过有人拿Heston的方差路径去和GARCH的单点预测算MSE,然后得出"Heston不如GARCH"的结论,这种比较没有意义。

1.2 数据频率和采样窗口的隐性影响

还有一个特别容易被忽略的点:数据频率。ARCH族用日频收益率是标配,但如果你有分钟级数据,用已实现波动率(Realized Volatility)作为观测值去建模,效果会比直接用日收益率平方好很多,因为后者是极其嘈杂的波动率代理变量。我做过对比,同一段样本,用日收益率平方做GARCH的观测,和用5分钟数据聚合的已实现波动率做观测,后者预测的QLIKE损失平均低20%到30%。

Heston的校准则更依赖数据质量。它需要的是期权隐含波动率曲面或者高频已实现方差序列,日频收盘价信息量不够。如果你只有日频数据,Heston的参数校准会非常不稳定,尤其是均值回归速度和波动率的波动率这两个参数,经常出现多组参数拟合效果差不多的情况,这叫参数识别问题。我的经验是,日频数据下不要硬上Heston,先把ARCH族吃透;有期权数据或者高频数据再考虑Heston。

采样窗口同样关键。GARCH的样本窗口太短,参数估计方差大;太长,又会把结构突变前的旧信息带进来。我一般用滚动窗口,长度在500到1000个交易日之间做敏感性测试,看参数稳定性。Heston的校准窗口更讲究,通常用最近30到60个交易日的期权截面数据,太长的窗口会让微笑形状变化被平均掉。

2. ARCH族模型的实操拆解:从定阶到预测的完整链路

这一节把ARCH族的操作链路走一遍。我用的是Python,statsmodels和arch包都能做,arch包对GARCH族的支持更全,包括GJR-GARCH、EGARCH这些非对称变体。先给结论:大多数场景下GARCH(1,1)就够用,不要过度追求高阶模型。我试过GARCH(2,2)、GARCH(3,1)这些,样本外表现和GARCH(1,1)的差异在统计上不显著,但参数估计的方差明显变大,得不偿失。

先看数据准备。收益率序列要先做平稳性检验,ADF检验是标配,但更重要的是看序列是否存在明显的结构突变。我习惯画滚动窗口的均值和方差图,肉眼先扫一遍。如果中间有明显的断点,比如某段时期方差整体抬升,直接全样本建模会把断点前后的信息混在一起。处理方式有两种:一是分段建模,二是加虚拟变量。我倾向于分段,因为GARCH的参数在断点前后往往真的不一样。

定阶这块,ACF和PACF对残差平方的图要看,但别迷信。更实用的做法是直接拟合GARCH(1,1),然后对标准化残差做Ljung-Box检验,看还有没有残余的自相关。如果p值很小,说明模型没吃干净,再考虑加阶或者换非对称变体。我踩过的一个坑是:标准化残差通过了Ljung-Box,但残差平方的ACF还有拖尾,这时候问题往往出在分布假设上,正态分布不够,换成t分布或者偏t分布通常能解决。

import numpy as np import pandas as pd from arch import arch_model # 假设 returns 是日收益率序列(已乘以100,数值稳定性更好) returns = returns * 100 # 拟合GARCH(1,1),均值方程用常数,分布用偏t model = arch_model(returns, vol='Garch', p=1, q=1, mean='Constant', dist='skewt') res = model.fit(disp='off') # 查看参数 print(res.summary()) # 标准化残差诊断 std_resid = res.resid / res.conditional_volatility from statsmodels.stats.diagnostic import acorr_ljungbox lb = acorr_ljungbox(std_resid**2, lags=[10, 20], return_df=True) print(lb)

这段代码里有两个细节值得说。第一,收益率乘以100是为了数值稳定性,GARCH的优化器对量纲敏感,收益率在0.01量级时经常出现收敛问题,放大到1量级就稳了。第二,分布选偏t而不是正态,是因为金融收益率有明显的尖峰厚尾和左偏,正态假设会低估极端风险。这个选择对VaR计算的影响特别大,我做过对比,正态假设下99% VaR的突破次数明显高于理论值,换成偏t后接近名义水平。

2.1 非对称变体的选择:GJR还是EGARCH

杠杆效应是波动率建模绕不开的:坏消息带来的波动率上升往往比好消息更猛。GARCH(1,1)是对称的,处理不了这个。两个主流变体是GJR-GARCH和EGARCH。GJR的做法是在方差方程里加一个示性项,当残差为负时额外增加一项;EGARCH则是对对数方差建模,天然允许非对称,而且不要求参数为正。

我的实测结论是:股票类资产用GJR-GARCH,指数类用EGARCH都可以,差异不大;但外汇和部分商品,杠杆效应不明显,对称GARCH反而更稳。GJR的参数更好解释,那个示性项系数直接度量了负向冲击的额外影响;EGARCH的优点是预测的方差永远为正,不需要参数约束,但它的对数结构让多步预测的解析式更复杂。

选哪个不要拍脑袋,做个简单的样本外对比就行。用滚动窗口,每次用前N期拟合,预测下一期,记录QLIKE损失,跑完整个样本看平均损失。我一般会同时跑对称GARCH、GJR、EGARCH三个,选损失最小的,但也会看参数稳定性,如果某个模型参数在滚动窗口里剧烈跳动,即使损失略小我也不用。

2.2 多步预测的衰减问题和修正

GARCH的多步预测有个特点:随着预测步长增加,预测方差会收敛到无条件方差。这是均值回归的体现,本身没错,但收敛速度取决于参数。如果α+β接近1(高持续性),收敛很慢,长步长预测基本就是无条件方差,信息量很低。这时候拿它去做一个月的波动率预测,效果可想而知。

我的处理方式是:短步长用GARCH解析预测,长步长改用已实现波动率的直接建模或者Heston。具体分界点看资产,流动性好的股指一般5个交易日以内用GARCH,超过就换方法。另外,多步预测的置信区间也要看,GARCH多步预测的方差本身也有不确定性,参数估计误差会传导进去,我通常用bootstrap做参数重抽样,给出预测的分布而不是单点。

还有一个实操细节:预测出来的条件方差要还原量纲。前面乘了100,方差是乘了10000,开方得到波动率后要除以100。这个换算看着简单,但我在代码里见过不止一次忘记还原导致风控阈值设错的案例。

3. Heston模型的校准难点与我的绕坑方案

Heston模型的完整形式包含五个参数:均值回归速度κ、长期方差θ、波动率的波动率σ、相关系数ρ、初始方差v0。资产价格和方差各有一个随机微分方程,方差过程是CIR过程,保证方差非负(在满足Feller条件时严格正)。理论很漂亮,但一到校准就头疼。

最大的坑是参数识别。用期权隐含波动率曲面校准时,不同的(κ, σ)组合可以产生几乎相同的微笑形状,这叫参数的不敏感性。我最早用全参数自由优化,结果每次校准出来的κ能从1跳到10,完全没有稳定性。后来改成固定部分参数、只优化关键参数,稳定性才好起来。

我的做法分两步。第一步,用时间序列数据(比如高频已实现方差)先估计v0和θ,这两个参数相对好识别,v0就是当前方差水平,θ是长期均值,用历史方差的长期平均做初值。第二步,固定v0和θ,用期权数据优化κ、σ、ρ三个参数。即使这样,κ和σ仍然有 trade-off,我的经验是给κ加一个合理的下界,比如不低于0.5,因为均值回归速度太快在经济上不合理,同时给σ加上界,避免优化器跑到极端值。

import numpy as np from scipy.optimize import minimize def heston_char_func(u, S0, v0, kappa, theta, sigma, rho, tau, r): # Heston特征函数(简化版,用于期权定价) d = np.sqrt((rho*sigma*1j*u - kappa)**2 + sigma**2*(1j*u + u**2)) g = (kappa - rho*sigma*1j*u - d) / (kappa - rho*sigma*1j*u + d) C = (r*1j*u*tau + (kappa*theta/sigma**2) * ((kappa - rho*sigma*1j*u - d)*tau - 2*np.log((1 - g*np.exp(-d*tau))/(1 - g)))) D = ((kappa - rho*sigma*1j*u - d)/sigma**2) * ((1 - np.exp(-d*tau))/(1 - g*np.exp(-d*tau))) return np.exp(C + D*v0 + 1j*u*np.log(S0)) def calibration_loss(params, market_ivs, strikes, maturities, S0, r, v0_fixed, theta_fixed): kappa, sigma, rho = params # 这里省略具体的期权定价和IV反解过程 # 核心是用特征函数做傅里叶变换得到期权价格,再反解隐含波动率 model_ivs = price_to_iv(heston_char_func, kappa, theta_fixed, sigma, rho, v0_fixed, ...) return np.mean((model_ivs - market_ivs)**2) # 带边界的优化 bounds = [(0.5, 10.0), (0.01, 2.0), (-0.99, 0.0)] result = minimize(calibration_loss, x0=[2.0, 0.5, -0.7], args=(...), bounds=bounds, method='L-BFGS-B')

这段代码的关键不在特征函数本身,而在边界设置。κ的下界0.5、σ的上界2.0、ρ限定在负值区间(股票类资产通常为负),这些边界不是随便定的,是基于经济含义和历史校准经验。没有边界约束,优化器十有八九会跑到不合理的区域。另外,目标函数用隐含波动率的均方误差而不是期权价格的均方误差,是因为价格对深度实值和虚值期权不敏感,IV空间里的误差更均衡。

3.1 用高频已实现方差辅助校准

纯期权校准的另一个问题是数据依赖。不是所有标的都有活跃的期权链,尤其是一些商品和个股。这时候高频已实现方差就是救兵。已实现方差是日内高频收益率平方和,是方差的一致估计量,虽然受微观结构噪声影响,但做日频聚合后质量不错。

我的流程是:先用已实现方差序列估计Heston的方差过程参数。具体做法是把已实现方差当作方差过程的观测,用拟最大似然或者矩估计先粗估κ、θ、σ,v0取最近几天的已实现方差均值。然后如果有期权数据,再用期权数据精调ρ和整体拟合。没有期权数据,ρ可以用收益率和方差变化的样本相关系数近似,虽然这个近似有偏,但比瞎猜强。

这里有个细节:已实现方差和Heston模型里的瞬时方差不是一回事,前者是区间积分方差的估计,后者是瞬时值。严格来说要用积分方差的期望去匹配,但日频尺度下两者差异不大,我一般直接用,误差可以接受。如果做日内级别的精细校准,就要考虑这个区别。

3.2 校准频率与参数平滑

Heston参数不是一成不变的,但也不能每天重校准,否则参数序列会非常嘈杂,拿去做策略会引入大量噪声。我的做法是每周校准一次,日间用插值或者简单的状态更新。具体来说,v0每天用最新的已实现方差更新,其他参数保持周度校准值,除非市场出现明显结构变化(比如波动率水平突破过去三个月的上下四分位),才触发临时重校准。

参数平滑也重要。我会对校准出来的参数序列做指数加权平滑,κ和σ的平滑系数取0.3左右,θ和ρ取0.5。平滑后的参数用于预测,原始参数留作诊断。这个做法牺牲了一点拟合精度,但换来了参数稳定性,实盘里稳定性比精度更值钱。

4. 把两个模型拼起来:组合预测的落地方法

单独用哪个模型都有短板,组合起来用才是正解。但组合不是简单平均,要有逻辑。我的组合框架分三层:短周期用ARCH,中长周期用Heston,中间做过渡和交叉验证。

具体来说,1到5个交易日的波动率预测,以GARCH族为主,权重给70%到80%,Heston给20%到30%,因为短周期GARCH的信息更新更快。5到20个交易日,两者权重接近各半。20个交易日以上,Heston为主,权重70%以上,因为它的期限结构更合理。这个权重不是拍脑袋,是我用滚动样本外测试,按不同预测步长分别优化出来的,不同资产类别会有差异,股票指数大概是这样,商品和外汇要重新调。

组合的方式我用的是对数方差空间的加权平均,而不是方差直接加权。原因是方差的正偏分布特性,直接加权容易被极端值主导,对数变换后更稳健。公式很简单:预测对数方差 = w * log(ARCH预测方差) + (1-w) * log(Heston预测方差),再取指数还原。这个做法在波动率组合预测的文献里也有支持,实测比直接加权稳。

4.1 用波动率风险溢价做交叉验证

两个模型给出不同预测时,怎么判断谁更可信?我的经验是看波动率风险溢价。隐含波动率减去模型预测的已实现波动率,就是风险溢价。如果Heston校准出来的隐含波动率和市场报价吻合,但它预测的已实现波动率明显低于GARCH的预测,而历史上这个溢价水平又处于高位,那说明Heston可能低估了未来的实际波动,这时候应该给GARCH更高权重。

这个交叉验证不需要复杂计算,就是把两个模型的预测和当前隐含波动率放一起看。我每周做一次这个检查,记录溢价的历史分位数,作为权重调整的参考。溢价处于极端分位时,模型组合的权重向预测更保守的那个倾斜。这个做法帮我躲过几次波动率突然放大的行情,因为单一模型在极端行情前往往会给出过于乐观的预测。

4.2 预测评估:别只看MSE

评估波动率预测,MSE是最常用的,但它对极端值太敏感,而且波动率本身不可直接观测,用收益率平方做代理噪声很大。我更常用的是QLIKE损失,它对低估的惩罚比高估更重,符合风控的实际需求。另外还会看Mincer-Zarnowitz回归,把实际波动率对预测波动率回归,看截距是否接近0、斜率是否接近1,这能诊断预测是否有系统偏差。

还有一个实用指标是VaR突破率。把预测波动率代入VaR计算,看实际突破次数是否接近名义水平。这个指标最贴近实盘,因为波动率预测最终是要服务于风险管理的。我一般要求99% VaR的突破率在0.5%到1.5%之间,超出这个范围就说明预测有问题,要回去查模型。

评估指标适用场景我的经验阈值
QLIKE损失模型间横向对比相对值,越低越好
MZ回归斜率诊断系统偏差0.8到1.2之间可接受
VaR突破率实盘风控验证99% VaR在0.5%到1.5%
预测自相关检查预测平滑度相邻预测相关系数不宜过高

表格里最后一项"预测自相关"是我自己加的检查。如果相邻两天的波动率预测高度相关(比如超过0.95),说明模型更新太慢,对市场新信息反应不足。这个检查能抓出参数过于平滑或者窗口过长的问题。

5. 几个让我交过学费的实操细节

讲几个具体的坑,都是真金白银换来的。第一个是收益率对齐问题。做多资产波动率预测时,不同市场的交易时段不同,收盘时间对不齐,直接合并会引入伪相关。我的处理是统一到同一个时间戳,用重叠时段的数据,或者用日频数据时明确标注每个市场的收盘时刻,做相关性分析时考虑时差。这个坑在做跨市场波动率传导时特别致命。

第二个是极端值的处理。GARCH对极端收益率非常敏感,一个涨停或者跌停就能把条件方差推得很高,然后花很长时间才回落。我的做法是对超过5倍标准差的收益率做缩尾处理(winsorize),但不是简单截断,而是用该日的已实现波动率替代,这样保留了"当天波动大"的信息,又避免了单点极端值主导参数。缩尾的比例要记录,回测时保持一致。

第三个是模型更新的触发条件。很多人要么每天重估,要么一个月才更新一次。我的做法是设定触发条件:当标准化残差超过3,或者连续5天的预测误差同号,就触发重估;否则按周度例行更新。这样既保证了模型对结构变化的响应,又避免了过度拟合噪声。

提示:所有参数和阈值都要在样本外验证,样本内调出来的漂亮参数,样本外经常翻车。我习惯留最后20%的数据完全不动,只在最终确认时用一次。

第四个细节是方差目标的定义要和用途匹配。如果你做期权对冲,需要的是风险中性测度下的波动率,Heston校准用的就是风险中性参数;如果你做仓位管理,需要的是真实测度下的波动率,GARCH更合适。这两个测度下的波动率水平不一样,混用会出大问题。我早期就犯过拿风险中性Heston参数去算仓位风险的错误,导致仓位偏保守,收益被拖累。

5.1 计算资源与实时性的权衡

Heston的校准计算量不小,尤其是用傅里叶变换做期权定价再反解IV,一次校准几百个期权合约,单机跑要几十秒到几分钟。如果要做日内的波动率预测,这个延迟不可接受。我的优化方案是:预计算特征函数的查表网格,把常用的参数区间离散化,校准时先查表再局部精调,速度能提升一个数量级。另外,期权数据做降采样,不用全部合约,按行权价和到期日分层抽样,保留50到100个代表性合约就够校准了。

ARCH族的计算量小得多,GARCH(1,1)拟合毫秒级,实时更新完全没问题。所以我的实时系统里,ARCH是主力,Heston是低频参考。这个分工在工程上很自然,也符合两个模型各自的特点。

5.2 参数不确定性的传导

最后一个想强调的点:波动率预测本身有不确定性,别把它当确定值用。GARCH的参数估计有标准误,Heston的校准有参数分布,这些不确定性会传导到预测上。我在做仓位管理时,不会只用点预测,而是用预测的分布,取一个保守分位数(比如75%分位)作为风险输入。这个做法会让仓位略保守,但避免了参数估计误差导致的系统性低估风险。

具体操作上,GARCH用bootstrap重抽样参数,生成预测分布;Heston用校准时的参数协方差矩阵做蒙特卡洛抽样。计算量增加不多,但对风控的意义很大。我对比过,用点预测和用75%分位预测,在极端行情下的最大回撤能差好几个百分点。

这套组合打法我用了挺长时间,中间根据市场变化调整过权重和触发条件,但框架没大变。核心体会就一句:波动率预测没有银弹,ARCH和Heston各有所长,把它们放在合适的周期和用途上,再用交叉验证和不确定性量化兜底,比死磕单一模型的参数优化实在得多。

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

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

立即咨询