协整还是伪回归?

帮Stata连享会翻译的第二篇文章:协整还是伪回归?。由于markdown语言还不是很成熟,尤其是在数学公式上有很多bug,所以我自己的博客就是我的测试001啦。以下为原文:
Source: Ashish RajbhandariCointegration or spurious regression?

时间序列数据经常是不平稳而且序列之间往往有一定程度上的共同联动关系。一组时间序列协整意味着这组序列内存在一个长期的均衡关系。如果这种长期的均衡关系不存在,则表面上的联动则是无意义的。

分析多个不平稳的时间序列是否协整可以帮助理解它们的长期表现。把30年的美国政府债券的利率看作是长期利率,把3个月的同种债券的利率看做是短期利率。根据相关理论,长期利率应该是短期利率的未来预期收益的平均值。这意味着这两个利率之间在一定时间段内不可能有太大的偏离。也就是说,如果这两个利率有协整关系,任何影响短期利率的因素也将带来长期利率的调整。这个见解在做一些政策和投资决策的时候非常有用。

在协整分析中,我们会将一个不平稳的序列对一系列其他不平稳序列进行回归。令人惊讶的是,在有限样本中,用不平稳序列对其他不平稳序列进行回归往往都能得到很显著的系数和很高的R2R^2。这种情况虽然看起来很像协整,但实际上往往是伪回归。

在这篇文章中,我会用模拟数据来分别展示在协整和伪回归下OLS估计量的渐近性质,然后使用Engle and Granger (1987)的方法来检验协整关系。

1. 协整

我们考虑两个一阶协整的两个变量yty_txtx_t,这意味着它们各自是I(1)I(1),也就是说它们各自可以通过一阶差分变成平稳序列。

如果yty_txtx_t的线性组合是I(0)I(0),这意味着α[yt,xt]=et\alpha[y_t,x_t]'=e_t,其中β\beta是协整向量,ete_t是平稳的均衡误差项。一般来说,在多变量的协整中可能不止存在一个协整关系。然而, Engle–Granger方法假设不管有多少个变量都只存在一个协整关系。

一个标准的假设是将协整向量的其中一个系数标准化为1来唯一地识别一组完全共线的协整关系。这种标准化的设定决定了哪些变量会出现在等式左边,而哪些变量会出现在等式右边,显然标准化系数的选择并不会产生实质性影响。以α=(1,β)\alpha=(1,-\beta)为例,这意味如下的回归设定:

(1)yt=βxt+ety_t=\beta x_t+e_t \tag{1}

上面的等式描述了yty_txtx_t之间的长期关系,这也被称为“静态”回归因为假设该等式中没有其他变量的动态变化或误差项的序列相关。
OLS估计量为β^=i=1Tytxti=1Txt2\hat{\beta}=\frac{\sum_{i=1}^{T}{y_{t}x_{t}}}{\sum_{i=1}^{T}{x_{t}^{2}}}。由于yty_txtx_t都是I(1)I(1),当 $T \rightarrow \infty $ 时,分子和分母都会收敛于复杂的布朗运动函数。然而,无论xtx_t是否和ete_t相关,β^\hat{\beta}都会收敛于真实的β\beta。实际上,这种情况下的估计量β^\hat{\beta}具有超一致性,这意味着该估计量会以比平稳序列回归下的OLS估计量更快的速度收敛于真实值。推断β^\hat{\beta}的过程并不是很直接,因为它的渐近分布并不是标准分布同时也依赖于常数项和趋势项是否已经给出。

2. 蒙特卡洛模拟

我通过重复1000次的蒙特卡洛模拟画出了OLS估计量β^\hat{\beta}在协整和伪回归下的经验分布。在伪回归下,β^\hat{\beta}的经验分布即使在扩大样本后也不会收敛到真实值,这意味着OLS估计量在伪回归下不具有一致性。相对地,如果序列是协整的,我们可以看到β^\hat{\beta}的经验分布会收敛到其真实值。

2.1 伪回归的数据生成过程

我通过以下设定生成了伪回归的yty_txtx_t:
yt=0.7xt+et y_{ t }=0.7x_{ t }+e_{ t }

xt=xt1+νxt x_{ t }=x_{ t-1 }+\nu _{ xt }

(2)et=et1+νyt e_{ t }=e_{ t-1 }+\nu _{ yt } \tag{2}

其中νxt\nu_{xt}νyt\nu_{yt}~i.i.d.N(0,1)i.i.d. N(0,1)xtx_tete_t是相互独立的随机游走过程。由于yty_txtx_t的线性组合yt0.7xt=ety_t-0.7x_t=e_tI(1)I(1)过程,所以该回归是伪回归。

2.2 协整的数据生成过程

我通过以下设定生成了协整的yty_txtx_t

yt=0.7xt+eyt y_{ t }=0.7x_{ t }+e_{ yt }

(3)xt=xt1+ext x_{ t }=x_{ t-1 }+e_{ xt } \tag{3}

其中xtx_t是唯一的I(1)I(1)过程。通过将误差项exte_{xt}eyte_{yt}设定为有1阶滞后的VMA过程,我允许存在同期相关和序列相关。VMA过程由以下设定给出:

