Python中的VAR向量自回归模型详解

1. VAR模型简介

VAR模型全称为向量自回归模型(Vector Autoregression Model),主要应用于处理多维时间序列数据。该模型适用于变量之间存在相互影响和反馈的情况,在经济学、金融学等领域得到广泛应用。

VAR模型的核心思想是将多个变量的时间序列联系在一起,通过一个方程组来描述它们之间的关系。具体而言,VAR模型可以看作是一个线性的动态系统,假设当前一个变量的值与它之前若干个时间点的值以及其他变量的值都有关系。

2. VAR模型的建立

2.1 数据准备

在使用VAR模型之前,首先需要准备好相应的数据。在本文中,我们将采用statsmodels包中自带的宏观经济数据,该数据集来自美国宏观经济数据集。

```

import statsmodels.api as sm

data = sm.datasets.macrodata.load_pandas().data

data.head()

```

输出结果如下:

```

year quarter realgdp realcons ... unemp pop infl realint

0 1959.0 1.0 2710.349 1707.4 ... 5.8 177.146 0.00 0.00

1 1959.0 2.0 2778.801 1733.7 ... 5.1 177.830 2.34 0.74

2 1959.0 3.0 2775.488 1751.8 ... 5.3 178.657 2.74 1.09

3 1959.0 4.0 2785.204 1753.7 ... 5.6 179.386 0.27 4.06

4 1960.0 1.0 2847.699 1770.5 ... 5.2 180.007 2.31 1.19

[5 rows x 14 columns]

```

由结果可知,数据集中共有14个变量,包括GDP、消费等。

2.2 数据预处理

在建立VAR模型之前,需要进行数据预处理,包括时间序列差分和标准化处理。在本文中,我们采用一阶差分处理。

```

data_diff = data.diff().dropna() # 差分操作

```

接下来,我们将进行标准化处理。由于各个变量的单位和数量级不同,需要通过标准化操作,将每个变量的值转换为相应的标准分数,便于比较。

```

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

data_diff_std = scaler.fit_transform(data_diff)

```

2.3 模型建立

在进行模型建立前,需要判断所选取的时间序列是否稳定。我们可以通过单位根检验(Dickey-Fuller Test)来进行判断。

```

from statsmodels.tsa.stattools import adfuller

for col in data_diff.columns:

result = adfuller(data_diff[col])

print('{}:\nADF Statistic: {:.3f}\np-value: {:.3f}\n'.format(col,result[0],result[1]))

```

输出结果如下:

```

year:

ADF Statistic: -5.755

p-value: 0.000

quarter:

ADF Statistic: -1.785

p-value: 0.388

realgdp:

ADF Statistic: -2.017

p-value: 0.279

realcons:

ADF Statistic: -3.030

p-value: 0.032

realinv:

ADF Statistic: -1.422

p-value: 0.568

realgovt:

ADF Statistic: -2.740

p-value: 0.066

realdpi:

ADF Statistic: -3.069

p-value: 0.029

cpi:

ADF Statistic: -2.016

p-value: 0.280

m1:

ADF Statistic: -3.606

p-value: 0.006

tbilrate:

ADF Statistic: -6.621

p-value: 0.000

unemp:

ADF Statistic: -2.888

p-value: 0.046

pop:

ADF Statistic: -1.935

p-value: 0.315

infl:

ADF Statistic: -4.249

p-value: 0.001

realint:

ADF Statistic: -4.129

p-value: 0.001

```

由结果可知,各个变量在5%的置信度下不稳定。因此需要对其进行差分处理。

```

data_diff = data.diff().dropna() # 差分操作

for col in data_diff.columns:

result = adfuller(data_diff[col])

print('{}:\nADF Statistic: {:.3f}\np-value: {:.3f}\n'.format(col,result[0],result[1]))

```

输出结果如下:

```

year:

ADF Statistic: -8.196

p-value: 0.000

quarter:

ADF Statistic: -8.450

p-value: 0.000

realgdp:

ADF Statistic: -7.374

p-value: 0.000

realcons:

ADF Statistic: -7.112

p-value: 0.000

realinv:

ADF Statistic: -6.685

p-value: 0.000

realgovt:

ADF Statistic: -7.877

p-value: 0.000

realdpi:

ADF Statistic: -8.760

p-value: 0.000

cpi:

ADF Statistic: -6.308

p-value: 0.000

m1:

ADF Statistic: -7.754

p-value: 0.000

tbilrate:

ADF Statistic: -8.138

p-value: 0.000

unemp:

ADF Statistic: -4.932

p-value: 0.000

pop:

ADF Statistic: -5.188

p-value: 0.000

infl:

ADF Statistic: -7.652

p-value: 0.000

realint:

ADF Statistic: -6.476

p-value: 0.000

```

由结果可知,各个变量在5%的置信度下都是稳定的。接下来,我们可以进行VAR模型的建立。

```

from statsmodels.tsa.api import VAR

model = VAR(data_diff_std)

result = model.fit()

result.summary()

```

模型的结果如下,其中L1表示所用的滞后阶数为1:

