通常认为,横截面数据容易存在异方差,而时间序列数据常存在自相关。然而,Engle(1982)指出,时间序列数据也常存在一种特殊的异方差,即“自回归条件异方差”(Autoregressive Conditional Heteroskedasticity,简记 ARCH)Bollerslev(1986)对 ARCH 进行了推广,称为“ Generalized ARCH“,简记 GARCH 考察美国道琼斯股指在1953—1990年期间日收益率的波动,参见下图
从图可以看出,股指日收益率在某一段时间内剧烈波动,而在另一段时间内风平浪静。从理论上,这可以抽象为,当本期或过去若干期的波动(方差)较大时,未来几期的波动(方差)很可能也较大;反之亦然。换言之,方差大的观测值似乎集聚在一起,而方差小的观测值似乎也集聚在一起。这被称为“波动性集聚“( volatility clustering)或“扎堆“。
考虑一般的线性回归模型:
yt=x′tβ+εt记扰动项 εt 的条件方差为σ2t≡Var(εt|εt−1,⋯),其中 σ2t 的下标 t 表示条件方差可以随时间而变。受到波动性集聚现象的启发,假设 σ2t 取决于上一期扰动项之平方:
σ2t=α0+α1ε2t−1这就是“ ARCH(1)扰动项”。更一般地,假设 σ2t 依赖于前 p 期扰动项之平方:
σ2t=α0+α1ε2t−1+⋯+αpε2t−p就是“ ARCH(p)扰动项”。不失一般性,以 ARCH(1)扰动项为例,来考察 ARCH 扰动项的性质。假设扰动项 ε2t 的生成过程为:
εt=vt√α0+α1ε2t−1其中,vt 为白噪声,并将其方差标准化为 1,即 Var(vt)=E(v2t)=1。假定 vt 与ϵt−1相互独立,而且α0>0,0<α1<1(为了保证 σ2t 为正,且 {ε2t} 为平稳过程)。序列 {ε2t} 具有怎样的性质呢?下面我们来考察其条件期望、无条件期望、条件方差、无条件方差及序列相关。
由于 vt 与 ϵt−1 相互独立,ϵt 的条件期望为 Var(εt|εt−1)=α0+α1ε2t−1
扰动项 ϵt 完全满足古典模型关于"同方差"与"无自相关"的假定。事实上,虽然 ϵt 存在条件异方差,却是白噪声!因此,高斯-马尔可夫定理成立,OLS 是最佳线性无偏估计( BLUE)。然而,OLS 显然忽略了条件异方差这一重要信息。如果我们跳出线性估计的范围,则可以找到更优的非线性估计,即最大似然估计。
考虑在 ε1 给定情况下的条件最大似然估计法。假设 εt∼N(0,σ2t), 而 σ2t=α0+α1ε2t−1, 可得似然函数:
L=T∏t=21√2π(α0+α1ε2t−1)exp{−ε2t2(α0+α1ε2t−1)}残差平方的自回归模型
from arch import arch_model
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from pylab import mpl
stock = pd.read_excel('../数据/上证指数与沪深300.xlsx')
stock['sz收益率'] = 100*np.log(stock['sz']/stock['sz'].shift(1))
stock = stock.dropna() #删除缺失值
stock = stock.reset_index(drop=True)
# 防止图形中文文字乱码
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 以黑体的字体显示中文
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.title('上证指数收益率', fontsize=14) # 标题,fontsize 为字体大小
# 常见线的属性有:color, label, linewidth, linestyle, marker 等
pic = plt.plot(stock['日期'], stock['sz收益率'], color='blue')
model_arch = arch_model(y=stock['sz收益率'], mean='Constant', lags=0, vol='GARCH',p=1,
o=0, q=1, dist='normal') # 构建 ARCH(1)模型
res = model_arch.fit()
res.summary()
Iteration: 1, Func. Count: 6, Neg. LLF: 730.9983454251976 Iteration: 2, Func. Count: 18, Neg. LLF: 730.7137756168904 Iteration: 3, Func. Count: 26, Neg. LLF: 730.4442239825785 Iteration: 4, Func. Count: 34, Neg. LLF: 730.1517020552867 Iteration: 5, Func. Count: 42, Neg. LLF: 729.9887862346242 Iteration: 6, Func. Count: 48, Neg. LLF: 729.8902710737317 Iteration: 7, Func. Count: 54, Neg. LLF: 729.8799275469953 Iteration: 8, Func. Count: 60, Neg. LLF: 729.8776654073791 Iteration: 9, Func. Count: 66, Neg. LLF: 729.876903523455 Iteration: 10, Func. Count: 72, Neg. LLF: 729.8768999003003 Optimization terminated successfully. (Exit mode 0) Current function value: 729.8768999003294 Iterations: 10 Function evaluations: 72 Gradient evaluations: 10
Dep. Variable: | sz收益率 | R-squared: | -0.000 |
---|---|---|---|
Mean Model: | Constant Mean | Adj. R-squared: | -0.000 |
Vol Model: | GARCH | Log-Likelihood: | -729.877 |
Distribution: | Normal | AIC: | 1467.75 |
Method: | Maximum Likelihood | BIC: | 1484.27 |
No. Observations: | 459 | ||
Date: | Thu, Jun 04 2020 | Df Residuals: | 455 |
Time: | 09:08:30 | Df Model: | 4 |
coef | std err | t | P>|t| | 95.0% Conf. Int. | |
---|---|---|---|---|---|
mu | -0.0321 | 5.253e-02 | -0.612 | 0.541 | [ -0.135,7.082e-02] |
coef | std err | t | P>|t| | 95.0% Conf. Int. | |
---|---|---|---|---|---|
omega | 0.0703 | 5.410e-02 | 1.300 | 0.194 | [-3.571e-02, 0.176] |
alpha[1] | 0.0631 | 3.519e-02 | 1.792 | 7.306e-02 | [-5.895e-03, 0.132] |
beta[1] | 0.8921 | 5.544e-02 | 16.090 | 2.996e-58 | [ 0.783, 1.001] |
pic = res.plot()
fmincon 是用于求解非线性多元函数最小值的 matlab 函数,优化工具箱提供 fmincon 函数用于对有约束优化问题进行求解。
function archL = arch_model(beta,Y,X)
%beta(1)=beta0,beta(2)=a0,beta(3)=a1
% 1.均值方程
T = length(Y);
resid = Y - beta(1)*X;
% 2.方差方程
sigam1 = -0.5*(T-1)*log(2*pi)-0.5*log(beta(2)/(1-beta(3)))-0.5*resid(1)^2/(beta(2)/(1-beta(3)));
for i = 2:T
c1(i-1) = -0.5*log(beta(2)+beta(3)*resid(i-1)^2);
end
for i = 2:T
c2(i-1) = -0.5*log(resid(i).^2/(beta(2)+beta(3)*resid(i-1)^2));
end
archL = sigam1-0.5*(T-1)*log(2*pi)+sum(c1)+sum(c2);
archL = -archL;
% %导入数据
% data = xlsread('C:\Users\Administrator\Desktop\hourse.xlsx');
% f1 = data(:,2); f2 = data(:,3); e = data(:,6);
%
% % 2.初始参数设定
% maxsize = 2000; % 生成均匀随机数的个数(用于赋初值)
% REP = 100; % 若发散则继续进行迭代的次数
% nInitialVectors = [maxsize, 2]; % 生成随机数向量
% MaxFunEvals = 5000; % 函数评价的最大次数
% MaxIter = 5000; % 允许迭代的最大次数
% options = optimset('LargeScale', 'off','HessUpdate', 'dfp','MaxFunEvals', ...
% MaxFunEvals, 'display', 'on', 'MaxIter', MaxIter, 'TolFun', 1e-6, 'TolX', 1e-6,'TolCon',10^-12);
%
% % 3.寻找最优初值
% initialTargetVectors = [unifrnd(0,10, nInitialVectors),unifrnd(0,1,[maxsize,1])];
% RQfval = zeros(nInitialVectors(1), 1);
% for i = 1:nInitialVectors(1)
% RQfval(i) = arch_model (initialTargetVectors(i,:), f1,ones(length(f1),1));
% end
% Results = [RQfval, initialTargetVectors];
% SortedResults = sortrows(Results,1);
% BestInitialCond = SortedResults(1,2: size(Results,2));
%
% % 4.迭代求出最优估计值Beta
% A = [0,0,1] ; b = 1;
% [Beta, fval exitflag] = fmincon(@arch_model,BestInitialCond,A,b,[],[],0,[],[],options,f1,ones(length(f1),1));
% for it = 1:REP
% if exitflag == 1, break, end
% [Beta, fval exitflag] = fmincon(@arch_model,BestInitialCond,A,b,[],[],0,[],[],options,f1,ones(length(f1),1));
% end
% if exitflag~=1, warning('警告:迭代并没有完成'), end