📑 查看全课大纲(第 18 / 20 节)

随机性非平稳建模与 GARCH 实战

约 30 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

非平稳序列的随机性分析:ARIMA 与 GARCH 实战

小象实战讲义 · 时间序列分析

在掌握了平稳序列建模(ARMA)和确定性信息提取(差分、分解)后,我们面临一个现实问题:许多经济、金融序列不仅趋势复杂,其波动本身也蕴含着重要信息,且不满足经典模型的同方差假定。本节将系统学习如何对这类“随机性”非平稳序列进行建模。核心是通过差分运算将序列平稳化后拟合 ARMA 模型(即 ARIMA 模型),并进一步处理残差中可能存在的异方差现象,引入条件异方差模型(如 GARCH)来刻画波动的聚集性。学完本节,你将能够对具有趋势和波动聚集特征的金融时间序列(如股价、收益率)进行完整的建模与波动率预测。

💡 核心导读

  • 差分运算的本质:作为一种确定性信息提取工具,差分可以消除序列的长期趋势和季节波动,为后续的随机建模奠定基础。
  • ARIMA 模型体系:理解 ARIMA(p,d,q) 模型是 ARMA(p,q) 模型对 d 阶差分后平稳序列的拟合,掌握其建模流程与定阶方法(包括 auto_arima 自动搜索)。
  • 残差问题的诊断与处理:认识到一个“好”模型的残差应是白噪声。当残差存在自相关时,可建立残差自回归模型;当残差存在异方差(方差时变)时,则需进行方差齐性变换或拟合条件异方差模型
  • GARCH 模型实战:重点掌握 GARCH 模型的思想——用残差平方的自回归移动平均结构来刻画波动的聚集效应,并学会使用 Python 的 arch 库进行拟合与波动率提取。

5.1 差分运算:确定性信息的提取

差分运算是一种强大而简便的确定性信息提取方法。其数学本质是通过差分算子 (1B)d(1-B)^d 的代数运算消去序列中的确定性趋势或季节成分(差分本身是算子运算,并非自回归过程;自回归/ARMA 是对差分后平稳随机序列另行拟合的模型)。对于一个非平稳序列 xtx_t,其 dd 阶差分定义为:

dxt=(1B)dxt=i=0d(1)i(di)xti\nabla^d x_t = (1 - B)^d x_t = \sum_{i=0}^{d} (-1)^i \binom{d}{i} x_{t-i}

其中 BB 为滞后算子(Bxt=xt1B x_t = x_{t-1})。

差分方式的选择遵循以下经验法则

  1. 线性趋势:一阶差分通常足以去除线性趋势、得到平稳序列,即 xt=xtxt1\nabla x_t = x_t - x_{t-1}
  2. 曲线趋势:可能需要二阶或三阶差分来提取,即 2xt=(xt)\nabla^2 x_t = \nabla(\nabla x_t)
  3. 季节趋势:对于具有周期 ss 的季节序列,采用步长为 ss 的季节差分,即 sxt=xtxts\nabla_s x_t = x_t - x_{t-s}。常与趋势差分结合使用,如 1阶12步差分

注意避免过差分:虽然足够多次的差分可以充分提取确定性信息,但过度的差分会造成信息浪费,导致差分后序列的方差增大。

Python 实战:差分运算示例

让我们通过 Python 代码演示如何利用差分提取序列的确定性信息。我们将使用两个示例:北京市民用车辆拥有量(曲线趋势)和奶牛月产奶量(趋势与季节)。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 示例1:北京市民用车辆拥有量 (曲线趋势)
# 假设数据已加载为car_series (1950-1999年)
# 这里我们模拟一个类似的二次增长趋势
np.random.seed(42)
t = np.arange(1, 51)
car_series = 0.05 * t**2 + 5 * t + 30 + np.random.normal(0, 10, 50)

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
axes[0].plot(t, car_series, marker='o')
axes[0].set_title('原始序列:北京市民用车辆拥有量')
axes[0].set_xlabel('年份')
axes[0].grid(True)

# 一阶差分
diff1 = np.diff(car_series, n=1)
axes[1].plot(t[1:], diff1, marker='o', color='orange')
axes[1].set_title('一阶差分序列')
axes[1].set_xlabel('年份')
axes[1].axhline(y=0, color='r', linestyle='--', alpha=0.5)
axes[1].grid(True)