eyt=0.3νyt1+0.4νxt1+νyt e_{ yt }=0.3\nu _{ yt-1 }+0.4\nu _{ xt-1 }+\nu _{ yt }

ext=0.7νyt1+0.1νxt1+νxt e_{ xt }=0.7\nu _{ yt-1 }+0.1\nu _{ xt-1 }+\nu _{ xt }

其中νyt\nu_{yt}νxt\nu_{xt}由正态分布生成,其均值为0,方差矩阵为

下图画出了经验分布,蒙特卡洛模拟的代码在附录中提供。

伪回归中的OLS估计量不具有一致性,因为即使把样本量从100扩大到1000后该估计量也不会收敛于其真实值0.7。不仅如此,在有限样本中,伪回归的系数通常很显著并且有很高的R2R^2。事实上,Phillips(1986)指出了当$T \rightarrow \infty 时,伪回归的tF$统计量是发散的,因此以此为推断依据是不可信的。

在协整关系中,我人为地在误差项的生成过程中引入了序列相关,这导致在样本量为100时的结果有偏,而当样本量扩大到200时有所改善,当样本量扩大到1000时有显著改善。由于协整关系中的β^\hat{\beta}仍然满足一致性,因此虽然此时β^\hat{\beta}的渐近分布不是标准分布,我们仍然可以用β^\hat{\beta}做统计推断。

2.3 协整关系的检验

我们在前面的部分我们看到了协整关系下OLS估计量具有一致性,甚至在误差项序列相关时仍然满足。为了检验协整关系,我们可以首先对模型(1)(1)进行OLS估计得到残差项,然后检验该残差项是否存在单位根。如果序列是协整的,则误差项一定是平稳的,这种方法叫做Engle–Granger两步法。ADF(Augmented Dickey–Fuller)检验和PP(Phillips–Perron)检验可以用于第二步检验单位根的操作,见上一篇文章

协整检验的原假设和备择假设分别为:
H0:et=I(1)H1:et=I(0) H_0: e_t=I(1) \qquad H_1:e_t=I(0)
原假设意味着ete_t是非平稳的,也即是yty_txtx_t之间不存在协整关系。备择假设则说明ete_t是平稳的,也意味着协整关系的存在。
如果真实的协整向量α\alpha已知,基于估计残差的ADF检验在原假设下不会服从标准的DF分布(Phillips and Ouliaris, 1990)。此外,Hansen(1992)认为ADF统计量的分布也依赖于yty_txtx_t中的常数和线性趋势项。Hamilton(1994)则提供了在这种情况下进行统计推断的临界值。

3. 例子

这里有两个之前进行蒙特卡洛模拟时生成的数据集。spurious.dta包含根据方程组(2)(2)生成的两个用于伪回归的变量xtx_tyty_tcoint.dta则包含根据方程组(3)(3)生成的两个具有协整关系的变量xtx_tyty_t

首先,我对数据集spurious.dta中的协整关系进行检验。

. use spurious, clear

. reg y x, nocons

      Source |       SS           df       MS      Number of obs   =       100
-------------+----------------------------------   F(1, 99)        =      6.20
       Model |  63.4507871         1  63.4507871   Prob > F        =    0.0144
    Residual |  1013.32308        99  10.2355867   R-squared       =    0.0589
-------------+----------------------------------   Adj R-squared   =    0.0494
       Total |  1076.77387       100  10.7677387   Root MSE        =    3.1993

------------------------------------------------------------------------------
           y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           x |  -.1257176   .0504933    -2.49   0.014    -.2259073   -.0255279
------------------------------------------------------------------------------

xx的系数是负的且是显著的。我使用带resid选项的predict命令来获得残差,用dfuller命令来做ADF检验。我使用noconstant选项使回归中不包含残差项,用lags(2)选项来对序列相关做出调整。dfuller命令中的noconstant选项意味着拟合随机游走模型。

. predict spurious_resd, resid

. dfuller spurious_resd, nocons lags(2)

Augmented Dickey-Fuller test for unit root         Number of obs   =        97

                               ---------- Interpolated Dickey-Fuller ---------
                  Test         1% Critical       5% Critical      10% Critical
               Statistic           Value             Value             Value
------------------------------------------------------------------------------
 Z(t)             -1.599            -2.601            -1.950            -1.610

正如之前提到的,DF分布的临界值在这种情况下并不适用。根据 Hamilton(1994),其5%5\%临界值应为-2.76。该检验统计量为-1.60意味着不能拒绝不存在协整关系的原假设。
我对数据集coint.dta也做了同样的检验:

. use coint, clear

. reg y x, nocons

      Source |       SS           df       MS      Number of obs   =       100
-------------+----------------------------------   F(1, 99)        =   3148.28
       Model |  4411.48377         1  4411.48377   Prob > F        =    0.0000
    Residual |   138.72255        99  1.40123788   R-squared       =    0.9695
-------------+----------------------------------   Adj R-squared   =    0.9692
       Total |  4550.20632       100  45.5020632   Root MSE        =    1.1837

------------------------------------------------------------------------------
           y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           x |   .7335899   .0130743    56.11   0.000     .7076477    .7595321
