Beta偏斜t分布GARCH模型

简介

Beta Skew-t EGARCH模型由Harvey和Chakravarty(2008)提出。该模型通过使用Skew-t条件评分来驱动条件方差,从而扩展了GARCH模型。这种公式化方法增强了对异常值的鲁棒性。其基本公式遵循Beta-t-EGARCH模型。采用的Skew-t分布源自Fernandez和Steel(1998)。

\[f\left(\epsilon_{t}\mid\gamma\right) = \frac{2}{\gamma + \gamma^{-1}}\left[{f}\left(\frac{\epsilon_{t}}{\gamma}\right)I_{\left[0,\infty\right]}\left(\epsilon_{t}\right) + f\left(\epsilon_{t}\gamma\right)I_{\left(-\infty,{0}\right)}\left(\epsilon_{t}\right)\right]\]

潜在变量\(\gamma\)代表偏斜程度;当\(\gamma=1\)时表示无偏斜,\(\gamma>1\)时为正偏斜,而\(\gamma<1\)时为负偏斜。

开发者说明

  • 该模型类型尚未进行Cython优化,因此性能可能较慢。

示例

首先让我们从雅虎财经加载一些金融时间序列数据:

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');
http://www.pyflux.com/notebooks/SkewtEGARCH/output_7_1.png

一种可视化序列潜在波动性的方法是绘制绝对收益\(\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');
http://www.pyflux.com/notebooks/GARCH/output_14_02.png

这一时期似乎存在一些波动聚集的证据。让我们使用点质量估计\(z^{MLE}\)来拟合一个\(Beta\)\(Skew-t\)\(EGARCH(1,1)\)模型:

skewt_model = pf.SEGARCH(p=1, q=1, data=returns, target='JPM Returns')
x = skewt_model.fit()
x.summary()

SEGARCH(1,1)
======================================== =================================================
Dependent Variable: JPM Returns          Method: MLE
Start Date: 2006-01-05 00:00:00          Log Likelihood: 6664.2692
End Date: 2016-03-10 00:00:00            AIC: -13316.5384
Number of observations: 2562             BIC: -13281.4472
==========================================================================================
Latent Variable           Estimate   Std Error  z        P>|z|    95% C.I.
========================= ========== ========== ======== ======== ========================
Vol Constant              -0.0586    0.0249     -2.3589  0.0183   (-0.1073 | -0.0099)
p(1)                      0.9932
q(1)                      0.104
Skewness                  0.9858
v                         6.0465
Returns Constant          0.0015     0.0057     0.271    0.7864   (-0.0096 | 0.0127)
==========================================================================================

转换变量的标准误差未显示。您可以通过向summary传递transformed=False参数来获取未转换变量的该信息。

我们可以使用plot_z()绘制偏度潜变量\(\gamma\)

skewt_model.plot_z([3],figsize=(15,5))
http://www.pyflux.com/notebooks/SkewtEGARCH/output_11_1.png

因此,该序列呈现轻微的负偏态——这与大多数金融时间序列的偏态方向一致。我们可以通过plot_fit()绘制拟合结果:

skewt_model.plot_fit(figsize=(15,5))
http://www.pyflux.com/notebooks/SkewtEGARCH/output_13_0.png

并使用plot_predict()绘制未来条件波动率的预测图:

model.plot_predict(h=10)
http://www.pyflux.com/notebooks/SkewtEGARCH/output_15_0.png

如果我们想要以数据框形式获取预测结果,可以使用predict()来代替。

我们还可以通过add_leverage()来估计带有杠杆效应的Beta-t-EGARCH模型:

skewt_model = pf.SEGARCH(p=1,q=1,data=returns,target='JPM Returns')
skewt_model.add_leverage()
x = skewt_model.fit()
x.summary()

SEGARCH(1,1)
======================================== =================================================
Dependent Variable: JPM Returns          Method: MLE
Start Date: 2006-01-05 00:00:00          Log Likelihood: 6684.9381
End Date: 2016-03-10 00:00:00            AIC: -13355.8762
Number of observations: 2562             BIC: -13314.9364
==========================================================================================
Latent Variable           Estimate   Std Error  z        P>|z|    95% C.I.
========================= ========== ========== ======== ======== ========================
Vol Constant              -0.1203    0.0152     -7.898   0.0      (-0.1501 | -0.0904)
p(1)                      0.9857
q(1)                      0.1097
Leverage Term             0.0713     0.0095     7.5284   0.0      (0.0527 | 0.0899)
Skewness                  0.9984
v                         5.9741
Returns Constant          0.0004     0.0001     6.9425   0.0      (0.0003 | 0.0006)
==========================================================================================

该时间序列存在轻微的杠杆效应。我们可以绘制拟合结果:

skewt_model.plot_fit(figsize=(15,5))
http://www.pyflux.com/notebooks/SkewtEGARCH/output_19_0.png

我们可以用新模型进行预测绘图:

skewt_model.plot_predict(h=30,figsize=(15,5))
http://www.pyflux.com/notebooks/SkewtEGARCH/output_21_0.png

类描述

class SEGARCH(data, p, q, target)

Beta 偏斜-t EGARCH 模型

参数 类型 描述
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()对象,包括先验设置、任何拟合值、初始值和其他潜在变量信息。当模型被拟合时,这里就是潜在变量被更新/存储的地方。有关此对象内属性的信息以及访问潜在变量信息的方法,请参阅潜在变量文档。

方法

add_leverage()

在模型中添加一个杠杆项,意味着波动率可以对消息的符号做出不同反应;详见Harvey和Succarrat(2013)的研究。此时条件波动率将遵循:

\[\lambda_{t\mid{t-1}} = \alpha_{0} + \sum^{p}_{i=1}\alpha_{i}\lambda_{t-i} + \sum^{q}_{j=1}\beta_{j}u_{t-j} + \kappa\left(\text{sgn}\left(-\epsilon_{t-1}\right)(u_{t-1}+1)\right)\]
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.mean or np.max
nsims 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.mean or np.max
nsims 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 - 来自后验预测密度的样本。

参考文献

布莱克, F. (1976) 股票价格波动变化研究。见: 美国统计协会1976年会议论文集。第171-181页。

Fernandez, C., & Steel, M. F. J. (1998a). 关于厚尾和偏态的贝叶斯建模研究。美国统计学会期刊,93卷,359-371页。

哈维,A.C. 和 查克拉瓦蒂,T. (2008) Beta-t-(E)GARCH。剑桥大学经济系经济学工作论文0840号,2008年。[第137页]

Harvey, A.C. & Sucarrat, G. (2013) 具有厚尾、偏态和杠杆效应的EGARCH模型。《计算统计与数据分析》,即将出版,2013年。网址 http://dx.doi.org/10.1016/j.csda.2013.09。022. [第138、139、140、143页]

Nelson, D. B. (1991), 《资产收益的条件异方差性:一种新方法》, 计量经济学 59, 347—370.