VAR模型研究USDCNY汇率影响因素(Python)

前言

在计量经济学中,通常会引入向量自回归(Vector Auto-Regression, VAR)模型来研究变量与自身滞后项和其他因素滞后项之间的关系。VAR 模型通常用于分析宏观数据之间的关系、并据此做出因果推断,这种方法得到业界的广泛认可。具体到风险管理领域,可以用于 压力测试情景生成、估计特定情景下资本变化情况、预测市场风险走势等方面。 Python 的 statsmodels库提供了一系列的 VAR 模型相关的统计方法和模型生成函数,可以较好进行探索性研究,并将代码嵌入到已有系统。

本文将利用 Python 实现 VAR 模型,验证人民币兑美元(USDCNY)汇率波动与各类宏观经济因素之间的关系。

VAR 模型介绍

假设研究x 变量与y 变量的关系,用x_ty_t代表 t 时刻变量值,x_{t-1}y_{t-1}代表 t-1 时刻,e代表残差, 1 阶滞后项的 VAR 模型VAR(1)表示为:
x_t = \alpha_0 +\alpha_1 x_{t-1}+\alpha_2 y_{t-1}+e_{1} \\ y_t = \beta_0 +\beta_1 x_{t-1}+\beta_2 y_{t-1}+e_{2}

模型用矩阵形式表示为:
\left[ \begin{matrix} x_t \\ y_t \end{matrix} \right ] = \left[ \begin{matrix} \alpha_0 \\ \beta_0 \end{matrix} \right ]+ A_1 \left[ \begin{matrix} x_{t-1} \\ y_{t-1} \end{matrix} \right ]+ \left[ \begin{matrix} e_{1} \\ e_{2} \end{matrix} \right ]

变量选取

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 变动幅度的差,即CAP =\Delta {CCPI}-\Delta {ACPI} ,其中\Delta {CCPI}\Delta {CCPI} = CCPI_t - CCPI_{t-1}, \Delta {ACPI}\Delta {ACPI} = ACPI_t - ACPI_{t-1}

中国外汇储备(FER)

中国外汇储备通过外汇储备 \rightarrow基础货币投放 \rightarrow货币供给(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 模型:
\left[ \begin{matrix} USDCNY_t \\ CAP_t \\ FER_t \\ TRS_t \end{matrix} \right ] = \left[ \begin{matrix} 0.00022 \\ -0.01692 \\ 0.00017 \\ 0.00106 \end{matrix} \right ]+ \left[ \begin{matrix} 0.28811&0.00087&-0.10648&-0.00555\\ 7.32121&-0.39307&-6.45608&0.31956\\ -0.07411&-0.00015&0.34224&0.00611\\ 2.14463&-0.02149&2.89339&0.06454 \end{matrix} \right ] \left[ \begin{matrix} USDCNY_{t-1} \\ CAP_{t-1} \\ FER_{t-1} \\ TRS_{t-1} \end{matrix} \right ]+ \left[ \begin{matrix} e_1 \\ e_{2} \\ e_{3} \\ e_{4} \end{matrix} \right ]

VAR 模型检验

残差检验 (白噪声检验)

VAR 模型成立的重要条件,就是模型的4维残差序列相互之间可以同期相关,但不与自身的滞后期相关,也就是 VAR 模型内各个方程各自的残差序列本身要求为白噪声过程。白噪声过程定义如下:对于随机过程\{x_t,t \in T\},如满足条件(1)E(x_t)=0, var(x_t)=\sigma^2, t\in T;(2) cov(x_t,x_{t+k})=0, (t+k)\in T, k\neq 0,则称\{ x_t \}为白噪声过程。所以残差检验涉及三个检验:

  • 零均值假设检验;
  • 残差序列的方差为有限数(方差可解)或者标准差为有限数;
  • 序列自身不存在相关性检验。

零均值假设检验和有限标准差假设

零均值检验,即假设 H_0:残差期望E(e_{i})=0,对于上述四项变量,其残差项假设检验 p-value 接近 1,无法拒绝原假设,零均值假设成立。同时,从下表中可以看到残差项的标准差是有限数,满足有限标准差假设。

e_{USDCNY} e_{CAP} e_{FER} e_{TRS}
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 检验的原假设为H_0:检验最大滞后项 m 的自相关系数为0,即\hat{\rho_1} =\hat{\rho_2} = …… =\hat{\rho_m}=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模型窗口联合\chi^2检验,对人民币汇率 VAR模型的4个方程进行格兰杰检验。其中原假设为H_0:对应方程右侧的全部变量不能够 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 对应的方程无法拒绝原假设,方程右侧变量不一定与左侧有因果关系。

变量 联合显著\chi^2统计量 Df Prob. 是否接受H_0
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()

结果如下:

VAR 模型预测

总结

本文通过 Python 语言实现 VAR 模型,研究了 USDCNY 汇率变动与其他宏观因素的关系,其实本文生成的模型是什么并不重要,因为数据处理方法、变量选取、研究目的,甚至数据选取区间变化都会影响模型的参数,但是关键是掌握 VAR 模型生成过程、如何进行参数和模型检验,理解统计结果含义,用于其他复杂模型研究。

参考资料

  1. statsmodels 库——Vector Autoregressions
  2. 张丽. 人民币汇率影响因素分析及预测[D].福州大学,2010.
  3. Python实现向量自回归(VAR)模型
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容