------------------------------------------------------------------------------

. predict coint_resd, resid

. dfuller coint_resd, nocons lags(2)

Augmented Dickey-Fuller test for unit root         Number of obs   =        97

                               ---------- Interpolated Dickey-Fuller ---------
                  Test         1% Critical       5% Critical      10% Critical
               Statistic           Value             Value             Value
------------------------------------------------------------------------------
 Z(t)             -5.955            -2.601            -1.950            -1.610

该DF检验统计量的值为-5.95,显然大于临界值-2.76,因此在5%5\%水平下拒绝不存在协整关系的原假设。

3. 结论

在这篇文章中,我使用蒙特卡洛模拟展示了OLS估计量在协整关系下的一致性。同时,我还使用Engle–Granger两步法检验了模拟数据中的协整关系。

参考文献

1.Engle, R. F., and C. W. J. Granger. 1987. Co-integration and error correction: Representation, estimation, and testing. Econometrica 55: 251–276.
2.Hamilton, J. D. 1994. Time Series Analysis. Princeton: Princeton University Press.
Hansen, B. E. 1992. Effcient estimation and testing of cointegrating vectors in the presence of deterministic trends. Journal of Econometrics 53: 87–121.
3.Phillips, P. C. B. 1986. Understanding spurious regressions in econometrics. Journal of Econometrics 33: 311–340.
4.Phillips, P. C. B., and S. Ouliaris. 1990. Asymptotic properties of residual based tests for cointegration. Econometrica 58: 165–193.

附录

伪回归代码

cscript
set seed 2016
 
local MC = 1000
 
quietly postfile spurious beta_t100 using t100, replace
 
forvalues i=1/`MC' {
        quietly {
                drop _all
 
                set obs 100
                gen time = _n
                tsset time
 
                gen nu_y = rnormal(0,0.7)
                gen nu_x = rnormal(0,1.5)
 
                gen err_y = nu_y in 1
                gen err_x = nu_x in 1
                replace err_y = l.err_y + nu_y in 2/l
                replace err_x = l.err_x + nu_x in 2/l
 
                gen y = err_y in 1
                gen x = err_x
                replace y = 0.7*x + err_y in 2/l
                if (`i'==1) save spurious, replace
                qui reg y x, nocons
        }
                post spurious (_b[x])
}
postclose spurious

协整代码

cscript
set seed 2016
 
local MC = 1000
 
quietly postfile coint beta_t100 using t100, replace
 
forvalues i=1/`MC' {
        quietly {
                drop _all
 
                set obs 100
                gen time = _n
                tsset time
 
                matrix V = (1,0.7\0.7,1.5)
                drawnorm nu_y nu_x, cov(V)
 
                gen err_y = nu_y in 1
                gen err_x = nu_x in 1
                replace err_y = 0.3*l.nu_y + 0.4*l.nu_x ///
                        + nu_y in 2/l
                replace err_x = 0.7*l.nu_y + 0.1*l.nu_x ///
                        + nu_x in 2/l
 
                gen x = err_x in 1
                replace x = l.x + err_x in 2/l
                gen y = 0.7*x + err_y
                if (`i'==1) save coint, replace
                qui reg y x, nocons
        }
                post coint (_b[x])
}
postclose coint

画图代码

/*Spurious regression*/
use t100, clear
quietly merge 1:1 _n using t200
drop _merge
quietly merge 1:1 _n using t1000
drop _merge
kdensity beta_t100, n(1000) generate(x_100 f_100) ///
        kernel(gaussian) nograph
label variable f_100 "T=100"
kdensity beta_t200, n(1000) generate(x_200 f_200) ///
        kernel(gaussian) nograph
label variable f_200 "T=200"
kdensity beta_t1000, n(1000) generate(x_1000 f_1000) ///
        kernel(gaussian) nograph
label variable f_1000 "T=1000"
graph twoway (line f_100 x_100) (line f_200 x_200) ///
        (line f_1000 x_1000), legend(rows(1))      ///
        subtitle("Spurious regression")            ///
        saving(spurious, replace) xmlabel(0.7)     ///
        xline(0.7, lcolor(black)) nodraw
 
/*Cointegration*/
use t100, clear
quietly merge 1:1 _n using t200
drop _merge
quietly merge 1:1 _n using t1000
drop _merge
kdensity beta_t100, n(1000) generate(x_100 f_100) ///
        kernel(gaussian) nograph
label variable f_100 "T=100"
kdensity beta_t200, n(1000) generate(x_200 f_200) ///
        kernel(gaussian) nograph
label variable f_200 "T=200"
kdensity beta_t1000, n(1000) generate(x_1000 f_1000) ///
        kernel(gaussian) nograph
label variable f_1000 "T=1000"
graph twoway (line f_100 x_100) (line f_200 x_200) ///
        (line f_1000 x_1000), legend(rows(1))      ///
        subtitle("Cointegration")                  ///
        saving(cointegration, replace)             ///
        xline(0.7, lcolor(black)) nodraw
 
graph combine spurious.gph cointegration.gph,      ///
      title("Empirical densities of {&beta}")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章