跳到主要内容

GARCH

· 阅读需 6 分钟
Jiujiuwhoami
Digital nomads

开发一个资产回报序列的波动率模型。你可以把它理解为“让我们通过分析资产价格的变化趋势和波动,预测未来可能会有多大的涨跌”。


🔍 背景科普:什么是资产回报序列?

在金融中,我们关注的不是“价格”本身,而是“价格的变化率”,也就是收益率。比如:

  • 如果今天价格是 102,昨天是 100,那么收益率就是:(102 - 100) / 100 = 2%

我们一般会用 对数收益率(log return) 来建模,它的公式是:

log_return = log(今天的价格 / 昨天的价格)

第一步:用 ARMA 模型分析收益的趋势部分

📌 目的:

找到收益率序列中有没有可预测的趋势(线性相关)

📦 工具:

我们用 ARMA 模型(AR = 自回归,MA = 移动平均)来描述。

🛠️ 怎么做(通俗步骤):

  1. 准备数据:价格 ➡️ 收益率
    把你的资产价格变成收益率(即价格的变化率):

    import pandas as pd
    import numpy as np

    # 假设你有个价格序列
    prices = pd.Series([100, 102, 101, 103, 105])
    returns = np.log(prices / prices.shift(1)).dropna()
  2. 画图看看有没有“趋势”

    • 我们画 ACF(自相关)和 PACF(偏自相关)图,看这个序列是不是有结构:
    from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    plot_acf(returns)
    plot_pacf(returns)
  3. 建 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 效应(异方差性)。

🛠️ 怎么做:

  1. 拿第一步的残差(resid),看它的平方是否有相关性

    plot_acf(residuals**2)  # 画出残差平方的自相关图
  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 那块) + 波动率方程(本步)
  • 它能预测未来的波动率大小

🛠️ 怎么做:

  1. 使用 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())
  2. 看一下预测出来的波动率:

    garch_result.conditional_volatility.plot(title='预测的波动率')

第四步:检查模型好不好(诊断和优化)

📌 目的:

你要确保模型是真的“学会”了波动规律,而不是“瞎猜”的。

🛠️ 怎么做:

  1. 取标准化残差(也就是残差除以预测波动):

    std_resid = garch_result.resid / garch_result.conditional_volatility
  2. 看标准化残差是不是白噪声(无结构)

    plot_acf(std_resid)
    plot_acf(std_resid**2)
  3. Ljung-Box 检验(检测残差是否还有关联)

    from statsmodels.stats.diagnostic import acorr_ljungbox
    print(acorr_ljungbox(std_resid, lags=[10], return_df=True))
  4. 尝试其他模型(GARCH、EGARCH、GJR-GARCH 等)

    # EGARCH 示例
    am = arch_model(returns, mean='AR', lags=1, vol='EGARCH', p=1, q=1)
    result = am.fit()

🧪 你得到了什么?

  • 一个模型,不但能预测明天是涨是跌(ARMA),还可以告诉你“明天的涨跌有多剧烈”(GARCH 波动率预测)。
  • 在交易中,预测波动率可以帮助你:
    • 判断市场是否风险加大;
    • 动态调整仓位;
    • 构建期权波动策略。

✅ 总结四步口诀版:

  1. 建模趋势(ARMA):收益率本身有没有规律?
  2. 看波动性(ARCH检验):波动的大小有没有规律?
  3. 建波动模型(GARCH):让模型学会预测波动的变化。
  4. 检验优化:确保模型不是“装模作样”,真的有效。