温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
编译: 许梦洁 (Frankfurt School of Finance and Management)
E-mail: m.xu@fs.de
Source: Ashish Rajbhandari[1] → Cointegration or spurious regression?
Stata 连享会时间序列专题:
目录
时间序列数据经常是不平稳的而且序列之间往往有一定程度上的联动关系。一组时间序列协整意味着这组序列内存在一个长期的均衡关系。如果这种长期的均衡关系不存在,则表面上的联动则是无意义的。
分析多个不平稳的时间序列是否协整可以帮助理解它们的长期表现。把 30 年的美国政府债券的利率看作是长期利率,把 3 个月的同种债券的利率看做是短期利率。根据相关理论,长期利率应该是短期利率的未来预期收益的平均值。这意味着这两个利率之间在一定时间段内不可能有太大的偏离。也就是说,如果这两个利率有协整关系,任何影响短期利率的因素也将带来长期利率的调整。这个见解在做一些政策和投资决策的时候非常有用。
在协整分析中,我们会将一个不平稳的序列对一系列其他不平稳序列进行回归。令人惊讶的是,在有限样本中,用不平稳序列对其他不平稳序列进行回归往往都能得到很显著的系数和很高的
在这篇文章中,我会用模拟数据来分别展示在协整和伪回归下 OLS 估计量的渐近性质,然后使用 Engle and Granger(1987) 的方法来检验协整关系。
我们考虑两个一阶协整的两个变量
如果
一个标准的假设是将协整向量的其中一个系数标准化为 1 来唯一地识别一组完全共线的协整关系。这种标准化的设定决定了哪些变量会出现在等式左边,而哪些变量会出现在等式右边,显然标准化系数的选择并不会产生实质性影响。以
上面的等式描述了
我通过重复 1000 次的蒙特卡洛模拟画出了 OLS 估计量
我通过以下设定生成了伪回归的
其中
我通过以下设定生成了协整的
其中
其中,
下图画出了经验分布,蒙特卡洛模拟的代码在附录中提供。
伪回归中的 OLS 估计量不具有一致性,因为即使把样本量从 100 扩大到 1000 后该估计量也不会收敛于其真实值 0.7。不仅如此,在有限样本中,伪回归的系数通常很显著并且有很高的
在协整关系中,我人为地在误差项的生成过程中引入了序列相关,这导致在样本量为 100 时的结果有偏,而当样本量扩大到 200 时有所改善,当样本量扩大到 1000 时有显著改善。由于协整关系中的
我们在前面的部分我们看到了协整关系下 OLS 估计量具有一致性,甚至在误差项序列相关时仍然满足。为了检验协整关系,我们可以首先对模型
协整检验的原假设和备择假设分别为:
原假设意味着
这里有两个之前进行蒙特卡洛模拟时生成的数据集。spurious.dta包含根据方程组
首先,我对数据集 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
------------------------------------------------------------------------------
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% 临界值应为 -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% 水平下拒绝不存在协整关系的原假设。
在这篇文章中,我使用蒙特卡洛模拟展示了 OLS 估计量在协整关系下的一致性。同时,我还使用 Engle–Granger 两步法检验了模拟数据中的协整关系。
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}")
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD
Posts by Ashish Rajbhandari, Senior Econometrician: https://blog.stata.com/author/arajbhandari/