GARCH
· 6 min read
开发一个资产回报序列的波动率模型。你可以把它理解为“让我们通过分析资产价格的变化趋势和波动,预测未来可能会有多大的涨跌”。
🔍 背景科普:什么是资产回报序列?
在金融中,我们关注的不是“价格”本身,而是“价格的变化率”,也就是收益率。比如:
- 如果今天价格是 102,昨天是 100,那么收益率就是:(102 - 100) / 100 = 2%
我们一般会用 对数收益率(log return) 来建模,它的公式是:
log_return = log(今天的价格 / 昨天的价格)
第一步:用 ARMA 模型分析收益的趋势部分
📌 目的:
找到收益率序列中有没有可预测的趋势(线性相关)。
📦 工具:
我们用 ARMA 模型(AR = 自回归,MA = 移动平均)来描述。
🛠️ 怎么做(通俗步骤):
-
准备数据:价格 ➡️ 收益率
把你的资产价格变成收益率(即价格的变化率):import pandas as pd
import numpy as np
# 假设你有个价格序列
prices = pd.Series([100, 102, 101, 103, 105])
returns = np.log(prices / prices.shift(1)).dropna() -
画图看看有没有“趋势”
- 我们画 ACF(自相关)和 PACF(偏自相关)图,看这个序列是不是有结构:
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(returns)
plot_pacf(returns) -
建 ARMA 模型 如果图显示有明显的自相关(比如前几阶的柱子显著不为 0),我们可以试着拟合 ARMA 模型:
from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(returns, order=(1, 0, 1)) # ARMA(1,1)
result = model.fit()
residuals = result.resid # 拿到残差
第二步:检查“波动”是否也有规律(ARCH 效应)
📌 目的:
有时候虽然收益本身是随机的,但它的“波动大小”却不是随机的,会出现“波动聚集”现象,比如今天涨得多,明天也容易大涨或大跌。
这种情况叫 ARCH 效应(异方差性)。
🛠️ 怎么做:
-
拿第一步的残差(resid),看它的平方是否有相关性:
plot_acf(residuals**2) # 画出残差平方的自相关图
-
做 ARCH 检验,判断残差的波动是不是有“规律”:
from statsmodels.stats.diagnostic import het_arch
test_result = het_arch(residuals)
print(test_result) # 如果 p 值 < 0.05,就说明有 ARCH 效应
第三步:构建 GARCH 模型,描述波动率的变化
📌 目的:
我们现在知道波动也有规律,于是用 GARCH 模型来描述波动的变化。
🧠 模型拆解:
- GARCH 模型 = 平均值方程(刚才 ARMA 那块) + 波动率方程(本步)
- 它能预测未来的波动率大小
🛠️ 怎么做:
-
使用
arch
库来建 GARCH 模型:from arch import arch_model
# 用收益率序列建模,mean='AR' 表示AR模型,vol='GARCH' 表示我们要建波动模型
am = arch_model(returns, mean='AR', lags=1, vol='GARCH', p=1, q=1)
garch_result = am.fit()
print(garch_result.summary()) -
看一下预测出来的波动率:
garch_result.conditional_volatility.plot(title='预测的波动率')
第四步:检查模型好不好(诊断和优化)
📌 目的:
你要确保模型是真的“学会”了波动规律,而不是“瞎猜”的。
🛠️ 怎么做:
-
取标准化残差(也就是残差除以预测波动):
std_resid = garch_result.resid / garch_result.conditional_volatility
-
看标准化残差是不是白噪声(无结构):
plot_acf(std_resid)
plot_acf(std_resid**2) -
Ljung-Box 检验(检测残差是否还有关联):
from statsmodels.stats.diagnostic import acorr_ljungbox
print(acorr_ljungbox(std_resid, lags=[10], return_df=True)) -
尝试其他模型(GARCH、EGARCH、GJR-GARCH 等)
# EGARCH 示例
am = arch_model(returns, mean='AR', lags=1, vol='EGARCH', p=1, q=1)
result = am.fit()
🧪 你得到了什么?
- 一个模型,不但能预测明天是涨是跌(ARMA),还可以告诉你“明天的涨跌有多剧烈”(GARCH 波动率预测)。
- 在交易中,预测波动率可以帮助你:
- 判断市场是否风险加大;
- 动态调整仓位;
- 构建期权波动策略。
✅ 总结四步口诀版:
- 建模趋势(ARMA):收益率本身有没有规律?
- 看波动性(ARCH检验):波动的大小有没有规律?
- 建波动模型(GARCH):让模型学会预测波动的变化。
- 检验优化:确保模型不是“装模作样”,真的有效。