GARCH模型¶
简介¶
广义自回归条件异方差(GARCH)模型旨在对时间序列的条件波动性进行建模。设\(r_{t}\)为因变量,例如股票在时间\(t\)的收益率。我们可以将该序列建模为:
这里mu是\(r_{t}\)的期望值,\(\sigma_{t}\)是时间\(t\)内\(r_{t}\)的标准差,而\(\epsilon_{t}\)是时间\(t\)的误差项。
GARCH模型的动机在于希望基于过去信息对\(\sigma_{t}\)进行条件建模。一个原始模型可能是滚动标准差——例如30天窗口——或指数加权标准差。窗口模型施加了看似不理想的任意截断。EWMA稍具吸引力,但如何选择加权参数\(\lambda\)并不直观。
ARCH/GARCH模型是一种替代模型,允许在基于似然的方法中估计参数。该模型的基本驱动因素是过去平方残差的加权平均值。这些滞后的平方残差被称为ARCH项。Bollerslev(1986年)通过引入滞后条件波动率项扩展了该模型,从而创建了GARCH模型。以下是GARCH模型的公式表示:
我们需要对这个模型施加约束条件,以确保波动率大于1,具体来说\(\omega, \alpha, \beta > 0\)。如果我们想要保证平稳性,还需要满足\(\alpha + \beta < 1\)。
一旦我们估计出模型的参数,就可以对波动性进行回顾性分析,并预测未来的条件波动性。
示例¶
首先让我们从雅虎财经加载一些金融时间序列数据:
import numpy as np
import pyflux as pf
import pandas as pd
from pandas_datareader import DataReader
from datetime import datetime
import matplotlib.pyplot as plt
%matplotlib inline
jpm = DataReader('JPM', 'yahoo', datetime(2006,1,1), datetime(2016,3,10))
returns = pd.DataFrame(np.diff(np.log(jpm['Adj Close'].values)))
returns.index = jpm.index.values[1:jpm.index.values.shape[0]]
returns.columns = ['JPM Returns']
plt.figure(figsize=(15,5));
plt.plot(returns.index,returns);
plt.ylabel('Returns');
plt.title('JPM Returns');
一种可视化序列潜在波动性的方法是绘制绝对收益\(\mid{y}\mid\):
plt.figure(figsize=(15,5))
plt.plot(returns.index, np.abs(returns))
plt.ylabel('Absolute Returns')
plt.title('JP Morgan Absolute Returns');
这一时期似乎存在一些波动聚集的证据。让我们使用点质量估计 \(z^{MLE}\) 来拟合一个GARCH(1,1)模型:
model = pf.GARCH(returns,p=1,q=1)
x = model.fit()
x.summary()
GARCH(1,1)
======================================== =================================================
Dependent Variable: JPM Returns Method: MLE
Start Date: 2006-01-05 00:00:00 Log Likelihood: 6594.7911
End Date: 2016-03-10 00:00:00 AIC: -13181.5822
Number of observations: 2562 BIC: -13158.188
==========================================================================================
Latent Variable Estimate Std Error z P>|z| 95% C.I.
========================= ========== ========== ======== ======== ========================
Vol Constant 0.0
q(1) 0.0933
p(1) 0.9013
Returns Constant 0.0009 0.0065 0.1359 0.8919 (-0.0119 | 0.0137)
==========================================================================================
转换变量的标准误差未显示。您可以通过向summary传递transformed=False参数来获取未转换变量的该信息。
我们可以使用plot_z()来绘制GARCH潜在变量:
model.plot_z(figsize=(15,5))
我们可以使用plot_fit()来绘制拟合结果:
并使用plot_predict()绘制未来条件波动率的预测图:
model.plot_predict(h=10)
如果我们希望以DataFrame形式获取预测结果,可以使用predict():
我们可以通过plot_predict_is()查看使用样本内滚动预测的效果:
model.plot_predict_is(h=50,figsize=(15,5))
类描述¶
-
class
GARCH(data, p, q, target)¶ 广义自回归条件异方差模型 (GARCH)
参数 类型 描述 data pd.DataFrame or np.ndarray 包含单变量时间序列 p int 自回归滞后项的数量 \(\sigma^{2}\) q int ARCH项的数量 \(\epsilon^{2}\) target string or int 指定使用DataFrame/array中的哪一列。 属性
-
latent_variables¶ 一个包含模型潜在变量信息的pf.LatentVariables()对象,包括先验设置、任何拟合值、初始值和其他潜在变量信息。当模型被拟合时,这里就是潜在变量被更新/存储的地方。有关此对象内属性的信息以及访问潜在变量信息的方法,请参阅潜在变量文档。
方法
-
adjust_prior(index, prior)¶ 调整模型潜在变量的先验分布。潜在变量及其索引可以通过打印附加到模型实例的
latent_variables属性来查看。参数 类型 描述 index int 要更改的潜变量索引 prior pf.Family instance Prior distribution, e.g. pf.Normal()返回: void - 修改模型的
latent_variables属性
-
fit(method, **kwargs)¶ 估计模型的潜在变量。用户选择一个推断选项,该方法会返回一个结果对象,同时更新模型的
latent_variables属性。参数 类型 描述 method str 推断选项:例如 'M-H' 或 'MLE' 请参阅文档中的贝叶斯推断和经典推断部分,了解完整的推断选项列表。可以输入与所选特定推断模式相关的可选参数。
返回: 包含估计潜在变量信息的pf.Results实例
-
plot_fit(**kwargs)¶ 绘制模型对数据的拟合情况。可选参数包括figsize,即绘图图形的尺寸。
返回 : void - 显示一个matplotlib绘图
-
plot_ppc(T, nsims)¶ 绘制后验预测检查的直方图,使用用户选择的差异度量。此方法仅在使用贝叶斯推断进行拟合时有效。
参数 类型 描述 T function Discrepancy, e.g. np.meanornp.maxnsims int PPC需要进行多少次模拟 返回值: void - 显示一个matplotlib绘图
-
plot_predict(h, past_values, intervals, **kwargs)¶ 绘制模型的预测结果,并附带置信区间。
参数 类型 描述 h int 预测向前多少步 past_values int 要绘制的历史数据点数量 intervals boolean 是否绘制区间 可选参数包括figsize - 图表绘制的尺寸。请注意 如果您使用最大似然估计或变分推断,显示的区间将不会 反映潜在变量的不确定性。只有Metropolis-Hastings方法能提供完全贝叶斯 预测区间。由于平均场推断的局限性(无法考虑后验相关性), 变分推断的贝叶斯区间不予显示。
返回 : void - 显示一个matplotlib绘图
-
plot_predict_is(h, fit_once, fit_method, **kwargs)¶ 绘制模型在样本内的滚动预测。这意味着用户假装数据的最后一部分是样本外的,并在每个时间段后进行预测并评估其表现。用户可以选择是在开始时一次性拟合参数,还是在每个时间步都进行拟合。
参数 类型 描述 h int 使用多少个先前的时间步 fit_once boolean 是否只拟合一次,还是每个时间步都拟合 fit_method str 选择哪种推断方法,例如'MLE' 可选参数包括figsize - 要绘制的图形尺寸。h是一个整数,表示要模拟性能的前几步。
返回 : void - 显示一个matplotlib绘图
-
plot_sample(nsims, plot_data=True)¶ 绘制模型后验预测密度的样本。此方法仅适用于通过贝叶斯推断拟合的模型。
参数 类型 描述 nsims int 需要抽取的样本数量 plot_data boolean 是否同时绘制真实数据 返回 : void - 显示一个matplotlib绘图
-
plot_z(indices, figsize)¶ 返回潜在变量及其相关不确定性的绘图。
参数 类型 描述 indices int or list 要绘制的潜变量索引 figsize tuple matplotlib图形的大小 返回 : void - 显示一个matplotlib绘图
-
ppc(T, nsims)¶ 返回后验预测检验的p值。此方法仅在您使用贝叶斯推断进行拟合时才有效。
参数 类型 描述 T function Discrepancy, e.g. np.meanornp.maxnsims int PPC需要进行多少次模拟 返回值: int - 差异检验的p值
-
predict(h, intervals=False)¶ 返回模型预测结果的DataFrame。
参数 类型 描述 h int 预测向前多少步 intervals boolean 是否返回预测区间 请注意,如果您使用最大似然估计或变分推断,显示的区间将不会反映潜在变量的不确定性。只有Metropolis-Hastings方法能提供完全贝叶斯预测区间。由于平均场推断的局限性(未考虑后验相关性),变分推断的贝叶斯区间未予显示。
返回 : pd.DataFrame - 模型预测结果
-
predict_is(h, fit_once, fit_method)¶ 返回模型样本内滚动预测的DataFrame。
参数 类型 描述 h int 使用多少个先前的时间步 fit_once boolean 是否只拟合一次,还是每个时间步都拟合 fit_method str 选择哪种推断方法,例如'MLE' 返回 : pd.DataFrame - 模型预测结果
-
sample(nsims)¶ 返回从后验预测密度中抽取的数据的np.ndarray数组。此方法仅在您使用贝叶斯推断拟合模型时才有效。
参数 类型 描述 nsims int 进行多少次后验抽样 返回值 : np.ndarray - 来自后验预测密度的样本。
-
参考文献¶
Bollerslev, T. (1986). 广义自回归条件异方差性. 计量经济学杂志. 四月, 31:3, 第307-27页.
恩格尔,R.F.(1982)。《英国通货膨胀方差估计的自回归条件异方差性》。计量经济学。50(4), 987-1007。