如何在 Python 中测试格兰杰因果关系(Toda 和 Yamamoto 风格)?

问题描述 投票:0回答:1

我正在尝试实现戴夫·贾尔斯(Dave Giles)在这篇博文中概述的格兰杰因果关系测试流程,我知道这是一篇关于遵循Toda-Yamamoto方法对非平稳数据进行格兰杰因果关系测试的著名文章。他在 EViews 中工作,但我真的很想在 Python 中执行相同的步骤。

在 Giles 的示例中,他使用了两个时间序列变量。首先,他使用 ADF 检验和 KPSS 检验确定两个变量的整合顺序,然后在数据级别上建立 VAR 模型,使用 FPE、AIC、SC 和 HQ 信息标准来确定最大值VAR 模型中包含滞后长度。这些步骤涵盖了博客文章中的步骤 1-4。

我可以使用

statsmodels
库的
.tsa.vector_ar.var_model.VAR()
.tsa.vector_ar.var_model.VAR.fit()
在 Python 中重现以上所有内容。我不确定如何实现他的第 5 步,其中他“应用 LM 测试 [不确定这代表什么] 对于 AR(k)/MA(k) 替代方案的串行独立性,对于 k = 1 , ...., 12,...” 并检查模型是否动态稳定。我也不确定如何执行步骤 6,即 Johansen 跟踪测试和 Max。特征值测试,测试两个时间序列变量之间的协整。我看到有一种用于 VECM 的 Johansen 协整 的方法,但我如何将其合并到 VAR 中?

我似乎也无法弄清楚如何在 VAR 模型中包含与最大滞后长度加上最大积分阶数相对应的外生变量,就像他在博客文章末尾所做的那样。他这样做是为了确保 Wald 检验保持渐近卡方零分布。

我知道

statsmodels.tsa.stattools.grangercausalitytests()
statsmodels.tsa.vector_ar.var_model.VARResults.test_causality()
都存在,但我希望能够对两个时间序列变量正确执行这些测试,这需要遵循 Giles 概述的程序(或类似的程序)。

如有任何建议,我们将不胜感激!如果我需要包含一些示例代码,请告诉我。

python statsmodels causality vector-auto-regression
1个回答
0
投票

第5步:

您想要检查残差的 ACF 图。 假设您已经从步骤 4 中找到了最佳模型。

from statsmodels.tsa.api import VAR
best_model = VAR(data)
best_model_fitted = best_model.fit(best_lag)

然后您想要获得该拟合模型的残差。并绘制 ACF 图。

from statsmodels.graphics.tsaplots import plot_acf
residuals = data - best_model_fitted.fittedvalues
plot_acf(residuals[col], lags=20)

如果没有显着的自相关,那么您的 VAR 是明确指定的(即您选择的 best_lag 是正确的)。

第6步:

我不必执行协整测试,因为我的时间序列具有不同的整合顺序。但是 statsmodels 有一种执行此测试的方法

第7步:

您是对的,

statsmodels.tsa.stattools.grangercausalitytests()
并不能让您灵活地按照博客文章中指定的方式执行测试。但不用担心,格兰杰因果关系检验在幕后使用了沃尔德检验。由于
VAR
模型本质上是一组线性回归,针对因变量的滞后和其他时间序列变量的滞后进行回归,因此我们可以使用正常的线性回归模型,然后对 RegressionResults 对象执行 wald_test

例如,假设您有 p = 4 和 d = 2,那么您的第一个时间序列的 VAR(其术语代表其自身的滞后版本和其他时间序列的滞后版本)将如下所示

因此我们需要构建一个数据集,其中包含表示 y1 和 y2 滞后值的列。

# assume df has two columns: y1 and y2
# Create lagged columns
lags = [1, 2, 3, 4, 5, 6]

for col in ['y1', 'y2']:
    for lag in lags:
        df[f'{col}_lag{lag}'] = df[col].shift(lag)

df.drop(columns=['y2'], inplace=True)
df.dropna(inplace=True)
Y = df['y1']
X = df[['y1_lag1', 'y1_lag2', 'y1_lag3',
        'y1_lag4', 'y1_lag5', 'y1_lag6', 
        'y2_lag1', 'y2_lag2', 'y2_lag3', 
        'y2_lag4', 'y2_lag5', 'y2_lag6']]

拟合模型。如果您愿意,您可以在这里进行健全性检查,确保从线性回归中获得的参数与从 VAR 对象的 y1 部分获得的参数相同。

import statsmodels.api as sm

X = sm.add_constant(X)
model = sm.OLS(Y,X)
results = model.fit()
results.params

现在我们准备按照博客中指定的方式执行 Wald 测试。在这个例子中,我说 p = 4, d = 2,所以我们想要将 y2 的前 4 个滞后对应的系数设置为 0。

# Perform Wald test
hypothesis = 'y2_lag1 = y2_lag2 = y2_lag3 = y2_lag4 = 0'
wald_test = results.wald_test(hypothesis)

print(wald_test)

将打印出 p 值,如果它> 0.05,则您没有足够的证据来拒绝零假设,这意味着您不能说 y2“格兰杰导致”y1。

© www.soinside.com 2019 - 2024. All rights reserved.