# 二阶差分
diff2 = np.diff(car_series, n=2)
axes[2].plot(t[2:], diff2, marker='o', color='green')
axes[2].set_title('二阶差分序列')
axes[2].set_xlabel('年份')
axes[2].axhline(y=0, color='r', linestyle='--', alpha=0.5)
axes[2].grid(True)

plt.tight_layout()
plt.show()

运行上述代码,通过观察时序图可以发现:原始序列呈现明显的曲线增长趋势;一阶差分后增长趋势减弱但依然存在;二阶差分后序列围绕零值波动,长期趋势已被基本提取。这印证了对于曲线趋势,可能需要二阶差分。

# 示例2:奶牛月产奶量 (趋势与季节)
# 模拟一个带有线性趋势和12个月季节周期的序列
np.random.seed(123)
months = 10 * 12  # 10年
t = np.arange(months)
# 线性趋势 + 正弦季节项 + 随机噪声
milk_series = 0.5 * t + 20 * np.sin(2 * np.pi * t / 12) + 500 + np.random.normal(0, 5, months)

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
axes[0].plot(milk_series)
axes[0].set_title('原始序列:奶牛月产奶量')
axes[0].set_xlabel('月份')
axes[0].grid(True)

# 一阶差分消除线性趋势
milk_diff1 = np.diff(milk_series, n=1)
axes[1].plot(milk_diff1)
axes[1].set_title('一阶差分序列 (消除趋势)')
axes[1].set_xlabel('月份')
axes[1].grid(True)

# 再进行12步差分消除季节效应
milk_diff1_seasonal = milk_diff1[12:] - milk_diff1[:-12]  # 等价于1阶12步差分
axes[2].plot(milk_diff1_seasonal)
axes[2].set_title('1阶12步差分序列 (消除趋势与季节)')
axes[2].set_xlabel('月份')
axes[2].grid(True)

plt.tight_layout()
plt.show()

从结果可以看到,一阶差分后,线性上升趋势被消除,但明显的12个月周期依然存在。经过1阶12步差分后,序列变得相对平稳,趋势和季节波动都被有效提取。

5.2 ARIMA 模型:差分后序列的 ARMA 建模

ARIMA(Autoregressive Integrated Moving Average)模型是处理差分平稳序列的核心工具。若序列 xtx_t 经过 dd 阶差分后平稳,记为 wt=dxtw_t = \nabla^d x_t,且 wtw_t 服从一个 ARMA(p,q) 模型,则原序列 xtx_t 服从 ARIMA(p,d,q) 模型,其模型结构为:

Φ(B)dxt=Θ(B)εt,εtWN(0,σ2)\Phi(B) \nabla^d x_t = \Theta(B) \varepsilon_t, \quad \varepsilon_t \sim WN(0, \sigma^2)

其中:

  • Φ(B)=1ϕ1BϕpBp\Phi(B) = 1 - \phi_1 B - \cdots - \phi_p B^p 为自回归多项式。
  • Θ(B)=1θ1BθqBq\Theta(B) = 1 - \theta_1 B - \cdots - \theta_q B^q 为移动平均多项式(与本课程其他章节统一为负号约定;正负号仅为 θ\theta 的记号差异,数学上等价)。
  • d=(1B)d\nabla^d = (1-B)^ddd 阶差分算子。
  • εt\varepsilon_t 是均值为0、方差为 σ2\sigma^2 的白噪声序列。

ARIMA 模型族是 ARMA 模型的扩展:

  • d=0d=0 时,ARIMA(p,0,q) = ARMA(p,q)
  • p=0p=0 时,ARIMA(0,d,q) = IMA(d,q)
  • q=0q=0 时,ARIMA(p,d,0) = ARI(p,d)
  • d=1,p=q=0d=1, p=q=0 时,即为随机游走模型xt=xt1+εtx_t = x_{t-1} + \varepsilon_t

ARIMA 建模步骤

  1. 平稳化:通过差分运算(可能结合季节差分)将原序列转换为平稳序列 wtw_t
  2. 白噪声检验:检验 wtw_t 是否为纯随机序列。若是,则分析结束;若否,进入下一步。
  3. 模型识别与定阶:观察 wtw_t 的 ACF(自相关函数)和 PACF(偏自相关函数)图,初步判断 ARMA(p,q) 的阶数 ppqq
  4. 参数估计:使用极大似然估计等方法估计模型参数。
  5. 模型检验:检验残差是否为白噪声,并检验参数的显著性。
  6. 预测:利用拟合好的模型进行预测。

