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.