VAR预测方法

机器算法验证 r 预测 造型 向量自回归
2022-01-23 18:54:44

我正在建立一个 VAR 模型来预测资产的价格,并且想知道我的方法在统计上是否合理,我所包含的测试是否相关,以及是否需要更多来确保基于我的输入变量的可靠预测。

以下是我当前检查格兰杰因果关系并预测所选 VAR 模型的过程。

require("forecast")
require("vars")

#Read Data
da=read.table("VARdata.txt", header=T)
dac <- c(2,3) # Select variables
x=da[,dac]

plot.ts(x)
summary(x)

#Run Augmented Dickey-Fuller tests to determine stationarity and differences to achieve stationarity.
ndiffs(x[, "VAR1"], alpha = 0.05, test = c("adf"))
ndiffs(x[, "VAR2"], alpha = 0.05, test = c("adf"))

#Difference to achieve stationarity
d.x1 = diff(x[, "VAR1"], differences = 2)
d.x2 = diff(x[, "VAR2"], differences = 2)

dx = cbind(d.x1, d.x2)
plot.ts(dx)

#Lag optimisation
VARselect(dx, lag.max = 10, type = "both")

#Vector autoregression with lags set according to results of lag optimisation. 
var = VAR(dx, p=2)

#Test for serial autocorrelation using the Portmanteau test
#Rerun var model with other suggested lags if H0 can be rejected at 0.05
serial.test(var, lags.pt = 10, type = "PT.asymptotic")

#ARCH test (Autoregressive conditional heteroscedasdicity)
arch.test(var, lags.multi = 10)

summary(var)

#Granger Causality test
#Does x1 granger cause x2?
grangertest(d.x2 ~ d.x1, order = 2)

#Does x2 granger cause x1?
grangertest(d.x1 ~ d.x2, order = 2)

#Forecasting
prd <- predict(var, n.ahead = 10, ci = 0.95, dumvar = NULL)
print(prd)
plot(prd, "single")

这个方法好听吗?

2个回答

我认为您说得非常正确,但是在构建 VAR 模型时,我通常会确保遵循以下步骤:

1. 选择变量

这是构建模型最重要的部分。如果要预测资产的价格,则需要包括与价格形成机制相关的变量。最好的方法是通过理论模型。由于您没有提及资产是什么以及模型中包含的其他变量是什么,我真的不能对这个项目多说,但您可以在此处找到资产定价模型的摘要。

2.检查数据并进行适当的调整

选择变量后,您可以对数据进行一些调整,以改进模型的估计和解释。使用汇总统计并查看系列图来检测异常值、缺失数据和其他奇怪行为很有用。人们在处理价格数据时,通常取自然对数,这是一种稳定方差的变换,也有很好的解释(对数的价格差异变成连续的复合收益)。我不确定您是否在估算模型之前记录了日志,但如果您正在处理资产价格,那么这样做是个好主意。

3.检查数据是否包含非平稳成分

现在您可以使用单位根检验来检查您的系列是否静止。如果您只对预测感兴趣,正如@JacobH 所指出的那样,即使您的系列是非平稳的,您也可以在水平上运行 VAR,但是您的标准错误不能被信任,这意味着您无法推断系数。您已经使用 ADF 测试进行了静态测试,该测试在这些应用程序中非常常用,但请注意,您应该指定是否要在 i) 没有常数和趋势的情况下运行测试;ii) 恒定且无趋势;iii) 一个常数和一个趋势。通常价格序列具有随机趋势,因此线性趋势将不准确。在这种情况下,您可以选择规范 ii。在您的代码中,您使用了ndiffs预测包的功能。我不确定这个函数实现了这三个替代方案中的哪一个来计算差异的数量(我在文档中找不到它)。要检查您的结果,您可能需要使用ur.df“urca”包中的函数:

adf <- ur.df(x[, "VAR1"], type = "drift", lags = 10, selectlags = "AIC")

请注意,此命令将使用 AIC 命令选择的常数和滞后运行 ADF 测试,最大滞后为 10。如果您在解释结果时遇到问题,请查看此问题如果系列是 I(1),只需使用差值,这将等于连续复利的回报。如果测试表明该系列是 I(2) 并且您不确定是否可以使用其他测试,例如 Phillips-Perron 测试 (PP.testR中的函数)。如果所有测试都确认您的系列是 I(2)(请记住在运行测试之前使用系列的日志)然后采用第二个差异,但请注意您对结果的解释将会改变,因为现在您正在使用连续复利收益的差异。资产价格通常为 I(1),因为它们接近随机游走,在应用一阶差分时这是一种白噪声。

4.选择模型的顺序

这可以通过常用的标准来完成,例如 Akaike、Schwarz (BIC) 和 Hannan-Quinn。您已经使用VARselect函数完成了该操作,这是正确的,但请记住您用来做出决定的标准是什么。通常,不同的标准表示 VAR 的不同顺序。

5.检查是否存在协整关系

如果你的所有序列都是 I(1) 或 I(2),在运行 VAR 模型之前,通常最好检查序列之间是否没有协整关系,特别是如果你想用残差。您可以使用 Johansenn 检验或 Engle-Granger(仅适用于双变量模型)来做到这一点。ca.jo在 R 中,您可以使用“urca”包的功能运行 Johansen 测试。请注意,此测试也有不同的规格。对于价格系列,我通常使用以下代码(p第 4 项的滞后长度在哪里,以级别中的系列执行):