Python 实战:ARIMA 建模与自动定阶

我们以一段模拟的上证指数日收益率序列为例,演示完整的 ARIMA 建模流程,并引入 pmdarima 库的 auto_arima 函数进行自动定阶。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller, acf, pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import pmdarima as pm
from statsmodels.tsa.arima.model import ARIMA
import warnings
warnings.filterwarnings('ignore')

# 模拟上证指数日收益率序列 (具有波动聚集性)
np.random.seed(2024)
n = 544
# 模拟一个非平稳的价格序列,再计算收益率
price = np.cumsum(np.random.normal(0.0002, 0.01, n)) + 3000
returns = np.diff(price) / price[:-1]  # 简单收益率
# 为模拟非平稳性,我们直接使用价格序列(更具代表性)
# 这里我们假设 price 是待分析的非平稳序列
ts_price = pd.Series(price, index=pd.date_range(start='2020-01-01', periods=n, freq='D'))

# 1. 平稳性检验 (ADF检验)
adf_result = adfuller(ts_price)
print(f"ADF 检验结果:")
print(f"  ADF 统计量: {adf_result[0]:.4f}")
print(f"  P值: {adf_result[1]:.4f}")
print(f"  结论: {'序列平稳' if adf_result[1] < 0.05 else '序列非平稳'}")

# 2. 观察序列、ACF、PACF图
fig, axes = plt.subplots(3, 2, figsize=(12, 10))
# 原始序列
axes[0, 0].plot(ts_price)
axes[0, 0].set_title('原始序列时序图')
axes[0, 0].grid(True)
plot_acf(ts_price, lags=40, ax=axes[1, 0])
axes[1, 0].set_title('原始序列 ACF')
plot_pacf(ts_price, lags=40, ax=axes[2, 0])
axes[2, 0].set_title('原始序列 PACF')

# 一阶差分序列
ts_diff1 = ts_price.diff().dropna()
axes[0, 1].plot(ts_diff1)
axes[0, 1].set_title('一阶差分序列时序图')
axes[0, 1].grid(True)
plot_acf(ts_diff1, lags=40, ax=axes[1, 1])
axes[1, 1].set_title('一阶差分序列 ACF')
plot_pacf(ts_diff1, lags=40, ax=axes[2, 1])
axes[2, 1].set_title('一阶差分序列 PACF')

plt.tight_layout()
plt.show()

从图形分析可知,原始序列的 ACF 衰减缓慢,是非平稳的典型特征。一阶差分后序列的 ACF 和 PACF 均呈现拖尾或截尾特征不明显,可能适合拟合 ARMA 模型。

# 3. 使用 auto_arima 自动定阶 (基于AIC/BIC准则搜索最优模型)
print("使用 auto_arima 进行自动定阶...")
# 设置 seasonal=False 表示不考虑季节性
auto_model = pm.auto_arima(ts_price, start_p=0, start_q=0,
                           max_p=5, max_q=5, max_d=2,
                           seasonal=False,
                           trace=True,  # 打印搜索过程
                           error_action='ignore',
                           suppress_warnings=True,
                           stepwise=True,  # 使用逐步搜索加快速度
                           information_criterion='aic')

print(f"\n自动定阶选择的最优模型为: ARIMA{auto_model.order}")
print(f"模型AIC值: {auto_model.aic():.2f}")

# 4. 手动拟合一个候选模型进行比较 (例如 ARIMA(1,1,1))
manual_model = ARIMA(ts_price, order=(1,1,1)).fit()
print(f"\n手动拟合 ARIMA(1,1,1) 结果:")
print(manual_model.summary())

# 5. 模型诊断:残差白噪声检验
resid = manual_model.resid
lb_test = acorr_ljungbox(resid, lags=[10, 20], return_df=True)
print(f"\n残差白噪声检验 (Ljung-Box):")
for lag in [10, 20]:
    p_val = lb_test.loc[lag, 'lb_pvalue']
    print(f"  Lag {lag}: p值 = {p_val:.4f} ({'通过' if p_val > 0.05 else '未通过'}白噪声检验)")

