4. 高频波动率模型:Realized GARCH、HAR-RV模型
各位同学,欢迎来到第四章。前面我们聊了GARCH族模型,那些东西吧,说实话,在日频数据上挺好用。但一到了高频场景——比如5分钟K线——传统GARCH就有点力不从心了。为什么?因为信息量太大了,你一天有48个5分钟数据,传统GARCH根本吃不下这么多信息。
所以这一章,我们专门来解决一个问题:如何利用5分钟高频数据,构建更精准的波动率预测模型。我会重点讲两个模型:Realized GARCH和HAR-RV。这两个模型,我在做国债期货做市的时候,几乎天天用。
核心思想一句话:用高频数据计算已实现波动率(RV),再用RV去改进波动率建模。说白了,就是把“日内信息”塞进模型里。
4.1 已实现波动率(RV)——高频建模的基石
先说说RV是什么。很简单,假设一天有N个5分钟收益率,那么当天的已实现波动率就是这些收益率的平方和:
RV_t = sum(r_{t,i}^2) 其中 i = 1, 2, ..., N
这个指标的好处是——它是波动率的无偏估计量。你想想看,传统GARCH用日收益率来估计波动率,一天只有一个数据点,信息损失太大了。而RV用了所有日内数据,信息利用率高得多。
我在项目中遇到过一个问题:国债期货的5分钟数据有时候会有跳空,比如开盘跳空高开。这时候RV会偏大。我的处理方式是——剔除开盘后前5分钟的数据,或者用中位数调整。嗯,这里要注意,跳空处理不好,模型预测会差很多。
| 采样频率 | 每日样本数 | RV的稳定性 | 适用场景 |
|---|---|---|---|
| 1分钟 | 240 | 较低(噪声大) | 高频做市 |
| 5分钟 | 48 | 适中 | 日内波动率预测 |
| 15分钟 | 16 | 较高 | 日频波动率预测 |
我个人习惯用5分钟数据。为什么?1分钟噪声太大,15分钟又损失了太多日内信息。5分钟是个不错的平衡点。
4.2 HAR-RV模型——简单但有效
HAR-RV模型,全称是Heterogeneous Autoregressive model for Realized Volatility。名字挺长,但模型结构其实很简单。它假设不同时间频率的投资者行为不同,所以用日、周、月三个时间尺度的RV来预测明天的RV。
模型公式长这样:
RV_{t+1} = β0 + β1 * RV_t + β2 * RV_{t-5:t} + β3 * RV_{t-22:t} + ε_t
其中:
- RV_t:今天的已实现波动率
- RV_{t-5:t}:过去一周(5天)的平均RV
- RV_{t-22:t}:过去一个月(22天)的平均RV
你可能会问:就这么简单?对,就这么简单。但效果出奇的好。我在做国债期货做市的时候,HAR-RV模型在预测次日波动率方面,比很多复杂的深度学习模型都要稳定。
实战技巧:HAR-RV模型对异常值比较敏感。我建议在计算RV时,先做一下异常值处理——比如用3倍标准差剔除极端收益率。我曾经因为没做这一步,模型预测的波动率直接翻了两倍,差点把做市策略搞崩。
4.3 Realized GARCH——把RV塞进GARCH框架
HAR-RV虽然好,但它有个问题:它只预测RV本身,不预测条件方差。而Realized GARCH模型,把RV作为GARCH模型的额外信息变量,同时建模收益率和RV。
模型结构是这样的:
收益率方程:r_t = μ + ε_t, ε_t ~ N(0, h_t)
波动率方程:h_t = ω + α * ε_{t-1}^2 + β * h_{t-1} + γ * RV_{t-1}
测量方程:RV_t = ξ + φ * h_t + τ(z_t) + u_t
看到没?这里多了一个“测量方程”。它把RV和条件方差h_t联系起来。τ(z_t)是一个杠杆函数,用来捕捉正负收益率对波动率的不对称影响。
我个人觉得,Realized GARCH最大的优势是——它同时利用了高频信息和GARCH的时序结构。你想想看,传统GARCH只用日收益率,HAR-RV只用RV,而Realized GARCH两者都用,信息利用率最高。
注意:Realized GARCH的估计比普通GARCH复杂很多。因为多了测量方程,似然函数也更复杂。我建议用专业的优化库,比如Python的arch包或者自己写PyTorch优化。别想着用Excel,那玩意儿算不动。
4.4 Python实战:5分钟数据构建HAR-RV模型
好了,理论讲完了,我们直接上代码。下面是一个完整的HAR-RV模型实现,用国债期货的5分钟数据。
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
# 假设df是5分钟数据,包含'return'列
# 第一步:计算每日RV
df['return_sq'] = df['return'] ** 2
daily_rv = df.groupby(df.index.date)['return_sq'].sum()
daily_rv = daily_rv.rename('RV')
# 第二步:构建HAR特征
df_rv = pd.DataFrame(daily_rv)
df_rv['RV_lag1'] = df_rv['RV'].shift(1)
df_rv['RV_week'] = df_rv['RV'].rolling(5).mean().shift(1)
df_rv['RV_month'] = df_rv['RV'].rolling(22).mean().shift(1)
# 第三步:去掉缺失值,训练模型
df_model = df_rv.dropna()
X = df_model[['RV_lag1', 'RV_week', 'RV_month']]
y = df_model['RV']
model = LinearRegression()
model.fit(X, y)
# 输出系数
print('系数:', model.coef_)
print('截距:', model.intercept_)
print('R方:', model.score(X, y))
这段代码跑完之后,你会得到三个系数。一般来说,β1(日度)最大,β2(周度)次之,β3(月度)最小。这说明——短期波动对预测影响最大。我在国债期货上跑出来的结果,β1大概在0.4左右,β2在0.3左右,β3在0.1左右。
关键点:HAR-RV模型的R方通常在0.3-0.5之间。别觉得低,波动率预测本身就是个很难的问题。能解释30%的方差,已经比很多模型强了。
4.5 两个模型的对比与选择
最后,我做个对比总结。你该用哪个模型?
- 如果你只需要预测明天的RV,用HAR-RV。简单、稳定、可解释性强。
- 如果你需要完整的波动率动态模型(比如用于期权定价),用Realized GARCH。它提供了条件方差,信息更丰富。
- 如果你数据量小(比如只有几个月),用HAR-RV。Realized GARCH参数多,需要更多数据。
- 如果你做高频做市,两个模型都用。HAR-RV用于日内波动率预测,Realized GARCH用于风险度量。
我个人习惯是:先用HAR-RV快速搭建一个基线模型,然后再用Realized GARCH做精细化调整。这样既能快速上线,又能保证精度。
好了,这一章的内容就到这里。记住一句话:高频数据是金矿,但要用对工具才能挖到宝。HAR-RV和Realized GARCH,就是两把最趁手的铲子。