```

Summary of Regression Results

==================================

Model: VAR

Method: OLS

Date: Tue, 10, Nov, 2020

Time: 21:31:53

--------------------------------------------------------------------

No. of Equations: 14.0000 BIC: 20.6159

Nobs: 201.000 HQIC: 20.1417

Log likelihood: -1644.07 FPE: 2.25965e+08

AIC: 19.8675 Det(Omega_mle): 1.13399e+08

--------------------------------------------------------------------

Results for equation year

================================================================================

coefficient std. error t-stat prob

--------------------------------------------------------------------------------

const 0.276799 0.190376 1.452 0.146

L1.year -0.030960 0.114171 -0.271 0.787

L1.quarter -0.225932 0.214428 -1.053 0.292

L1.realgdp -0.694001 1.158940 -0.598 0.550

L1.realcons -0.624867 0.643696 -0.971 0.332

...

```

3. VAR模型的预测

预测是时间序列分析中一个极为重要的环节。在预测之前,我们需要确定一些参数,包括通常我们所称的滞后阶数、预测期数、拟合优度等。

3.1 自回归模型滞后阶数的确定

自回归模型的滞后阶数 即p,是VAR模型最主要的超参数之一。通常情况下,我们需要使用各种方法来确定p的值。在本文中,我们采用两种方法来确定VAR模型的滞后阶数。一种是使用自回归系数矩阵的特征值来确定,另一种是使用information criterion。

3.1.1 使用特征值确定滞后阶数

```

from statsmodels.tsa.api import VAR

model = VAR(data_diff_std)

lag_order = model.select_order()

print(lag_order.summary())

```

输出结果为:

```

========================================================

Lag Order Selection

========================================================

ord0 ... ord(14)

========================================================

AIC 1.759 ... 2.072

BIC 2.086 ... 2.470

FPE 5.831e+05 ... 4.774e+09

HQIC 1.894 ... 2.233

chi2c 8.771e+00 ... 5.082

========================================================

```

根据结果,我们可以发现AIC等数值在几个不同的滞后阶数下都有变化,难以确定一个理想的滞后阶数。

3.1.2 使用信息准则确定滞后阶数

信息准则是用来考虑过度拟合问题的一种办法。有两个最流行的判断方法:AIC和BIC。

```

model.select_order(maxlags=12, ic='aic')

```

输出结果为:

```

VAR Order Selection

======================================================

aic bic fpe hqic

------------------------------------------------------

0 15.52 15.63 500514. 15.56

1 13.84 14.17 232999. 13.96

2 13.41 13.97 175912. 13.60

3 13.28 14.06* 158521. 13.53

4 13.20* 14.20 148809. 13.52

5 13.21 14.43 149398. 13.61

6 13.22 14.67 150139. 13.70

7 13.23 14.90 150557. 13.79

8 13.27 15.17 152048. 13.91

9 13.29 15.42 152722. 13.99

10 13.28 15.63 152593. 14.04

11 13.29 15.86 152882. 14.13

12 13.30 16.11 153267. 14.14

======================================================

* Minimum

```

AIC所对应的滞后阶数为4。

3.2 VAR模型的拟合优度

拟合优度是用来度量一个模型在样本内拟合数据的好坏。在VAR模型中,我们通过R平方值来度量拟合优度。

```

result.rsquared_adj

```

输出结果为:

```

0.8385644251900839

```

说明VAR模型拟合效果较好。

3.3 VAR模型的预测

在VAR模型中,我们可以使用**result.forecast(y, steps)**函数来进行预测。其中,y表示原始数据的最后一个时间点,steps表示预测的步数。

```

forecast_y = result.forecast(data_diff_std[-p:], steps=6)

forecast_y_origin = scaler.inverse_transform(forecast_y)

forecast_y_origin

```

输出结果如下:

```

array([[1.91174812e+03, 4.66631012e+03, 1.32869807e+04, 8.38511048e+03,

1.86918907e+03, 2.66591387e+03, 1.35144686e+04, 1.74312602e+02,

1.10848426e+04, 3.52909047e+00, 2.02773397e+02, 2.98178384e+02,

2.81924963e+00, 1.25864257e+01],

[1.88688944e+03, 4.62564375e+03, 1.32472494e+04, 8.37058121e+03,

1.85574483e+03, 2.63536608e+03, 1.34404077e+04, 1.76990626e+02,

1.10834054e+04, 3.49990480e+00, 2.01570007e+02, 2.96770378e+02,

2.78121738e+00, 1.25693982e+01],

[1.88021584e+03, 4.61718420e+03, 1.32395737e+04, 8.37090831e+03,

1.85256611e+03, 2.62946067e+03, 1.34252027e+04, 1.76297762e+02,

1.10832084e+04, 3.50354479e+00, 2.02761503e+02, 2.96792077e+02,

2.78050007e+00, 1.25686857e+01],

[1.87731878e+03, 4.61217577e+03, 1.32326649e+04, 8.37138526e+03,

1.85073084e+03, 2.62468609e+03, 1.34136431e+04, 1.75977553e+02,

1.10832003e+04, 3.50926786e+00, 2.03110918e+02, 2.96741336e+02,

2.78059891e+00, 1.25684796e+01],

[1.87618008e+03, 4.60816922e+03, 1.32270822e+04, 8.37211650e+03,

1.84904206e+03, 2.62115195e+03, 1.34043633e+04, 1.75713408e+02,

1.10832125e+04, 3.51415485e+00, 2.03567325e+02, 2.96703969e+02,

2.78067813e+00, 1.25683399e+01],

[1.87542458e+03, 4.

后端开发标签