1.8 使用固定方差过程
FixedVariance波动率过程当两步过程在收敛之前不断重复时可以实现之字形(zig-zag)模型估计.当遇到数值问题或者高维参数空间问题时,该法可以用来估计那些通常看来难以估计的模型。
import warnings
warnings.simplefilter('ignore')
# %matplotlib inline
import seaborn
seaborn.set_style('darkgrid')
seaborn.mpl.rcParams['figure.figsize'] = (10.0, 6.0)
seaborn.mpl.rcParams['savefig.dpi'] = 90
seaborn.mpl.rcParams['font.family'] = 'serif'
seaborn.mpl.rcParams['font.size'] = 14
1.8.1 Setup
该例中引入的包:
#本例需要在 IPython notebook下使用
import datetime as dt
import numpy as np
from pandas_datareader import data
1.8.2 数据
VIX指数用来说明 FixedVariance过程用法
. 该数据读取使用 pandas-datareader方法
.
dr = data.FredReader('VIXCLS', dt.datetime(2000, 1, 1), dt.datetime(2017, 12, 31))
vix_data = dr.read()
vix = vix_data.VIXCLS.dropna()
vix.name = 'VIX Index'
ax = vix.plot(title='VIX Index')
1.8.3 初始化均值模型估计
第一步是使用常数方差来估计均值模型,从而得到残差。
from arch.univariate.mean import HARX, ZeroMean
from arch.univariate.volatility import GARCH, FixedVariance
mod = HARX(vix, lags=[1,5,22])
res = mod.fit()
print(res.summary())
1.8.4 初始化波动率模型估计
使用上述估计残差,可以利用ZeroMean构建一个波动率模型。在本例中,一个GJR-GARCH 过程可以用于描述方差。
vol_mod = ZeroMean(res.resid.dropna(), volatility=GARCH(p=1,o=1,q=1))
vol_res = vol_mod.fit(disp='off')
print(vol_res.summary())
ax = vol_res.plot('D')
(程序结果略)
1.8.5 使用 FixedVariance重新估计均值
FixedVariance方法在模块初始化时就要提供。方差大小应该与原始数据一致。由于HAR的滞后阶数设定,GJR-GARCH模型所得方差丢失了22个观察值,
我们将其填充为1. 这些值将不会用于估计模型,因此,无关紧要。
结果表明,单一参数scale接近于1.均值参数发生了变化,说明重新估计施加了GLS形式的加权影响。
variance = np.empty_like(vix)
variance.fill(1.0)
variance[22:] = vol_res.conditional_volatility ** 2.0
fv = FixedVariance(variance)
mod = HARX(vix, lags=[1,5,22], volatility=fv)
res = mod.fit()
print(res.summary())
1.8.6 Zig-Zag估计
前面两步的简单的重复就可以实现zig-zag策略的估计。
for i in range(5):
print(i)
vol_mod = ZeroMean(res.resid.dropna(), volatility=GARCH(p=1,o=1,q=1))
vol_res = vol_mod.fit(disp='off')
variance[22:] = vol_res.conditional_volatility ** 2.0
fv = FixedVariance(variance, unit_scale=True)
mod = HARX(vix, lags=[1,5,22], volatility=fv)
res = mod.fit(disp='off')
print(res.summary())
1.8.7 直接估计
模型可以被直接估计。该结果是为了便于和此前的FixedVariance方法所得的均值参数进行对比。
mod = HARX(vix, lags=[1,5,22], volatility=GARCH(1,1,1))
res = mod.fit(disp='off')
print(res.summary())