其中,w是均值为0,方差为1的独立同分布时间序列,
,且满足一定条件使得的无条件方差有限。ARCH(p)模型能够很好地刻画金融资产收益率序列的波动特性和厚尾现象,但是其本身并不能用来解释金融资产收益率为何有这样的特征。关于ARCH模型的估计此处不详细展开,感兴趣的可以参见Ruey S. Tray的《金融时间序列分析》和计量经济学教材。下面简要介绍ARCH模型的建模步骤:
(1)检验收益率序列是否平稳,根据自相关性建立合适的均值方程,如ARMA模型,描述收益率如何随时间变化,根据拟合的模型和实际值,得到残差序列。
(2)对拟合的均值方程得到的残差序列进行ARCH效应检验,即检验收益率围绕均值的偏差是否时大时小。检验序列是否具有ARCH效应的方法有两种:Ljung-Box检验和LM检验。
(3)若ARCH效应在统计上显著,则需要再设定一个波动率模型来刻画波动率的动态变化。
(4)对均值方差和波动率方差进行联合估计,即假设实际数据服从前面设定的均值方差和波动率方差后,对均值方差和波动率方差中的参数进行估计,并得到估计的误差。
(5)对拟合的模型进行检验。如果估计结果(残差项)不满足模型本身的假设,则模型的可用性较差。
下面使用Python模拟ARCH模型并对沪深300收益率的ARCH效应进行统计检验。
# 模拟ARCH时间序列 np.random.seed(2) a0 = 2 a1 = .5 y = w = np.random.normal(size=1000) Y = np.empty_like(y) for t in range(1,len(y)): Y[t] = w[t] * np.sqrt((a0 a1*y[t-1]**2)) ts_plot(Y, lags=30,title='模拟ARCH')
def ret_plot(ts, title=''): ts1=ts**2 ts2=np.abs(ts) with plt.style.context('ggplot'): fig = plt.figure(figsize=(12, 6)) layout = (2, 1) ts1_ax = plt.subplot2grid(layout, (0, 0), colspan=2) ts2_ax = plt.subplot2grid(layout, (1, 0)) ts1.plot(ax=ts1_ax) ts1_ax.set_title(title '日收益率平方') ts2.plot(ax=ts2_ax) ts2_ax.set_title(title '日收益率绝对值') plt.tight_layout() return ret_plot(df.ret.dropna(), title='沪深300')
从沪深300的日收益平方和绝对值走势图可以看出,存在较明显的波动聚集的现象,初步可以判断出沪深300日收益序列存在ARCH效应。下面使用Ljung-Box统计量对收益率平方的自相关性进行统计检验。计算Q统计量和LB统计量都是用python中statsmodels模块acorr_ljungbox方法. 默认情况下, acorr_ljungbox只计算LB统计量, 只有当参数boxpierce=True时, 才会输出Q统计量。由LB白噪声检验可以看出,Q统计量的p值都在0.05以下, 表明原假设成立的概率极小, 可以拒绝沪深300收益率的平方是白噪音序列的原假设,说明原序列(沪深300收益率)存在ARCH效应。
def whitenoise_test(ts): '''计算box pierce 和 box ljung统计量''' from statsmodels.stats.diagnostic import acorr_ljungbox q,p=acorr_ljungbox(ts) with plt.style.context('ggplot'): fig = plt.figure(figsize=(10, 4)) axes = fig.subplots(1,2) axes[0].plot(q, label='Q统计量') axes[0].set_ylabel('Q') axes[1].plot(p, label='p值') axes[1].set_ylabel('P') axes[0].legend() axes[1].legend() plt.tight_layout() return ret=df.ret.dropna() whitenoise_test(ret**2)