本篇利用Python实现了ARCH相关函数的实现,包括ARCH效应检验和模型建立,以及GARCH模型的建立和波动率的预测,还介绍了GARCH的推广,例如GJR-GARCH,TARCH,EGARCH等。
摘要
1 ARCH模型
1.1 ARCH模型简介
1.2 ARCH效应检验
1.3 ARCH模型建立
2. GARCH模型
2.1 GARCH模型简介
2.2 GARCH模型波动率预测
2.2.1 根据均值方程预测atatatata_t
2.2.2 根据波动率方程预测σ2tσ2tσ2tσ2t\sigma^2_t
3. GARCH模型的推广
3.1 GJR-GARCH
3.2 TARCH
3.3 T学生分布
3.4 EGARCH
后记
from scipy import statsimport statsmodels.api as smfrom jqdata import macroimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltmatplotlib.rcParams['axes.unicode_minus']=False # 解决负号显示异常的问题import arch
1. ARCH模型¶
之前介绍的ARMA相关的模型主要基于同方差的假设,但是在实际情况中,同方差并不是一个很容易满足的条件。因此考虑波动率的变化情况是十分必要的。本篇介绍资产收益波动率的建模和统计方法,着眼于考虑波动率的变化情况,因此称之为条件异方差模型,即ARCH模型。
虽然波动率不可直接观测,但是在一些资产收益率时间序列中却普遍存在以下情况: (1)存在波动率聚集,也就是波动率可能在一些时间段上高,另一些时间段上低。 (2)波动率以连续方式随时间变化,即波动率跳跃很少见。 (3)波动率不发散到无穷,即波动率在固定范围内变化,从统计学角度说,这意味着波动率往往是平稳的。 (4)波动率对价格大幅上升和价格大幅下降的反应不同,这种现象称为杠杆效应。
1.1 ARCH模型简介¶
ARCH模型的基本思想是:资产收益率的扰动$a_t$是序列不相关的,但不是独立的;$a_t$的不独立性可以用其延迟值的简单二次函数来描述。具体来说,一个m阶的ARCH模型是假定: $$a_t = \sigma_t \epsilon_t \\ \sigma^2_t = \alpha_0 + \alpha_1 a^2_{t-1} + \cdots + \alpha_m a^2_{t-m}$$ 其中,$\{ \epsilon_t \}$是均值为0,方差为1的独立同分布随机变量序列,$\alpha_0 >0, \alpha_1, \cdots, \alpha_m \geq 0$. 从上式中可以看出,过去的平方扰动$\{ a^2_{t-i} \}^m_{i=1}$会影响方差项$\{ \sigma^2_t \}$;也就是,大的扰动会倾向于紧接着出现另一个大的扰动,这很好的刻画了波动率聚集现象。
仍然以上证指数日涨跌幅数据为例:
# 获取股票涨跌幅def get_pct_change(scu,count,date,fqy='1d'):df=get_price(security=scu,count=count+1,end_date=date,fields=['close'],frequency=fqy)return df['close',:,:].pct_change().iloc[1:,:]
XSHG_chgpct = get_pct_change(scu=['000001.XSHG'], count=500, date='2016-12-31',fqy='1d')XSHG_chgpct.plot(figsize = (15,6), grid = True)
<matplotlib.axes._subplots.AxesSubplot at 0x7fbb99656250>
t = sm.tsa.stattools.adfuller(XSHG_chgpct['000001.XSHG']) # ADF检验print "p-value: ",t[1]
p-value: 9.41981252875e-07
p<0.05, 认为序列是平稳的,建立AR(p)模型,并判断阶数。
fig = plt.figure(figsize=(15,6))ax1=fig.add_subplot(111)fig = sm.graphics.tsa.plot_pacf(XSHG_chgpct,lags = 10,ax=ax1)
/opt/conda/envs/python2/lib/python2.7/site-packages/matplotlib/collections.py:590: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison if self._edgecolors == str('face'):
#根据上图,建立AR(4)模型XSHG_chgpct_model = sm.tsa.ARMA(XSHG_chgpct, (4,0)).fit()
1.2 ARCH效应检验¶
同上篇文章自相关函数的序列检验方法,计算均值方程的残差: $$a_t = r_t - \mu_t$$并作出残差和残差平方图像:
at = XSHG_chgpct - XSHG_chgpct_model.fittedvaluesat2 = np.square(at)plt.figure(figsize=(10,6))plt.subplot(211)plt.plot(at,label = 'at')plt.legend()plt.subplot(212)plt.plot(at2,label='at^2')plt.legend(loc=0)
/opt/conda/envs/python2/lib/python2.7/site-packages/pandas/core/frame.py:3200: FutureWarning: TimeSeries broadcasting along DataFrame index by default is deprecated. Please use DataFrame.<op> to explicitly broadcast arithmetic operations along the index FutureWarning)
<matplotlib.legend.Legend at 0x7fbb8d616f50>
acf,q,p = sm.tsa.acf(at2,nlags=20,qstat=True) ## 计算自相关系数及p-valueout = np.c_[range(1,21), acf[1:], q, p]output=pd.DataFrame(out, columns=['lag', "AC", "Q", "P-value"])output = output.set_index('lag')output
AC | Q | P-value | |
---|---|---|---|
lag | |||
1 | 0.198078 | 19.735461 | 8.893571e-06 |
2 | 0.248483 | 50.855380 | 9.055128e-12 |
3 | 0.222961 | 75.961321 | 2.254517e-16 |
4 | 0.202117 | 96.634070 | 5.118884e-20 |
5 | 0.160051 | 109.623429 | 4.921288e-22 |
6 | 0.092943 | 114.012538 | 2.941310e-22 |
7 | 0.127734 | 122.319465 | 2.518106e-23 |
8 | 0.091204 | 126.563057 | 1.457495e-23 |
9 | 0.071239 | 129.157383 | 1.767276e-23 |
10 | 0.109735 | 135.325770 | 3.816124e-24 |
11 | 0.079323 | 138.555508 | 3.203215e-24 |
12 | 0.118699 | 145.802306 | 4.020897e-25 |
13 | 0.185349 | 163.508563 | 3.837089e-28 |
14 | 0.116069 | 170.466309 | 5.512235e-29 |
15 | 0.097599 | 175.396022 | 2.011711e-29 |
16 | 0.186076 | 193.352004 | 1.742687e-32 |
17 | 0.100148 | 198.564084 | 5.564529e-33 |
18 | 0.103919 | 204.187754 | 1.454536e-33 |
19 | 0.094940 | 208.891335 | 5.757735e-34 |
20 | 0.135340 | 218.469490 | 2.412120e-35 |
p<0.05,认为残差序列具有相关性,符合异方差的假设,因此具有ARCH效应。
1.3 ARCH模型建立¶
用$\{ a^2_t \}$序列偏自相关函数(pACF)确定:
figure = plt.figure(figsize=(20,5))ax1 = figure.add_subplot(111)fig = sm.graphics.tsa.plot_pacf(at2,lags = 20, ax=ax1)
粗略选择ARCH模型阶数为4阶,根据之前的分析,AR模型的阶数为4阶。建立模型如下:
train_ARCH = XSHG_chgpct[:-10]test_ARCH = XSHG_chgpct[-10:]am_ARCH = arch.arch_model(train_ARCH, mean='AR', lags=4, vol='ARCH', p=4) res_ARCH = am_ARCH.fit()
Iteration: 1, Func. Count: 12, Neg. LLF: -1265.11156097 Iteration: 2, Func. Count: 31, Neg. LLF: -1265.26321446 Iteration: 3, Func. Count: 46, Neg. LLF: -1268.23077171 Iteration: 4, Func. Count: 62, Neg. LLF: -1268.38085284 Iteration: 5, Func. Count: 76, Neg. LLF: -1268.44728035 Iteration: 6, Func. Count: 90, Neg. LLF: -1269.15006686 Iteration: 7, Func. Count: 104, Neg. LLF: -1269.63810452 Iteration: 8, Func. Count: 118, Neg. LLF: -1270.04321783 Iteration: 9, Func. Count: 131, Neg. LLF: -1271.23378798 Iteration: 10, Func. Count: 144, Neg. LLF: -1271.96804469 Iteration: 11, Func. Count: 158, Neg. LLF: -1272.34895828 Iteration: 12, Func. Count: 171, Neg. LLF: -1273.07486479 Iteration: 13, Func. Count: 184, Neg. LLF: -1273.15219728 Iteration: 14, Func. Count: 197, Neg. LLF: -1273.72913292 Iteration: 15, Func. Count: 209, Neg. LLF: -1274.69850975 Iteration: 16, Func. Count: 222, Neg. LLF: -1274.75050645 Iteration: 17, Func. Count: 235, Neg. LLF: -1274.80335829 Iteration: 18, Func. Count: 247, Neg. LLF: -1274.81024722 Iteration: 19, Func. Count: 259, Neg. LLF: -1274.81159778 Iteration: 20, Func. Count: 271, Neg. LLF: -1274.81161492 Optimization terminated successfully. (Exit mode 0) Current function value: -1274.81161529 Iterations: 20 Function evaluations: 272 Gradient evaluations: 20
res_ARCH.summary(), res_ARCH.params
(<class 'statsmodels.iolib.summary.Summary'> """ AR - ARCH Model Results ============================================================================== Dep. Variable: 000001.XSHG R-squared: -0.001 Mean Model: AR Adj. R-squared: -0.009 Vol Model: ARCH Log-Likelihood: 1274.81 Distribution: Normal AIC: -2529.62 Method: Maximum Likelihood BIC: -2487.76 No. Observations: 486 Date: Tue, Nov 21 2017 Df Residuals: 476 Time: 15:21:19 Df Model: 10 Mean Model ================================================================================= coef std err t P>|t| 95.0% Conf. Int. - Const 7.4239e-04 5.928e-07 1252.297 0.000 [7.412e-04,7.435e-04] 0000...SHG[1] 0.0755 9.635e-03 7.833 4.753e-15 [5.659e-02,9.436e-02] 0000...SHG[2] -0.1017 2.675e-02 -3.801 1.442e-04 [ -0.154,-4.925e-02] 0000...SHG[3] -0.0300 6.519e-03 -4.609 4.045e-06 [-4.283e-02,-1.727e-02] 0000...SHG[4] -0.0476 1.622e-02 -2.932 3.366e-03 [-7.937e-02,-1.577e-02] Volatility Model =============================================================================== coef std err t P>|t| 95.0% Conf. Int. - omega 1.2184e-04 8.472e-10 1.438e+05 0.000 [1.218e-04,1.218e-04] alpha[1] -1.0180e-14 5.071e-02 -2.007e-13 1.000 [-9.940e-02,9.940e-02] alpha[2] 0.3320 3.667e-02 9.055 1.363e-19 [ 0.260, 0.404] alpha[3] 0.2590 1.479e-02 17.517 1.056e-68 [ 0.230, 0.288] alpha[4] 0.1972 3.818e-02 5.165 2.400e-07 [ 0.122, 0.272] =============================================================================== Covariance estimator: robust """, Const 7.423861e-04 0000...SHG[1] 7.547658e-02 0000...SHG[2] -1.016841e-01 0000...SHG[3] -3.004857e-02 0000...SHG[4] -4.756994e-02 omega 1.218369e-04 alpha[1] -1.018029e-14 alpha[2] 3.320260e-01 alpha[3] 2.590258e-01 alpha[4] 1.971899e-01 Name: params, dtype: float64)
因此,模型为: $$r_t = 0.00074 + 0.07548a_t - 0.10168a_{t-1} - 0.03005a_{t-2} - 0.04757a_{t-3} \\ \sigma^2_t = 0.00012 - 1.018 × 10^{-14}a^2_{t-1} + 0.33203a^2_{t-2} + 0.25903a^2_{t-3} + 0.19719a^2_{t-4}$$
可以看出,上证指数日收益率期望大约为0.07%,根据AdjR²值,模型拟合效果较差。
res_ARCH.hedgehog_plot()
len(train_ARCH)
490
pre_ARCH = res_ARCH.forecast(horizon=10,start=489).iloc[489]plt.figure(figsize=(10,4))plt.plot(test_ARCH,label='realValue')pre_ARCH.plot(label='predictValue')plt.plot(np.zeros(10),label='zero')plt.legend(loc=0)
<matplotlib.legend.Legend at 0x7fbb8d2c3950>
预测效果实在很差hhhh.
2. GARCH模型¶
ARCH模型在描述波动率的过程中,为了充分描述资产收益的波动情况,往往需要很多参数。下面引入广义的ARCH模型来修正ARCH模型的不足,及GARCH(generalized ARCH)模型。
2.1 GARCH模型简介¶
对于收益率序列$r_t$, 令$a_t = r_t - \mu_t$,称$a_t$服从GARCH(m,s)模型,若$a_t$满足:
$$a_t = \sigma_t \epsilon_t \\ \sigma^2_t = \alpha_0 + \sum^m_{i=1}\alpha_i a^2_{t-i} + \sum^s_{j=1} \beta_j \sigma^2_{t-j}$$
其中 $$\forall i>0, \alpha_0 > 0, \alpha_i \geq 0, \beta_j \geq 0, \sum^{max(m,s)}_{i=1} (\alpha_i + \beta_j) <1$$ 其中,$\{ \epsilon_t \}$是均值为0,方差为1的独立同分布随机变量序列。
ARCH模型的建模方法也可以用来建立GARCH模型,然而GARCH模型定阶较困难,在实际中只用到低阶的GARCH模型,如GARCH(1,1)、GARCH(1,2)和GARCH(2,1)等。
仍以之前的数据为例,构建GARCH模型,均值方程取AR(4)模型,波动率方程取GARCH(1,1)模型:
train_GARCH = XSHG_chgpct[:-10]test_GARCH = XSHG_chgpct[-10:]am_GARCH = arch.arch_model(train_GARCH, mean='AR',lags=4,vol='GARCH') res_GARCH = am_GARCH.fit()
Iteration: 1, Func. Count: 10, Neg. LLF: -1291.27825127 Positive directional derivative for linesearch (Exit mode 8) Current function value: -1291.27825128 Iterations: 5 Function evaluations: 10 Gradient evaluations: 1
res_GARCH.summary(), res_GARCH.params
(<class 'statsmodels.iolib.summary.Summary'> """ AR - GARCH Model Results ============================================================================== Dep. Variable: 000001.XSHG R-squared: 0.030 Mean Model: AR Adj. R-squared: 0.022 Vol Model: GARCH Log-Likelihood: 1291.28 Distribution: Normal AIC: -2566.56 Method: Maximum Likelihood BIC: -2533.07 No. Observations: 486 Date: Tue, Nov 21 2017 Df Residuals: 478 Time: 15:21:22 Df Model: 8 Mean Model ================================================================================== coef std err t P>|t| 95.0% Conf. Int. Const 1.7975e-04 2.975e-07 604.215 0.000 [1.792e-04,1.803e-04] 0000...SHG[1] 0.0825 2.686e-03 30.712 3.927e-207 [7.723e-02,8.776e-02] 0000...SHG[2] -0.0868 2.571e-03 -33.775 4.595e-250 [-9.186e-02,-8.178e-02] 0000...SHG[3] -4.4177e-03 2.903e-03 -1.522 0.128 [-1.011e-02,1.272e-03] 0000...SHG[4] 0.1229 1.703e-03 72.122 0.000 [ 0.120, 0.126] Volatility Model ============================================================================== coef std err t P>|t| 95.0% Conf. Int. omega 7.9959e-06 2.697e-21 2.965e+15 0.000 [7.996e-06,7.996e-06] alpha[1] 0.1000 4.734e-04 211.216 0.000 [9.907e-02, 0.101] beta[1] 0.8800 3.548e-04 2480.279 0.000 [ 0.879, 0.881] ============================================================================== Covariance estimator: robust """, Const 0.000180 0000...SHG[1] 0.082499 0000...SHG[2] -0.086822 0000...SHG[3] -0.004418 0000...SHG[4] 0.122853 omega 0.000008 alpha[1] 0.100000 beta[1] 0.880000 Name: params, dtype: float64)
得到模型: $$r_t = 0.00018 + 0.08250a_t - 0.08682a_{t-1} - 0.00442a_{t-2} + 0.12285a_{t-3} \\ \sigma^2_{t} = 0.000008 + 0.1a^2_{t-1} + 0.88\sigma^2_{t-1}$$
res_GARCH.hedgehog_plot()
可以看出,方差的还原还不错。
2.2 GARCH模型波动率预测¶
2.2.1 根据均值方程预测$a_t$¶
提取均值方程的系数向量,逐个计算$a_t$后面的10个值:
ini = res_GARCH.resid[-4:]a = np.array(res_GARCH.params[1:5])w = a[::-1] # 系数for i in range(10):new = test_GARCH.iloc[i] - (res_GARCH.params[0] + w.dot(ini[-4:]))ini = np.append(ini,new)print len(ini)at_pre = ini[-10:]at_pre2 = at_pre**2at_pre2
14
array([ 9.65171549e-06, 1.29592813e-05, 1.43107182e-04, 1.95905001e-06, 6.44071417e-05, 2.34988199e-05, 2.79190993e-05, 1.00915325e-05, 1.81691680e-06, 2.16753512e-06])
2.2.2 根据波动率方程预测$\sigma^2_t$¶
ini2 = res_GARCH.conditional_volatility[-2:] #上两个条件异方差值for i in range(10):new = res_GARCH.params['omega'] + res_GARCH.params['alpha[1]']*at_pre2[i] + res_GARCH.params['beta[1]']*ini2[-1]ini2 = np.append(ini2,new)vol_pre = ini2[-10:]vol_pre
array([ 0.010515 , 0.00926249, 0.0081733 , 0.00720069, 0.00635105, 0.00559927, 0.00493814, 0.00435457, 0.0038402 , 0.00338759])
将原始数据、条件异方差拟合数据和预测数据画出来,如图:
plt.figure(figsize=(15,5))plt.plot(XSHG_chgpct,label='origin_data')plt.plot(res_GARCH.conditional_volatility,label='conditional_volatility')x = range(490,500)plt.plot(x,vol_pre,'.r',label='predict_volatility')plt.legend(loc=0)
<matplotlib.legend.Legend at 0x7fbb8d09ff10>
3. GARCH模型的推广¶
3.1 GJR-GARCH¶
在GARCH模型中,正负冲击对条件方差的影响是对称的。为衡量收益率波动的非对称性,Glosten等人提出了GJR—GARCH模型,也称作门限GARCH(或T-GARCH模型),它引入了一个示性函数$\{N_{ {t-k}}\}$,即 $$N_{t-k}= \begin{cases} 1,& \text{若$a_{t-k} < 0$}\\ 0,& \text{若$a_{t-k} \geq 0$} \end{cases}$$ 它的波动率方程可以写为:
$$\sigma^2_t = \alpha_0 + \sum^s_{i=1} \alpha_i a^2_{t-i} + \sum^n_{k=1} \gamma_k N_{t-k} a^2_{t-k} + \sum^m_{j=1} \beta_j \sigma^2_{t-j}$$
在arch函数包中,三个求和项的项数分别为p,o,q,我们仍以上证指数日收益率为例,设定p,o,q的值均为1。
am_GJR = arch.arch_model(XSHG_chgpct, p=1, o=1, q=1)res_GJR = am_GJR.fit(update_freq=5, disp='off')print(res_GJR.summary(), res_GJR.params)
(<class 'statsmodels.iolib.summary.Summary'> """ Constant Mean - GJR-GARCH Model Results ============================================================================== Dep. Variable: 000001.XSHG R-squared: 0.000 Mean Model: Constant Mean Adj. R-squared: 0.000 Vol Model: GJR-GARCH Log-Likelihood: 1335.04 Distribution: Normal AIC: -2660.07 Method: Maximum Likelihood BIC: -2639.00 No. Observations: 500 Date: Tue, Nov 21 2017 Df Residuals: 495 Time: 15:21:25 Df Model: 5 Mean Model ============================================================================== coef std err t P>|t| 95.0% Conf. Int. mu 3.0370e-04 2.199e-09 1.381e+05 0.000 [3.037e-04,3.037e-04] Volatility Model ============================================================================== coef std err t P>|t| 95.0% Conf. Int. omega 8.0647e-06 1.355e-20 5.950e+14 0.000 [8.065e-06,8.065e-06] alpha[1] 0.1000 1.570e-03 63.697 0.000 [9.692e-02, 0.103] gamma[1] 0.0100 2.655e-03 3.767 1.653e-04 [4.797e-03,1.520e-02] beta[1] 0.8750 4.585e-04 1908.285 0.000 [ 0.874, 0.876] ============================================================================== Covariance estimator: robust """, mu 0.000304 omega 0.000008 alpha[1] 0.100000 gamma[1] 0.010000 beta[1] 0.875000 Name: params, dtype: float64)
由此得到波动率方程为: $$\sigma^2_t = 0.000008 + 0.1a^2_{t-1} + 0.01 N_{t-1} a^2_{t-1} + 0.875 \sigma^2_{t-1}$$
3.2 TARCH¶
TARCH模型(ZARCH)是将波动率的平方变为绝对值,即将默认值power=2改为1,波动率公式为: $$\sigma_t = \alpha_0 + \sum^s_{i=1} \alpha_i \left|a_{t-i}\right| + \sum^n_{k=1} \gamma_k N_{t-k} \left| a_{t-k}\right| + \sum^m_{j=1} \beta_j \sigma_{t-j},$$ 或者,更一般地,可以改为$\kappa$阶。
am_TARCH = arch.arch_model(XSHG_chgpct, p=1, o=1, q=1, power=1.0)res_TARCH = am_TARCH.fit(update_freq=5)print(res_TARCH.summary(), res_TARCH.params)
Iteration: 5, Func. Count: 49, Neg. LLF: -1333.05710211 Iteration: 10, Func. Count: 85, Neg. LLF: -1340.2415358 Iteration: 15, Func. Count: 120, Neg. LLF: -1340.28522071 Optimization terminated successfully. (Exit mode 0) Current function value: -1340.2852807 Iterations: 17 Function evaluations: 138 Gradient evaluations: 16 (<class 'statsmodels.iolib.summary.Summary'> """ Constant Mean - TARCH/ZARCH Model Results ============================================================================== Dep. Variable: 000001.XSHG R-squared: -0.000 Mean Model: Constant Mean Adj. R-squared: -0.000 Vol Model: TARCH/ZARCH Log-Likelihood: 1340.29 Distribution: Normal AIC: -2670.57 Method: Maximum Likelihood BIC: -2649.50 No. Observations: 500 Date: Tue, Nov 21 2017 Df Residuals: 495 Time: 15:21:26 Df Model: 5 Mean Model ============================================================================== coef std err t P>|t| 95.0% Conf. Int. mu 4.3385e-04 4.075e-07 1064.628 0.000 [4.331e-04,4.347e-04] Volatility Model ============================================================================== coef std err t P>|t| 95.0% Conf. Int. omega 2.6779e-04 2.812e-04 0.952 0.341 [-2.833e-04,8.189e-04] alpha[1] 0.0600 0.344 0.175 0.861 [ -0.614, 0.734] gamma[1] 0.0170 1.144 1.488e-02 0.988 [ -2.225, 2.259] beta[1] 0.9315 3.486 0.267 0.789 [ -5.901, 7.764] ============================================================================== Covariance estimator: robust """, mu 0.000434 omega 0.000268 alpha[1] 0.060007 gamma[1] 0.017016 beta[1] 0.931485 Name: params, dtype: float64)
由此得到波动率方程为: $$\sigma_t = 0.00027 + 0.06 \left|a_{t-1}\right| + 0.017 N_{t-1} \left| a_{t-1}\right| + 0.9315 \sigma_{t-1},$$
3.3 T学生分布¶
由于收益率序列经常是厚尾的,有时候用学生分布(t-分布)替代正态分布,如下所示:
am_t = arch.arch_model(XSHG_chgpct, p=1, o=1, q=1, dist = 'StudentsT')res_t = am_t.fit(update_freq=5)print(res_t.summary(), res_t.params)
Iteration: 5, Func. Count: 60, Neg. LLF: -1361.92464974 Iteration: 10, Func. Count: 105, Neg. LLF: -1368.18523019 Iteration: 15, Func. Count: 150, Neg. LLF: -1371.4149911 Iteration: 20, Func. Count: 192, Neg. LLF: -1372.78754568 Iteration: 25, Func. Count: 232, Neg. LLF: -1372.90852692 Optimization terminated successfully. (Exit mode 0) Current function value: -1372.90852692 Iterations: 25 Function evaluations: 232 Gradient evaluations: 25 (<class 'statsmodels.iolib.summary.Summary'> """ Constant Mean - GJR-GARCH Model Results ==================================================================================== Dep. Variable: 000001.XSHG R-squared: -0.001 Mean Model: Constant Mean Adj. R-squared: -0.001 Vol Model: GJR-GARCH Log-Likelihood: 1372.91 Distribution: Standardized Student's t AIC: -2733.82 Method: Maximum Likelihood BIC: -2708.53 No. Observations: 500 Date: Tue, Nov 21 2017 Df Residuals: 494 Time: 15:21:26 Df Model: 6 Mean Model ============================================================================== coef std err t P>|t| 95.0% Conf. Int. mu 1.0085e-03 1.752e-07 5756.453 0.000 [1.008e-03,1.009e-03] Volatility Model ============================================================================== coef std err t P>|t| 95.0% Conf. Int. omega 1.2573e-06 2.674e-15 4.703e+08 0.000 [1.257e-06,1.257e-06] alpha[1] 0.0776 5.121e-04 151.540 0.000 [7.660e-02,7.860e-02] gamma[1] 6.5835e-03 1.107e-03 5.946 2.746e-09 [4.413e-03,8.754e-03] beta[1] 0.9191 2.066e-04 4448.758 0.000 [ 0.919, 0.920] Distribution ============================================================================== coef std err t P>|t| 95.0% Conf. Int. nu 3.9599 7.427e-02 53.317 0.000 [ 3.814, 4.105] ============================================================================== Covariance estimator: robust """, mu 0.001009 omega 0.000001 alpha[1] 0.077601 gamma[1] 0.006584 beta[1] 0.919107 nu 3.959875 Name: params, dtype: float64)
由此得到波动率方程为: $$\sigma^2_t = 0.000001 + 0.077601a^2_{t-1} + 0.006584 N_{t-1} a^2_{t-1} + 0.919107 \sigma^2_{t-1}$$
3.4 EGARCH¶
为了进一步描述杠杆效应,Nelson提出了指数GARCH(EGARCH模型),体现正负资产收益率的非对称效应。这里我们以GJR-GARCH(1,1,1)为例,即在GARCH模型的基础上,考虑引入的示性函数,写出EGARCH模型的函数如下:
$$ln(\sigma^2_t) = \alpha_0 + \alpha_1 \frac{\left | a_{t-1} \right | + \gamma_1 a_{t-1}}{\sigma_{t-1}} + \beta_1 ln(\sigma^2_{t-1})$$
可以看出,正的$a_{t-1}$对对数波动率的贡献为$ \frac{a_{t-1}\alpha_1 (1 + \gamma_1)}{\sigma_{t-1}}$,负的$a_{t-1}$对对数波动率的贡献为$\frac{a_{t-1}\alpha_1 (1 - \gamma_1)}{\sigma_{t-1}}$.
am_EGARCH = arch.arch_model(XSHG_chgpct, mean='AR',lags=4,vol='EGARCH',p=1,o=1,q=1) res_EGARCH = am_EGARCH.fit()print(res_EGARCH.summary(), res_EGARCH.params)
Iteration: 1, Func. Count: 11, Neg. LLF: -1330.07873751 Iteration: 2, Func. Count: 29, Neg. LLF: -1330.09727084 Iteration: 3, Func. Count: 44, Neg. LLF: -1332.89992713 Iteration: 4, Func. Count: 59, Neg. LLF: -1333.52532992 Iteration: 5, Func. Count: 73, Neg. LLF: -1333.93506431 Iteration: 6, Func. Count: 88, Neg. LLF: -1334.04466384 Iteration: 7, Func. Count: 102, Neg. LLF: -1334.06362229 Iteration: 8, Func. Count: 115, Neg. LLF: -1334.11448845 Iteration: 9, Func. Count: 127, Neg. LLF: -1334.96429337 Iteration: 10, Func. Count: 140, Neg. LLF: -1335.35692036 Iteration: 11, Func. Count: 152, Neg. LLF: -1336.78394647 Iteration: 12, Func. Count: 164, Neg. LLF: -1336.87575367 Iteration: 13, Func. Count: 176, Neg. LLF: -1337.05120666 Iteration: 14, Func. Count: 188, Neg. LLF: -1337.09318812 Iteration: 15, Func. Count: 200, Neg. LLF: -1337.15260228 Iteration: 16, Func. Count: 211, Neg. LLF: -1337.15844619 Iteration: 17, Func. Count: 222, Neg. LLF: -1337.16598411 Iteration: 18, Func. Count: 233, Neg. LLF: -1337.16675658 Iteration: 19, Func. Count: 244, Neg. LLF: -1337.16694513 Iteration: 20, Func. Count: 255, Neg. LLF: -1337.16696696 Iteration: 21, Func. Count: 266, Neg. LLF: -1337.16696867 Optimization terminated successfully. (Exit mode 0) Current function value: -1337.16696867 Iterations: 21 Function evaluations: 266 Gradient evaluations: 21 (<class 'statsmodels.iolib.summary.Summary'> """ AR - EGARCH Model Results ============================================================================== Dep. Variable: 000001.XSHG R-squared: 0.019 Mean Model: AR Adj. R-squared: 0.011 Vol Model: EGARCH Log-Likelihood: 1337.17 Distribution: Normal AIC: -2656.33 Method: Maximum Likelihood BIC: -2618.47 No. Observations: 496 Date: Tue, Nov 21 2017 Df Residuals: 487 Time: 16:08:14 Df Model: 9 Mean Model ================================================================================= coef std err t P>|t| 95.0% Conf. Int. - Const 2.2140e-04 4.758e-07 465.341 0.000 [2.205e-04,2.223e-04] 0000...SHG[1] 0.0158 5.955e-03 2.650 8.056e-03 [4.107e-03,2.745e-02] 0000...SHG[2] -0.0431 2.946e-03 -14.625 1.946e-48 [-4.886e-02,-3.731e-02] 0000...SHG[3] 0.0183 3.158e-03 5.779 7.526e-09 [1.206e-02,2.444e-02] 0000...SHG[4] 0.0603 3.713e-03 16.247 2.329e-59 [5.305e-02,6.760e-02] Volatility Model ============================================================================== coef std err t P>|t| 95.0% Conf. Int. omega -0.0423 4.726e-03 -8.959 3.266e-19 [-5.160e-02,-3.308e-02] alpha[1] 0.1250 2.220e-03 56.295 0.000 [ 0.121, 0.129] gamma[1] -0.0183 1.244e-03 -14.713 5.301e-49 [-2.074e-02,-1.586e-02] beta[1] 0.9942 7.519e-05 1.322e+04 0.000 [ 0.994, 0.994] ============================================================================== Covariance estimator: robust """, Const 0.000221 0000...SHG[1] 0.015778 0000...SHG[2] -0.043086 0000...SHG[3] 0.018251 0000...SHG[4] 0.060325 omega -0.042338 alpha[1] 0.125001 gamma[1] -0.018302 beta[1] 0.994160 Name: params, dtype: float64)
由此得到波动率方程为: $$ln(\sigma^2_t) = -0.0423 + 0.125 \frac{\left | a_{t-1} \right | + -0.018 a_{t-1}}{\sigma_{t-1}} + 0.994 ln(\sigma^2_{t-1})$$
后记¶
关于ARCH相关的模型还有很多,例如GARCH-M, HARCH等等,还有各种函数对均值方程和波动方程的参数进行了调整,有兴趣的读者可以参阅Kevin Sheppard写的arch Documentation,这是目前我所见到的关于arch函数包阐述最全面的文档. 另外,还可以参阅qua*pian上的的广义矩估计方法(GMM)对于GARCH模型的阶数进行判断, 最后,有兴趣的读者可以学习一些更加复杂的ARCH相关模型的使用,我发现了一个pyflux函数包,可以实现例如长记忆模型,GAS模型等等,它对于模型的介绍、公式、实现方法及代码都写的非常清晰。由于平台目前无没有此函数包,暂时没有办法进行调试。