自己造轮子————向量自回归模型VAR_基于Stata

还是更喜欢任务导向式地学语言,系统性从头到尾真记不住,正巧来干一下VAR

对VAR模型的粗浅理解

这里看了一位csdn博主的解释,感觉豁然开朗

他以黄金现货的价格为例,传统的时间序列模型,比如 ARIMA、ARIMA-GARCH 等关注的是价格自身的变化,模型里都是价格自身的滞后项,而 VAR 模型除了分析自身滞后项的影响外,还分析其他相关因素的滞后项对未来值产生的影响

设置时间序列

1
2
tsset vartime
// vartime 是时间变量

数据的平稳性

时间系列数据很重要的一点是一定要平稳,不然容易出现伪回归现象, VAR 更是要求所有的变量要同阶协整,如果某变量的数据不平稳,就要全体做差分,一直到平稳为止

1
2
dfuller var1 ,lags(0)
// 对因变量 var1 进行单位根检验,滞后0期

命令会返回一个p-value,即p值,如果检验的p值小于某个显著性水平(如0.05),则可以拒绝存在单位根的原假设,认为序列是平稳的。如果p值较大,则不能拒绝存在单位根的原假设,序列可能是非平稳的。

差分

不平稳的状况下就需要进行差分

1
2
dfuller d.var1 ,lags(0)
// 对 var1 进行一阶差分之后进行单位根检验,滞后0期

注意,对一个变量差分n阶之后平稳,那么其他变量也要差分n阶之后再进行平稳性检验

接下来,因为数据进行差分之后才平稳,所以要进行协整检验(如果原始数据就平稳,那就不需要差分,也不需要协整检验,直接格兰杰检验即可)

协整检验

这里使用的是 Engle-Granger 两步法:

首先,对每个时间序列进行单位根检验,确认它们是非平稳的。

然后,对这些非平稳的时间序列进行回归分析,得到残差序列。

最后,对残差序列进行单位根检验。如果残差序列是平稳的,则表明原时间序列之间存在协整关系。

1
2
3
4
5
6
7
8
reg var1 var2 var3 , nocons
// 先进行一个回归, nocons 表示没有常数项

predict spurious_resd , resid
//生成回归模型的残差,并将它们存储在新变量 spurious_resd 中

dfuller spurious_resd , nocons lag(0)
//对残差序列 spurious_resd 进行单位根检验(ADF检验),以确定它是否是平稳的。nocons 表示在进行 ADF 检验时不包括常数项

协整检验的结果会返回一个 Test Statist 的值以及 1% 5% 10% 的 Critical Value

Test Statist 小于 5% 对应的 Critical Value 则拒绝原假设,认为是通过检验,可以进行后续的模型分析

确定最优滞后阶数

1
varsoc var1 var2 var3

此命令会返回一个表格,表格中*最多的那一行对应的阶数,就是最优滞后阶数

注意,样本量少的时候滞后阶数不能太大,滞后阶数大会导致不足以估计模型

建立VAR模型

1
2
var var1 var2 var3 , lags(1/n)
// n 是之前一步确定的最优滞后阶数

单位元检验

1
varstable , graph

此命令会画一个图,点都在单位元里面,则说明变量是稳定的,可以进行后续的脉冲响应和方差分解

格兰杰检验

格兰杰检验只说明统计上是否存在因果关系

1
vargranger

返回的表格中, Prob 小于0.05,则拒绝原假设(不存在格兰杰因果关系),所以,找 Prob<0.05 的,其对应的 Excluded 就是 Equation 的因果原因,可以用 Excluded 的过去值来预测 Equation 的未来值

注意,解释变量对被解释变量的格兰杰因果检验通过,则可以进行脉冲分析

脉冲响应分析

1
2
3
4
5
6
7
8
9
10
11
12
13
irf create order1,step(12) set(myirf1) replace
// irf create 创建脉冲响应函数
// order1 是为这组脉冲响应分析指定的名称
// step(12) 指定了脉冲响应分析的时间步长:12
// set(myirf1) 指定了脉冲响应分析结果的集合名称
// replace 选项表示如果 myirf1 集合已经存在,则替换它

irf graph oirf , impulse(var1 var2) response(var3) yline (0,lcolor(black)) byopts(yrescale)
// impulse 中是冲击变量,一般是自变量,response 中是响应变量,一般是被解释变量
// irf graph 是绘制脉冲响应图的命令
// oirf 指定了要绘制的脉冲响应图的类型。oirf 代表正交化脉冲响应图,它显示了在正交化处理后,一个变量对另一个变量冲击的响应
// yline(0, lcolor(black)) 用于在图中添加一条黑色的垂直参考线,且位于 y 轴的 0 位置
// byopts(yrescale) 用于在绘制每个脉冲响应图之前重新缩放 y 轴,确保每个图的 y 轴范围都是根据数据的波动性独立选择的,使得图形更容易解释

合格的脉冲响应图最后是趋于 0 的,表示冲击最后会消失。重要的是相应的剧烈程度和相应从出现到消失的时间

方差分解

分析每一个结构冲击对内生变量变化的贡献,通过方差大小评价每一个冲击变量的重要性

1
2
3
4
5
irf create order2,step(12) set(myirf1) replace
irf graph fevd , irf(order2) impulse(var1 var2) response(var3)
// irf graph fevd 是绘制方差分解图的命令
irf table fevd , irf(order2) impulse(var1 var2) response(var3)
// irf table fevd 是生成方差分解表的命令

方差分解图展示了解释变量对被解释变量的变动,在不同的时间期数,的贡献程度

预测

1
2
3
4
5
6
7
fcast compute p,step(8)
// fcast compute 命令用于计算向量自回归(VAR)模型或向量误差修正(VEC)模型的动态预测
// step(8) 表示预测未来8个时间步长
fcast graph pvar3 pvar1 ,observed
// fcast graph 命令用于绘制预测图
// fcast graph pvar3 pvar1, observed 会绘制预测值 pvar3 和预测误差 pvar1 ,并包括实际观测值
// observed 选项告诉 Stata 在图中包含实际观测值

自己造轮子————向量自回归模型VAR_基于Stata
http://example.com/2024/09/13/自己造轮子————向量自回归模型VAR_基于Stata/
作者
cyx94a
发布于
2024年9月13日
许可协议