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做精细化调整。这样既能快速上线,又能保证精度。

高频波动率建模流程 5分钟高频数据 计算已实现波动率(RV) HAR-RV模型 Realized GARCH RV预测值 条件方差 + RV预测 做市报价、风险对冲、期权定价

好了,这一章的内容就到这里。记住一句话:高频数据是金矿,但要用对工具才能挖到宝。HAR-RV和Realized GARCH,就是两把最趁手的铲子。