前言
在计量经济学中,通常会引入向量自回归(Vector Auto-Regression, VAR)模型
来研究变量与自身滞后项和其他因素滞后项之间的关系。VAR 模型通常用于分析宏观数据之间的关系、并据此做出因果推断,这种方法得到业界的广泛认可。具体到风险管理领域,可以用于 压力测试情景生成、估计特定情景下资本变化情况、预测市场风险走势等方面。 Python 的 statsmodels
库提供了一系列的 VAR 模型相关的统计方法和模型生成函数,可以较好进行探索性研究,并将代码嵌入到已有系统。
本文将利用 Python 实现 VAR 模型,验证人民币兑美元(USDCNY)汇率波动与各类宏观经济因素之间的关系。
VAR 模型介绍
假设研究 变量与 变量的关系,用与代表 t 时刻变量值,和代表 时刻,e代表残差, 1 阶滞后项的 VAR 模型VAR(1)表示为:
模型用矩阵形式表示为:
变量选取
USDCNY 汇率预测需要首先分析将会涉及到哪些宏观因素影响,本文参考了资料[3]并经过数据验证,最终选取 2011 年 1 月 至 2019 年 4 月的中美通货膨胀差异(CAP, China-America Price difference)、中国外汇储备 (FER, Foreign Exchange Reserve)和中美十年期国债收益率价差(TRS, Ten year treasury Rate Spread)。各变量的统计特征如下表所示:
变量名 | 实际含义 | 单位 | 均值 | 最大 | 最小 | 标准差 |
---|---|---|---|---|---|---|
USDCNY | 人民币兑美元名义汇率 | - | 1.86 | 1.94 | 1.81 | 0.04 |
CAP | 中美通货膨胀差异 | - | 0.05 | 2.10 | -1.48 | 0.58 |
FER | 中国外汇储备 | 亿美元 | 10.42 | 10.59 | 10.29 | 0.09 |
TRS | 中美十年期国债收益率价差 | % | 1.23 | 2.01 | 0.32 | 0.43 |
人民币名义汇率( USDCNY)
人民币兑美元的名义汇率,采用中国人民银行公布的月度中间价。实际模型中,对 USDCNY 作对数处理,以使得数据趋势线性化,用 USDCNY 表示。
中美通货膨胀差异(CAP)
采用中美通货膨胀差异,代表中美物价水平差异。分别以 2010 年 1 月的 中国物价指数 CCPI和美国物价指数 ACPI为基准100,通过中美两国每月公布的 CPI 环比计算当月 CPI 指数。中美通货膨胀差异表示为两国 CPI 变动幅度的差,即 ,其中为, 为。
中国外汇储备(FER)
中国外汇储备通过外汇储备 基础货币投放 货币供给(M2)来对人民币长期贬值压力。本文采用人民银行按月公布的外汇储备数据,并作对数处理。
中美十年国债收益率价差(TRS)
根据利率平价理论,汇率与两国利率水平有深刻的关系,所以选择中美十年期国债收益率价差,即中国十年期国债收益率与美国十年期国债收益率之间的差作为衡量两国收益率水平差距的指标。
变量检验
ADF 平稳性检验
传统的计量经济方法往往用来刻画平稳时间序列的变化规律,一个时间序列平稳与否取决于其各项数字特征,如均值、方差、协方差等是否随着时间的变化而变化。对于非平稳的时间序列,由于各项数字特征具有时变性,在各个时点上的随机规律是不同的,所以就需要采用与之相适应的建模方法。通常选择ADF 单位根过程,也叫扩展的迪克富勒检验,用来检测序列的平稳性。该过程可通过statsmodels
库中的 adfuller()
函数实现,如采用函数默认参数,则:
from statsmodels.tsa.stattools import adfuller
# adfuller(x, maxlag=None, regression="c", autolag='AIC', store=False, regresults=False)
# 直接采用默认参数进行检验
adfuller(data)
经过对涉及到的四种经济变量进行 ADF 平稳性检验,发现进行一阶差分(参数名称包含Δ)后数据可以满足稳定性要求,即所有变量为 1 阶单整,结果如下:
参数名称 | ADF | P-VALUE | 延迟阶数 | 1% | AIC | 是否通过P-VALUE | 是否通过ADF |
---|---|---|---|---|---|---|---|
USDCNY | -1.57 | 49.71% | 1 | -3.50 | -564.94 | FALSE | FALSE |
ΔUSDCNY | -6.83 | 0.00% | 0 | -3.50 | -557.43 | TRUE | TRUE |
CAP | -2.39 | 14.32% | 12 | -3.51 | 134.33 | FALSE | FALSE |
ΔCAP | -8.24 | 0.00% | 11 | -3.51 | 134.16 | TRUE | TRUE |
FER | -1.57 | 49.81% | 6 | -3.50 | -542.30 | FALSE | FALSE |
ΔFER | -4.67 | 0.01% | 1 | -3.50 | -537.07 | TRUE | TRUE |
TRS | -2.30 | 17.25% | 0 | -3.50 | -70.23 | FALSE | FALSE |
ΔTRS | -8.94 | 0.00% | 0 | -3.50 | -65.98 | TRUE | TRUE |
协整检验
平稳性是进行时间序列分析的一个很重要的前提,很多模型都是基于平稳下进行的,而现实中,很多时间序列单个来看是非平稳的,但是通过协整我们可以建立起两个或者多个序列之间的平稳关系,进而充分应用平稳性的性质。所以协整检验(Cointegration)是从分析时间序列的非平稳性入手。
对本文涉及的四种变量,在差分前都是不平稳的,需要通过进行协整检验来判断是否可以直接使用原始数据构建 VAR 模型。该过程可通过statsmodels
库中的 coint()
函数实现,即:
# coint(y0, y1, trend='c', method='aeg', maxlag=None, autolag='aic', return_results=None)
from statsmodels.tsa.stattools import coint
# 假设研究汇率和CAP之间的协整关系
coint(fdata['USDCNY'].dropna(),fdata['CAP'].dropna())
经过研究 USDCNY 与CAP、FER、TRS 之间的协整检验,发现这三对关系均不存在长期均衡关系,VAR 模型应采用一阶差分后的数据构建,检验结果如下:
数据关系 | COINT_T | P-VALUE | 1% | 5% | 是否通过协整检验 |
---|---|---|---|---|---|
USDCNY-CAP | -1.57 | 73.41% | -4.01 | -3.40 | FALSE |
USDCNY-FER | -2.78 | 17.29% | -4.01 | -3.40 | FALSE |
USDCNY-TRS | -2.84 | 15.23% | -4.01 | -3.40 | FALSE |
VAR 模型的构建
确定滞后项阶数
在确定模型使用的参数后,最关键的就是确定滞后项阶数。确定滞后项过程通过statsmodels.tsa.vector_ar.var_model.VAR
中的select_order()
函数实现,即:
from statsmodels.tsa.vector_ar.var_model import VAR
# 使用一阶差分后数据,构建VAR模型,数据区间选择2011年1月-2019年4月
var_data = fdata.diff(1).dropna()
mod = VAR(endog=var_data,dates=pd.date_range('2011/1/1','2019/4/30',freq='M'))
# 估计最优滞后项系数
lag_order = mod.select_order()
# 输出结果
print(lag_order.summary())
根据 AIC、FPE 和 HQIC 准则计算,最优滞后系数是 1,根据 BIC 准则计算为 0。综合考虑,本文采用 1 阶滞后系数作为模型参数。输出结果如下表,*
代表最优参数(只展示前五阶):
Lag | AIC | BIC | FPE | HQIC |
---|---|---|---|---|
0 | -22.43 | -22.32* | 1.81E-10 | -22.39 |
1 | -22.62* | -22.06 | 1.497e-10* | -22.39* |
2 | -22.36 | -21.34 | 1.95E-10 | -21.95 |
3 | -22.33 | -20.85 | 2.03E-10 | -21.73 |
4 | -22.16 | -20.23 | 2.43E-10 | -21.38 |
5 | -22.11 | -19.72 | 2.61E-10 | -21.15 |
生成模型
经过上面的分析,我们准备生成 1 阶 VAR 模型,通过fit()
函数实现,即:
# 生成VAR模型
res = mod.fit(1)
# 输出模型结果
print(res.summary())
输出结果为:
Summary of Regression Results
==================================
Model: VAR
Method: OLS
--------------------------------------------------------------------
No. of Equations: 4.00000 BIC: -21.7619
Nobs: 98.0000 HQIC: -22.0760
Log likelihood: 555.958 FPE: 2.08919e-10
AIC: -22.2894 Det(Omega_mle): 1.71212e-10
--------------------------------------------------------------------
Results for equation USDCNY
============================================================================
coefficient std. error t-stat prob
----------------------------------------------------------------------------
const 0.000223 0.000891 0.251 0.802
L1.USDCNY 0.288111 0.101443 2.840 0.005
L1.CAP 0.000876 0.001161 0.754 0.451
L1.FER -0.106481 0.075257 -1.415 0.157
L1.TRS -0.005559 0.005007 -1.110 0.267
============================================================================
Results for equation CAP(略)
Results for equation FER(略)
Results for equation TRS(略)
Correlation matrix of residuals
USDCNY CAP FER TRS
USDCNY 1.000000 0.023897 -0.268585 -0.018433
CAP 0.023897 1.000000 -0.041244 0.049535
FER -0.268585 -0.041244 1.000000 0.079679
TRS -0.018433 0.049535 0.079679 1.000000
用矩阵形式表示 VAR 模型:
VAR 模型检验
残差检验 (白噪声检验)
VAR 模型成立的重要条件,就是模型的4维残差序列相互之间可以同期相关,但不与自身的滞后期相关,也就是 VAR 模型内各个方程各自的残差序列本身要求为白噪声过程
。白噪声过程定义如下:对于随机过程,如满足条件(1);(2) ,则称为白噪声过程。所以残差检验涉及三个检验:
- 零均值假设检验;
- 残差序列的方差为有限数(方差可解)或者标准差为有限数;
- 序列自身不存在相关性检验。
零均值假设检验和有限标准差假设
零均值检验,即假设 :残差期望,对于上述四项变量,其残差项假设检验 p-value 接近 1,无法拒绝原假设,零均值假设成立。同时,从下表中可以看到残差项的标准差是有限数,满足有限标准差假设。
Sample Std. Dev. | 0.0086 | 0.7071 | 0.0116 | 0.1773 |
Sample Mean | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
T-Statistic | -2.49E-16 | -1.51E-16 | 1.22E-16 | -9.34E-17 |
P-value | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
自相关性检验
残差项自相关性检验通过Q检验(Ljung-Box 方法)实现,Q 检验的原假设为:检验最大滞后项 m 的自相关系数为0,即 = = …… ==0。在原假设成立的条件下,Q(m)服从自由度为m的卡方分布。
首先,先通过绘制残差项自相关图来观察自相关性。可以看到,四个变量基本都在边界范围内,无明显自相关性。
# 绘制残差项自相关图,最大滞后系数=10
res.plot_acorr(nlags=10, resid=True, linewidth=6)
plt.show()
然后进行 Q 检验,通过 statsmodels.tsa.stattools
中的 acf()
函数实现 Q 检验,即:
from statsmodels.tsa.stattools import acf
# 以USDCNY变量为例,调用acf函数获得Q检验结果
(resid_acf, qstat, pvalue) = acf(res.resid['USDCNY'], nlags=10, qstat=True)
# 输出Q检验结果
print(qstat)
下表为不同延迟系数峡,USDCNY变量的 Q 检验结果,证明无法拒绝原假设,同理可以证明其余变量的残差为白噪声。
Lags | Q-static | P-VALUE |
---|---|---|
1 | 0.0016 | 0.9680 |
2 | 0.0029 | 0.9985 |
3 | 0.6327 | 0.8889 |
4 | 0.6706 | 0.9549 |
5 | 1.5531 | 0.9069 |
6 | 7.2448 | 0.2988 |
7 | 7.3753 | 0.3909 |
8 | 9.4478 | 0.3059 |
9 | 9.4546 | 0.3964 |
10 | 9.5543 | 0.4804 |
格兰杰(Granger)因果关系检验
格兰杰因果关系主要用来分析变量之间是否存在因果关系。一个变量如果受到另一个变量的滞后影响,则称它们具有Granger因果关系。 VAR模型中 Granger因果关系检验的实质就是检验一个变量的滞后变量是否可以引入到其他变量的方程中,并作为其内生变量。本文采用VAR模型窗口联合检验,对人民币汇率 VAR模型的4个方程进行格兰杰检验。其中原假设为:对应方程右侧的全部变量不能够 Granger 引起左侧变量。
Python 直接提供了 test_causality()
函数实现 Granger 因果检验。即:
# 使用Wald(chi-sq)检验来判断方程右侧变量与USDCNY的Granger因果
print(res.test_causality('USDCNY',['USDCNY','CAP','FER','TRS'], kind='wald').summary())
对四个方程进行研究,具体结果参见下表。可以看出 USDCNY、CAP、FER 检验结果均拒绝原假设,即这三种变量方程右侧变量可以引起左侧变量变化,具有格兰杰因果关系;而 TRS 对应的方程无法拒绝原假设,方程右侧变量不一定与左侧有因果关系。
变量 | 联合显著统计量 | Df | Prob. | 是否接受 |
---|---|---|---|---|
USDCNY | 17.54 | 4 | 0.002 | 否 |
CAP | 19.16 | 4 | 0.001 | 否 |
FER | 16.79 | 4 | 0.002 | 否 |
TRS | 5.305 | 4 | 0.257 | 是 |
脉冲响应分析
脉冲响应分析会反映当 VAR 模型某个变量受到"外生冲击"时,模型中其他变量受到的动态影响。我们会根据这些变量受到此冲击后的一段时间内的动态变化画出脉冲响应图形。statsmodels
直接提供了脉冲响应分析及绘制函数。其中脉冲响应分析通过 irf()
函数。
# 直接对VAR模型进行脉冲响应分析,默认为Cholesky方法。
res_irf = res.irf(5)
# 绘制脉冲响应分析图
res_irf.plot()
plt.show()
从脉冲响应分析图可以看出,中美通货膨胀差异(CAP)对汇率影响是正向,即中美通货膨胀扩大,美元升值,影响会在第1期达到最大,持续到第 4 期;中国外汇储备(FER)对汇率影响是负的,即外汇储备增加,美元贬值,影响在第 1 期达到最大,并直到第 5 期仍有影响;十年期中美国债价差(TRS)对汇率影响是负的,随着利差扩大,美元贬值,影响在第 1 期达到最大,并持续到第 3 期。
方差分解
由于 VAR 模型参数的普通最小二乘估计量只具有一致性,单个参数估计值的经济解释是很困难的。方差分解通过分析每一个结构冲击对内生变量变化(通常用方差来度量)的贡献度,进一步评价不同结构冲击的重要性。因此,方差分解给出对 VAR 模型中的变量产生影响的每个随机扰动项的相对重要性的信息。
Python 提供了方差分解的函数 fevd()
,并可以直接绘制为图形展示出来。
# 进行方差分解,滞后系数为10
res_fevd = res.fevd(10)
# 输出方差分解结果
print(res_fevd.summary())
# 绘制方差分解图
res_fevd.plot()
plt.show()
方差分解结果为:
# 方差分解结果(仅展示USDCNY)
FEVD for USDCNY
Period USDCNY CAP FER TRS
0 1.000000 0.000000 0.000000 0.000000
1 0.965425 0.004400 0.018898 0.011277
2 0.952320 0.004310 0.030453 0.012916
3 0.948737 0.004387 0.033559 0.013316
4 0.947936 0.004384 0.034303 0.013378
5 0.947770 0.004385 0.034452 0.013392
6 0.947738 0.004385 0.034482 0.013395
7 0.947731 0.004385 0.034488 0.013395
8 0.947730 0.004385 0.034489 0.013395
9 0.947730 0.004385 0.034490 0.013395
…………
结合方差分解结果和分解图,发现4个变量对于汇率水平变动的方差贡献率基本在第 7期达到稳定的状态,人民币汇率自身的方差贡献占据绝对多数,最终稳定在 94.77%左右,其次是外汇储备,稳定在 3.45%左右,再次是十年期中美国债价差,稳定在 1.34%左右,最小的是中美通货膨胀差异,大约为 0.44%。
VAR 模型预测
最后,我们通过 VAR 模型,对后续汇率走势进行预测。可以通过 plot_forecast()
实现。即:
res.plot_forecast(20)
plt.show()
结果如下:
总结
本文通过 Python 语言实现 VAR 模型,研究了 USDCNY 汇率变动与其他宏观因素的关系,其实本文生成的模型是什么并不重要,因为数据处理方法、变量选取、研究目的,甚至数据选取区间变化都会影响模型的参数,但是关键是掌握 VAR 模型生成过程、如何进行参数和模型检验,理解统计结果含义,用于其他复杂模型研究。