运行上述代码,auto_arima 会输出搜索过程并推荐一个最优模型(例如 ARIMA(1,1,0))。同时,我们手动拟合的 ARIMA(1,1,1) 模型会给出参数估计结果。最后,对残差进行 Ljung-Box 检验,若 p 值大于 0.05,则在相应滞后阶数下不能拒绝残差为白噪声的原假设,表明模型拟合充分。

5.3 残差问题的进阶处理:异方差与 GARCH 模型

一个理想的 ARIMA 模型要求残差 εt\varepsilon_t 是独立同分布的白噪声。但在实际中,尤其是金融时间序列中,残差常常出现两种问题:

  1. 自相关:残差项 εt\varepsilon_t 自身存在相关性。处理方法是建立残差自回归模型(Auto-Regressive Model),即对提取确定性趋势后的残差再拟合一个 AR 模型。
  2. 异方差:残差的方差 Var(εt)\text{Var}(\varepsilon_t) 随时间 tt 变化,不再恒定。金融序列中常表现为“波动聚集”现象(大波动跟着大波动,小波动跟着小波动)。这是本节重点。

异方差的处理有两类方法

  • 方差齐性变换:当异方差函数形式已知(如方差与均值平方成正比),可通过函数变换(如取对数)使变换后序列满足同方差。注意该变换仅适用于方差与水平存在确定函数关系的异方差;金融收益率的波动聚集属条件异方差,应走 GARCH 建模,取对数并不能消除 ARCH 效应。
  • 条件异方差模型:当异方差形式未知且具有自相关结构时,需建立专门的模型来刻画时变方差,最著名的就是 ARCH/GARCH 模型族。

5.3.1 ARCH/GARCH 模型原理

ARCH(Autoregressive Conditional Heteroskedasticity)模型 由 Engle (1982) 提出,其思想是用残差平方的自回归结构来刻画条件方差的时变性。一个 ARCH(q) 模型定义为:

xt=μt+εtεt=σtet,eti.i.d.N(0,1)σt2=ω+j=1qαjεtj2\begin{aligned} x_t &= \mu_t + \varepsilon_t \\ \varepsilon_t &= \sigma_t e_t, \quad e_t \sim i.i.d. N(0,1) \\ \sigma_t^2 &= \omega + \sum_{j=1}^{q} \alpha_j \varepsilon_{t-j}^2 \end{aligned}

其中 μt\mu_txtx_t 的条件均值(可由 ARMA 等模型刻画),σt2\sigma_t^2εt\varepsilon_t 的条件方差。要求 ω>0,αj0\omega > 0, \alpha_j \ge 0 以保证方差为正。

GARCH(Generalized ARCH)模型 由 Bollerslev (1986) 提出,在 ARCH 的基础上加入了条件方差自身的滞后项,通常能以更少的参数捕捉更长的记忆性。一个 GARCH(p, q) 模型定义为:

xt=μt+εtεt=σtet,eti.i.d.N(0,1)σt2=ω+i=1pβiσti2+j=1qαjεtj2\begin{aligned} x_t &= \mu_t + \varepsilon_t \\ \varepsilon_t &= \sigma_t e_t, \quad e_t \sim i.i.d. N(0,1) \\ \sigma_t^2 &= \omega + \sum_{i=1}^{p} \beta_i \sigma_{t-i}^2 + \sum_{j=1}^{q} \alpha_j \varepsilon_{t-j}^2 \end{aligned}

其中 ω>0,αj0,βi0\omega > 0, \alpha_j \ge 0, \beta_i \ge 0,且通常要求 i=1pβi+j=1qαj<1\sum_{i=1}^{p} \beta_i + \sum_{j=1}^{q} \alpha_j < 1 以保证过程平稳。

5.3.2 GARCH 模型的常见变体

  1. EGARCH(Exponential GARCH):由 Nelson (1991) 提出,直接对条件方差的对数建模,无需参数非负约束,并能刻画杠杆效应(负收益对波动率的冲击大于正收益)。 ln(σt2)=ω+i=1pβiln(σti2)+j=1q(αj(etjEetj)+γjetj)\ln(\sigma_t^2) = \omega + \sum_{i=1}^{p} \beta_i \ln(\sigma_{t-i}^2) + \sum_{j=1}^{q} \left( \alpha_j (|e_{t-j}| - E|e_{t-j}|) + \gamma_j e_{t-j} \right) 其中 γj0\gamma_j \neq 0 即表示存在杠杆效应。

  2. GJR-GARCH:另一种刻画杠杆效应的模型,在标准 GARCH 方程中为负向冲击添加额外的系数。

  3. GARCH-M(GARCH-in-Mean):将条件方差 σt2\sigma_t^2 或条件标准差 σt\sigma_t 引入均值方程 μt\mu_t,用于研究风险与收益的关系。

