協整還是僞迴歸?

幫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}")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章