jo_eigen <- ca.jo(x, type = "eigen", ecdet = "const", K = p)
jo_trace <- ca.jo(x, type = "trace", ecdet = "const", K = p)

6. 估计模型

如果您的系列不是协整的,您可以使用VAR命令轻松估计模型,就像在您的代码中所做的那样。如果系列是协整的,您需要通过使用以下代码估计向量误差校正模型来考虑长期关系(其中k是协整的顺序):

vecm <- cajorls(joeigen, r = k)

7. 运行诊断测试

要测试您的模型是否明确指定,您可以对残差运行序列相关性测试。在您的代码中,您对该函数使用了 Portmanteau 测试serial.test我从未使用过此功能,但我认为它还可以。在 MTS 包中还实现了 Ljung-Box 测试的多变量版本,您可以使用该函数运行它mq

8.做出预测

在确定模型已正确指定后,您可以predict像在代码中那样使用该函数。您甚至可以绘制脉冲响应函数,以使用该函数检查变量如何响应特定冲击irf

9. 评估预测

做出预测后,您必须对其进行评估并与其他模型进行比较。可以在此处找到一些评估预测准确性的方法,但要做到这一点,将您的系列划分为训练集和测试集至关重要,如链接中所述。

我想我会为 Regis A Ely 添加一个非常好的答案。他的回答没有错,但是使用 VAR 进行预测与使用 VAR 进行其他 VAR 类型的事情(即 IRF、FEVD、Historical Decomp. 等)不同。因此,Regis A Ely 概述的某些步骤在某些情况下会对您的预测产生负面影响。

免责声明:

当我提到非平稳数据时,我的意思是该系列包含随机趋势。如果数据具有时间/季节性趋势,则必须对其进行适当过滤。

第一的

一般来说,在不受限制的 VAR 中,无需担心虚假关系。当您在另一个非平稳序列 (X) 上对非平稳序列 (Y) 进行回归并且两个序列不是协整时,就会出现虚假回归。但是,如果您在 X 上回归 Y 以及 Y 的滞后,则回归不会是虚假的,因为包含滞后 Y 可确保误差是平稳的。换句话说,Y 的滞后会拾取先前错误分配给 X 的变化。由于无限制的 VAR 本质上是一个 ARDL 回归系统,其中每个方程包含相同数量的滞后和回归量,因此应该清楚的是虚假回归是因此不太可能成为问题。换句话说,如果你的数据都是 I(1),不管它是否是协整的,你都可以运行 VAR。VECM 仅在您想要建模和识别变量之间的短期和长期/协整关系时才需要。现在的问题是,您应该在级别还是在第一个差异中运行 VAR。

第二

预测时,不需要先对 I(1) 数据进行差分。如果你愿意,你可以,想一想很多从业者不这样做。请记住,当我们有一个非平稳序列时,我们仍然可以获得一致的估计量。对于因变量有一个滞后的回归,这是直观的。如果一个序列遵循随机游走(即非平稳),我们知道下一个周期的最佳估计值恰好是上一个周期(即 beta 为 1)。然而,从具有非平稳数据的模型得出的估计的标准误差是不同的,因为严格来说,随着 T 接近无穷大,估计的方差接近无穷大。然而,这对于预测来说不是问题。预测本质上是一个有条件的期望,因此只依赖于模型的参数估计,而不是标准误差。此外,您的预测的预测区间将直接从您的错误中获得,通过引导错误,或者如果您通过经验预测区间(我最喜欢!)拥有大量数据,所有这三种方法都不受非平稳数据的影响因为根据我们上面的虚假回归讨论,你的错误将是固定的。

我为什么在乎?

ADF 检验的功效较低,尤其是当级数接近单位根时,但并非如此。另一个人说,ADF 测试往往会错误地断言一个序列是非平稳的,而实际上它不是。

假设您的 ADF 测试错误地确保序列是非平稳的。如果您进行所有必要的转换并估计 VECM,您的预测将是错误的,因为您的模型是错误的。这就是人们预测水平的原因。

格兰杰因果关系呢???

当数据为 I(1) 时,您甚至可以在级别中使用 VAR 测试 GC。我知道这听起来很疯狂。我们知道,非平稳数据通常无法进行推理。然而,可以测试联合假设,例如 GC。这在 Toda 和 Yamamoto (1995) 中得到了展示,它借鉴了 Sims、Stock 和 Watson (1990)。有关应用程序,请参见http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.html

最后一件事

但是,如果您想将 VAR 用于预测以外的其他事情,请小心。具有非平稳和协整级数的 VAR 可能会产生一些奇怪的结果。例如,严格来说,VAR 的移动平均表示不存在,因为参数矩阵不可逆。尽管如此,仍然可以获得 IRF。推理也是不可行的(认为可以如上所述测试联合假设)。

还要担心小样本。我所讨论的一切都适用于大样本,但在小样本中情况可能会变得古怪。对于具有 I(1) 数据的 GC 尤其如此。