Python 实战:GARCH 模型拟合与波动率提取

我们使用 arch 库来拟合 GARCH 模型。以下代码演示了对金融收益率序列(假设已通过 ARIMA 提取了均值部分,得到残差)拟合 GARCH 模型,并提取条件波动率。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from arch import arch_model
from statsmodels.stats.diagnostic import acorr_ljungbox

# 使用验证通过的代码结构与参数
np.random.seed(42)
n = 600

# 构造模拟金融收益率数据 (含杠杆效应:负向冲击带来更大波动)
eta = np.random.normal(0, 1, n)
ln_sigma2 = np.zeros(n)
r = np.zeros(n)
# EGARCH(1,1) 参数: omega=-0.1, alpha=0.15, gamma=-0.2 (负向冲击杠杆), beta=0.85
omega_eg, alpha_eg, gamma_eg, beta_eg = -0.1, 0.15, -0.2, 0.85
ln_sigma2[0] = omega_eg / (1 - beta_eg)
r[0] = np.exp(0.5 * ln_sigma2[0]) * eta[0]

for t in range(1, n):
    z = eta[t-1]
    # EGARCH 的非对称冲击函数
    g_z = alpha_eg * (abs(z) - np.sqrt(2 / np.pi)) + gamma_eg * z
    ln_sigma2[t] = omega_eg + beta_eg * ln_sigma2[t-1] + g_z
    r[t] = np.exp(0.5 * ln_sigma2[t]) * eta[t]

returns = pd.Series(r, name='equity_returns')

# 1. 拟合 EGARCH(1,1) 模型检验杠杆效应 (o=1 表示非对称项)
am_egarch = arch_model(returns, mean='Zero', vol='EGARCH', p=1, o=1, q=1, dist='normal')
res_egarch = am_egarch.fit(disp='off')

gamma_est = res_egarch.params.get('gamma[1]', 0.0)
gamma_pval = res_egarch.pvalues.get('gamma[1]', 1.0)

# 2. 提取标准化残差 (Standardized Residuals: z_t = e_t / sigma_t)
std_resid = res_egarch.std_resid

# 3. 标准化残差平方白噪声检验 (验证 ARCH 效应已被充分吸收)
lb_test = acorr_ljungbox(std_resid ** 2, lags=[5, 10], return_df=True)

print(f"数据量: {n}")
print(f"EGARCH(1,1) 关键参数估计:")
print(f"  omega:    {res_egarch.params['omega']:.4f}")
print(f"  alpha[1]: {res_egarch.params['alpha[1]']:.4f}")
print(f"  gamma[1] (杠杆系数): {gamma_est:.4f} (p值: {gamma_pval:.4e})")
print(f"  beta[1]:  {res_egarch.params['beta[1]']:.4f}")
print(f"杠杆效应显著存在 (gamma 显著异于 0): {gamma_pval < 0.05}")
print(f"\n标准化残差平方白噪声检验 (验证无残留异方差):")
for lag in [5, 10]:
    p = lb_test.loc[lag, 'lb_pvalue']
    stat = lb_test.loc[lag, 'lb_stat']
    print(f"  Lag {lag}: Q 统计量 = {stat:.4f}, p值 = {p:.4f} (已无 ARCH 效应: {p > 0.05})")

# 4. 绘制条件波动率
cond_vol = res_egarch.conditional_volatility
fig, axes = plt.subplots(2, 1, figsize=(12, 8))
axes[0].plot(returns, label='收益率', alpha=0.7)
axes[0].set_title('模拟金融收益率序列')
axes[0].legend()
axes[0].grid(True)

axes[1].plot(cond_vol, label='条件波动率 (EGARCH拟合)', color='red')
axes[1].set_title('提取的条件波动率')
axes[1].legend()
axes[1].grid(True)
plt.tight_layout()
plt.show()

运行结果与输出

数据量: 600
EGARCH(1,1) 关键参数估计:
  omega:    -0.1013
  alpha[1]: 0.0982
  gamma[1] (杠杆系数): -0.1200 (p值: 2.5237e-03)
  beta[1]:  0.8642
