VAR预测方法


19

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

下面是我当前的检查Granger因果关系并预测所选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")

这种方法听起来合理吗?


1
您使用的是第二种差异吗?这有点不寻常,可能会使模型变得比需要的更加敏感。另外,您可以期望系统中实现协整吗?那么任何确定性的时间趋势和/或季节性如何,您是否检查过这些时间和趋势?
理查德·哈迪

@Richard,据我所知,达到平稳性的差异由adf测试确定,并将根据其建议进行调整。如果adf测试确定它是固定的(返回0,则我不会改变变量)。我没有考虑协整和季节性,但给人的印象是上述方法可以考虑变量的任何趋势。
youjustreadthis2016年

2
ADF测试只是一种测试,它具有局限性。绘制原始数据,第一个差异以及最终的第二个差异可能比仅运行测试更具信息性。而且,ADF测试具有不同的规格:(1)没有常数,没有趋势;(2)不变,没有趋势;(3)不变和趋势;测试的延迟顺序选择也可能是不平凡的。因此,不要盲目依赖结果。从主题的角度来看,资产价格通常是第一级I(1)的总和。I(2)很难证明……
理查德·哈迪

@youjustreadthis我在下面提供了答案。我强烈建议您考虑其中的一些影响
Jacob H

Answers:


28

我认为您说得很对,但是在建立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(仅适用于双变量模型)进行此操作。在R中,您可以使用ca.jo“ 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.运行诊断测试

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

8.做出预测

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

9.评估预测

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


非常感谢您提供详细的答案!关于Johansen协整检验,当包含两个以上变量时,实现方式是否发生变化?相信我读过,多种族融合有其自身的陷阱。对不起,如果这更适合自己的问题。
youjustreadthisthis

1
不,您可以使用与上面相同的代码来执行此操作,但是在这种情况下,您可能会发现多个协整向量。这种类型的唯一限制是使用Engle-Granger检验,该检验仅适用于双变量系列,但在这种情况下通常更好。
Regis A. Ely

1
此链接可能有助于运行和解释johansenn测试。
Regis A. Ely

做得好!我已经编辑了一些格式和拼写。注意,在反引号`中有代码段(甚至与函数名一样小)是很好的,例如predict。通过选择文本并单击编辑器窗口顶部的“引号”按钮,可以将较大的代码片段格式化为代码。
理查德·哈迪

@ RichardHardy,VAR估算程序的漂亮轮廓。但是,我认为您可能已经忽略了OP想要预测的事实。因此,他/她可能希望进行级别估计。
雅各布·H

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尤其如此。


1
ÿŤXŤÿŤ=β0+β1个ÿŤ-1个++βpÿŤ-p+γXŤγ^Ø大号小号接近零(是吗?证明在哪里?),问题逐渐消失。但是,需要多少样本?在给出证明之前,我将继续避免虚假关系。
理查德·哈迪

1
关于我为什么在乎?,如果进程的根与单位根进程非常接近,则其行为与单位根进程非常相似。因此,在进行预测时,在假设冲击是永久性的和保持冲击消失得非常慢之间几乎没有区别。除非您对未来有很长的预测,否则结果将几乎相同。这就是为什么我不太担心单元根测试对于本地替代品的功效不高的原因。
理查德·哈迪

1
关于First的另一个小注意事项:在我为什么要关注ADF测试中,您说“您的预测将是错误的,因为您的模型是错误的”。好吧,这也适用于First,不是吗?上面的引用确实表明了使用左手侧与右手侧发散的模型进行的预测。
理查德·哈迪

1
@Richardhardy有关我的第一个断言的证明,请参见Hamilton 1994中的第18章。尤其是第18.2节“虚假回归的治愈”。值得一提的是,OLS估计也有效,因为它们收敛的速度T的开方
雅各布^ h

1
@RichardHardy,您的第二点评论很公平。我的反驳是,为什么要花一些时间进行预测试,然后仅过滤数据以潜在地估计错误的模型。对于预测,级别规格通常是正确的
Jacob H
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.