可以参考公众号:Stata: VAR (向量自回归) 模型
我们常常同时关心几个经济变量的预测,比如 GDP 增长率与失业率。一种方法是用单变量时间序列的方法对每个变量分别作预测。另一种方法则是将这些变量放在一起,作为一个系统来预测,以使得预测相互自洽( mutually consistent),这称为"多变量时间序列"(multivariate time series)。由 Sims(1980)所提倡的"向量自回归"( Vector Autoregression,简记 VAR)正是这样一种方法。 假设有两个时间序列变量 {y11,y2t}, 分别作为两个回归方程的被解释变量, 而解释变量为这两个变量的 p 阶滞后值, 构成一个二元 ( bivariate) 的 VAR(p) 系统:
{y1t=β10+β11y1,t−1+⋯+β1py1,t−p+γ11y2,t−1+⋯+γ1py2,t−p+ε1ty2t=β20+β21y1,t−1+⋯+β2py1,t−p+γ21y2,t−1+⋯+γ2py2,t−p+ε2t其中 {ε1t} 与 {ε2t} 均为白噪声过程,但允许两个方程的扰动项之间存在同期相关性
Cov(ε1t,ε2s)={σ12, 若 t=s0, ,其他注意到上面两个方程的解释变量完全一样.将两个方程写在一起:
(y1ty2t)=(β10β20)+(β11γ11β21γ21)(y1,t−1y2,i−1)+⋯+(β1pγ1pβ2pγ2p)(y1,t−py2,t−p)+(ε1tε2t)记 yt≡(y1ty2t),εt≡(ε1tε2t) ,则有:
yt=(β10β20)⏟Γ0+(β11γ11β21γ21)⏟Γ1yt−1+⋯+(β1pγ1pβ2pγ2p)⏟Γpyt−p+εt这个形式与 AR(p) 很相似,故名“ VAR(p)”。
在进行VAR建模时,需要确定变量的滞后阶数,以及VAR系统中包含几个变量。
根据残差 ˆεt 可以估计协方差矩阵 Σ, 记为 ˆΣ∘ 矩阵 ˆΣ 的 (i,j) 元素为 ˆΣij≡1T∑Ti=1ˆεiiˆεjt, 其中 T 为样本容量。则 VAR 模型的 AIC 与 BIC 分别为:
AIC(p)≡ln|ˆΣ|+n(np+1)2T其中, n 为 VAR 系统中变量的个数,p 为滞后阶数 ,|ˆΣ| 为 ˆΣ 的行列式 , 而 n(np+1) 为 VAR 模型中待估系数之总数 (每个方程共有 ( np+1 ) 个系数, 共有 n 个方程)。将 | ˆΣ| 视为多维情形下的残差平方和,则以上表达式为单一方程的信息准则向多方程情形的推广。比如,当 n=1 时,ˆΣ 为 1 阶矩阵,故 |ˆΣ|=ˆΣ=1T∑Tt=1ˆε2t=SSR/T, 故 AIC(p)=ln(SSR/T)+(p+1)2T, 这正是单一方程的 AIC 表达式(其中,p + 1 为解释变量个数,含常数项)。
方法之三是检验 VAR 模型的残差是否为白噪声,即是否存在自相关。如果真实模型为 VAR( p ) ,但被错误地设置为 Var(p−1), 则解释变量的最后一阶滞后 yt−p 被纳入扰动项 εt,,导致扰动项出现自相关。更糟糕的是,由于 yt−p 的相关性, 包含 yt−p 的扰动项 εt 将与解释变量 {yt−1,⋯yt−(p−1)} 相关, 导致 OLS 估计不一致。为此,需要检验 VAR 模型的残差是否存在自相关。如果存在自相关,则可能意味着应该在解释变量中加入更高阶的滞后变量。
在设定 VAR 模型是,主要应根据经济理论来确定哪些变量应在 VAR 模型中。比如,经济理论告诉我们,通货膨胀率、失业率、短期利息率互相关联,可以构成一个三变量的 VAR 模型。如果 VAR 模型包含不相关的变量,则会增大估计量方差,降低预测能力。另外,也可以在 VAR 系统中引入其他外生变量,比如 {z1:,z2t,⋯,zkt,} 与扰动项不相关。
由于 VAR 模型包含许多参数,而这些参数的经济意义很难解释,故将注意力集中于脉冲响应函数。为了研究 VAR 的脉冲响应函数,首先定义向量移动平均过程。将 MA(∞)向多维推广,可以定义 n 维“无穷阶向量移动平均过程“(Vector Moving Average,简记 VMA(∞):
yt=α+ψ0εt+ψ1εt−1+ψ2εt−2+⋯=α+∞∑j=0ψjεt−j其中 ψ0=In,ψj 皆为 n 维方阵。定义“多维滤波”( multivariate filter)为(无穷项)“满后矩阵多项式" (lag matrix polynomial):
ψ(L)≡ψ0+ψ1L+ψ2L2+⋯因此,可以将 VMA (∞) 简洁地写为 yt=α+ψ(L)εt∘ 对于两个多维滤波,可以类似于一维滤波那样地定义其乘积,以及多维滤波 ψ(L) 的“逆” ( inverse )ψ(L)−1
使用滞后算子,可以把上述 VAR( p )系统“ yt=Γ0+Γ1yt−1+⋯+Γpyt−p+εt "写成 VMA(∞) 的形式:
(I−Γ1L−⋯−ΓpLp)yt=Γ0+εt其中, Γ(L)≡I−Γ1L−⋯−ΓpL′′∘ 在方程 (10) 两边同时左乘 Γ(L)−1 可得
yt=Γ(L)−1Γ0+Γ(L)−1εt记 Γ(L)−1≡ψ(L)=ψ0+ψ1L+ψ2L2+⋯,Γ(L)−1Γ0≡α, 则得到 VAR 模型的 VMA 表示法(Vector Moving Average Representation):
yi=α+ψ0εt+ψ1εt−1+ψ2εt−2+⋯=α+∞∑i=0ψiεt−i其中, ψ0≡In, 而其余的 ψi 可通过递推公式 ψi=∑ij=1ψi−jΓj 来确定。
推导如下:
递推公式 ψi=∑ij=1ψi−jΓj 证明:
利用 (ψ0+ψ1L+ψ2L2+⋯)Γ(L)=In
⇒(ψ0+ψ1L+ψ2L2+⋯)(I−Γ1L−⋯−ΓpLp)=In
⇒ψ0−ψ0Γ1L−ψ0Γ2L2⋯+ψ1L−ψ1Γ1L2⋯=In
⇒ψ0+(ψ1−ψ0Γ1)L⋯=In
⇒ψ1−ψ0Γ1=0
根据向量微分法则可知:
∂yt+s∂ε′t=ψs其中, ( ∂yt+s/∂ε′t) 为 n 维列向量 yt+s 对 n 维行向量εt 求偏导数,故得到 n×n 矩阵 ψ 。矩阵 ψ, 是一维情形下相隔 s 期的动态乘子向多维的推广,其第 i 行、第 j 列元素等于 (∂yi,t+s/∂εit) 。它表示的是,当第 j 个变量在第 t 期的扰动项 εjt 增加 1 单位时(而其他变量与其他期的扰动项均不变) 对第 i 个变量在第 (t+s) 期的取值 yi,t+s 的影响。将 (∂yi,t+s/∂εjt) 视为时间间隔 s 的函数, 就是脉冲响应函数” (IRF)。
脉冲响应函数的缺点是,它假定在计算 ( ∂yi,t+s/∂εjt) 时,只让 εjt 变动,而所有其他同期扰动项均不变。此假定只有当扰动项的协方差矩阵 Σ≡E(εtε′t) 为对角矩阵时才成立(即同期扰动项之间正交);否则,当 εjt 变动时,必然伴随着其他方程的同期扰动项发生相应的变动。为此,需要 考虑“正交化的脉冲响应函数”( Orthogonalized Impulse Response Function,简记 OIRF),即从扰动项 εt 中分离出相互正交的部分,记为 ut, 然后计算当 ut 中的某个分量变动时,对各变量在不时期的影响。
import pandas as pd
import statsmodels.api as sm
data = pd.read_excel('../数据/上证指数与沪深300.xlsx')
Y = data['hs300']
X = data['sz']
def lag_list(Y, X, p=1, q=1):
'''
待估计方程:y = c + y(-1) +....+y(-p) + x(-1) + ... + x(-q)
获取自回归分布滞后模型的估计向量
Parameters
----------
Y : 被估计变量
X : 估计变量
p : ADL 模型 Y 的滞后阶数,标量默认为1
q : ADL 模型 X 的滞后阶数,标量默认为1
Returns
-------
ADLy : ADL 模型被解释变量
ADLx : ADL 模型解释变量
'''
ADLx = pd.DataFrame()
T = len(Y)
ADLy = list(Y[max(p, q):T])
for i in range(1, p+1):
name = f'y_{i}'
ADLx[name] = list(Y[max(p, q)-i:T-i])
for i in range(1, q+1):
name = f'x_{i}'
ADLx[name] = list(X[max(p, q)-i:T-i])
return ADLy, ADLx
def VAR(Y, X, lag):
ADLy, ADLx = lag_list(Y, X ,p=lag, q=lag)
ADLx = sm.add_constant(ADLx)
mod = sm.OLS(ADLy, ADLx)
a = mod.fit().params
ADLy, ADLx = lag_list(X, Y ,p=lag, q=lag)
ADLx = sm.add_constant(ADLx)
mod = sm.OLS(ADLy, ADLx)
b = mod.fit().params
return pd.DataFrame([a,b])
VAR(Y, X, 2)
const | y_1 | y_2 | x_1 | x_2 | |
---|---|---|---|---|---|
0 | 53.256500 | 1.719442 | -0.714049 | -1.019274 | 0.993932 |
1 | 39.431266 | 0.241814 | 0.738772 | 0.564473 | -0.560130 |
from statsmodels.tsa.vector_ar.var_model import VAR
import pandas as pd
data = pd.read_excel('../数据/上证指数与沪深300.xlsx')
estimate_data = data[['sz', 'hs300']]
res = VAR(estimate_data).fit(maxlags=5, method='ols', ic='bic')
res.summary()
Summary of Regression Results ================================== Model: VAR Method: OLS Date: Sun, 31, May, 2020 Time: 19:38:46 -------------------------------------------------------------------- No. of Equations: 2.00000 BIC: 11.9914 Nobs: 458.000 HQIC: 11.9368 Log likelihood: -4015.14 FPE: 147453. AIC: 11.9013 Det(Omega_mle): 144286. -------------------------------------------------------------------- Results for equation sz =========================================================================== coefficient std. error t-stat prob --------------------------------------------------------------------------- const 39.431266 19.842955 1.987 0.047 L1.sz 0.241814 0.201697 1.199 0.231 L1.hs300 0.564473 0.148984 3.789 0.000 L2.sz 0.738772 0.202499 3.648 0.000 L2.hs300 -0.560130 0.149698 -3.742 0.000 =========================================================================== Results for equation hs300 =========================================================================== coefficient std. error t-stat prob --------------------------------------------------------------------------- const 53.256500 26.908303 1.979 0.048 L1.sz -1.019274 0.273514 -3.727 0.000 L1.hs300 1.719442 0.202032 8.511 0.000 L2.sz 0.993932 0.274602 3.620 0.000 L2.hs300 -0.714049 0.203001 -3.517 0.000 =========================================================================== Correlation matrix of residuals sz hs300 sz 1.000000 0.973265 hs300 0.973265 1.000000
# 脉冲响应分析
irf = res.irf()
fig = irf.plot(orth=True, impulse='sz')
print('对上证指数的脉冲示意图')
对上证指数的脉冲示意图
VAR.m
function [beta,resid,cov_mat,AIC] = VAR(Y,X,p)
% 注意:只是实现了两变量的VAR模型,思考如何实现任意个变量的VAR
% p - 滞后阶数
% AIC - 信息准则
% 1.估计系数
[ADLy,ADLx] = ADLxx(Y,X,p,p);
[beta1,~,resid1] = regress(ADLy,ADLx);
[ADLy,ADLx] = ADLxx(X,Y,p,p);
[beta2,~,resid2] = regress(ADLy,ADLx);
beta = [beta1';beta2'];
resid = [resid1,resid2];
% 2.估计AIC值(eviews调整自由度之后的)
T = length(ADLy);
cov_mat = resid'*resid/(T-3);
AIC = log(det(cov_mat))+2*(2*p+1)*2/T;
% % 1.载入数据
% data = xlsread('C:\Users\Administrator\Desktop\hourse.xlsx');
% f1 = data(:,2); f2 = data(:,3); e = data(:,6);
%
% % 2.估计VAR模型
% [beta,resid,AIC] = VAR(f1,e,2);
OIRF1.m
function [beta,IR] = OIRF1(Y,X,num,IMP)
% num - 脉冲期数
% 1.估计VAR模型参数
[beta,~,cov_mat] = VAR(Y,X,1);
% 2.脉冲响应函数
% 2.1 正交化分解,估计P矩阵
P = chol(cov_mat, 'lower');
% 2.2 估计IR,s=1期为ADt,s=k,则为A^(k)Dt
b = beta(:,2:3);
SHOCK = zeros(2,1);
if IMP == 1
SHOCK(1,1) = 1;
elseif IMP == 2
SHOCK(2,1) = 1;
end
IR = zeros(num,2);
IR(1,:) = b*(P*SHOCK);
for s=2:num, IR(s,:) = (b*IR(s-1,:)')'; end