杠杆效应显著存在 (gamma 显著异于 0): True

标准化残差平方白噪声检验 (验证无残留异方差):
  Lag 5: Q 统计量 = 2.2718, p值 = 0.8104 (已无 ARCH 效应: True)
  Lag 10: Q 统计量 = 4.2859, p值 = 0.9335 (已无 ARCH 效应: True)

代码解读与关键点

  1. 模型拟合arch_model(returns, mean='Zero', vol='EGARCH', p=1, o=1, q=1) 指定了均值方程为常数(这里为0),波动率方程为 EGARCH(1,1),其中 o=1 表示包含一阶非对称项(杠杆项)。
  2. 杠杆效应:参数 gamma[1] 的估计值为负(-0.12)且 p 值远小于 0.05,表明存在显著的杠杆效应,即过去的负向冲击(et1<0e_{t-1} < 0)会比对等的正向冲击带来更大的未来波动。
  3. 模型诊断:对标准化残差平方进行 Ljung-Box 检验,p 值均大于 0.05,说明拟合 EGARCH 模型后,残差中已不存在显著的 ARCH 效应,模型充分捕捉了波动的聚集性。
  4. 波动率提取res_egarch.conditional_volatility 直接给出了每个时点的条件标准差 σt\sigma_t 的估计值,即我们需要的波动率。

📝 动手练一练

  1. 差分阶数判断:假设你有一个宏观经济指标序列,其时序图显示其增长先加速后减速,整体呈“S”形曲线。你认为至少需要几阶差分才能使其大致平稳?请简述理由。
  2. 模型选择与诊断:你为某股票日收益率序列拟合了一个 ARIMA(1,1,1) 模型,但残差的 ACF 图显示在滞后 1 阶和 5 阶仍有显著相关性,同时残差平方的 ACF 图也显示显著的相关性。接下来你应该优先考虑哪种改进方案?是建立残差自回归模型,还是建立 GARCH 模型?为什么?

参考答案

  1. 对于“S”形曲线,可能包含从加速到减速的变化,这暗示着趋势的斜率本身在变化。一阶差分提取的是斜率(一阶导),对于变化的斜率,可能需要二阶差分(提取斜率的变化率,即二阶导)才能使其平稳。因此,至少需要二阶差分
  2. 应优先考虑建立 GARCH 模型。原因有两点:第一,残差平方的 ACF 显著,这是异方差(ARCH 效应)的典型特征,表明波动具有聚集性。第二,虽然残差本身也有自相关,但有时异方差的存在会影响残差自相关的检验。优先解决异方差问题后,再对标准化残差检验自相关性,若仍存在,再考虑建立残差自回归模型更为合适。

本章小结

本节深入探讨了非平稳序列随机性分析的两大核心工具:ARIMA 模型GARCH 模型

  • ARIMA 模型解决了序列非平稳的问题。通过差分运算提取确定性趋势/季节信息,再对平稳化的残差序列建立 ARMA 模型。我们掌握了从序列可视化、平稳性检验、差分处理到模型识别、估计、检验与预测的完整流程,并学会了使用 auto_arima 工具进行自动定阶。
  • GARCH 模型解决了残差异方差的问题。特别是金融时间序列中常见的“波动聚集”现象,可以用 GARCH 族模型(包括标准 GARCH、刻画杠杆效应的 EGARCH/GJR-GARCH 等)来刻画时变的条件方差。我们理解了其模型结构,并学会了使用 Python 的 arch 库进行拟合、诊断和波动率提取。

行动清单

  1. 对你感兴趣的一个非平稳时间序列(如某股票价格、某城市月度气温),尝试完整的 ARIMA 建模流程:差分→定阶→估计→检验。
  2. 对上述序列的 ARIMA 模型残差,绘制残差平方图并进行 Ljung-Box 检验,判断是否存在 ARCH 效应。如果存在,尝试拟合一个 GARCH(1,1) 模型。
  3. 访问 arch 库的官方文档,了解如何用 forecast() 方法进行波动率的样本外预测。

— 小象教研组

配套学习资源与课件
  • 第5章课件:非平稳序列的随机性分析
    下载
  • 第5章配套代码
    下载
  • 时间序列分析推荐书籍(打包)(经典时序分析参考书合集)
    下载
  • 课程配套数据集(全课程实战数据)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信二维码:扫码添加课程顾问微信扫码添加顾问