前言
在計量經(jīng)濟學(xué)中,通常會引入向量自回歸(Vector Auto-Regression, VAR)模型
來研究變量與自身滯后項和其他因素滯后項之間的關(guān)系就珠。VAR 模型通常用于分析宏觀數(shù)據(jù)之間的關(guān)系、并據(jù)此做出因果推斷妻往,這種方法得到業(yè)界的廣泛認可。具體到風(fēng)險管理領(lǐng)域,可以用于 壓力測試情景生成寒锚、估計特定情景下資本變化情況、預(yù)測市場風(fēng)險走勢等方面违孝。 Python 的 statsmodels
庫提供了一系列的 VAR 模型相關(guān)的統(tǒng)計方法和模型生成函數(shù),可以較好進行探索性研究泳赋,并將代碼嵌入到已有系統(tǒng)雌桑。
本文將利用 Python 實現(xiàn) VAR 模型,驗證人民幣兌美元(USDCNY)匯率波動與各類宏觀經(jīng)濟因素之間的關(guān)系祖今。
VAR 模型介紹
假設(shè)研究 變量與
變量的關(guān)系校坑,用
與
代表 t 時刻變量值拣技,
和
代表
時刻,e代表殘差耍目, 1 階滯后項的 VAR 模型VAR(1)表示為:
模型用矩陣形式表示為:
變量選取
USDCNY 匯率預(yù)測需要首先分析將會涉及到哪些宏觀因素影響膏斤,本文參考了資料[3]并經(jīng)過數(shù)據(jù)驗證,最終選取 2011 年 1 月 至 2019 年 4 月的中美通貨膨脹差異(CAP, China-America Price difference)邪驮、中國外匯儲備 (FER, Foreign Exchange Reserve)和中美十年期國債收益率價差(TRS, Ten year treasury Rate Spread)莫辨。各變量的統(tǒng)計特征如下表所示:
變量名 | 實際含義 | 單位 | 均值 | 最大 | 最小 | 標(biāo)準(zhǔn)差 |
---|---|---|---|---|---|---|
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 作對數(shù)處理,以使得數(shù)據(jù)趨勢線性化喻粹,用 USDCNY 表示蟆融。
中美通貨膨脹差異(CAP)
采用中美通貨膨脹差異,代表中美物價水平差異守呜。分別以 2010 年 1 月的 中國物價指數(shù) CCPI和美國物價指數(shù) ACPI為基準(zhǔn)100型酥,通過中美兩國每月公布的 CPI 環(huán)比計算當(dāng)月 CPI 指數(shù)。中美通貨膨脹差異表示為兩國 CPI 變動幅度的差查乒,即 ,其中
為
,
為
弥喉。
中國外匯儲備(FER)
中國外匯儲備通過外匯儲備 基礎(chǔ)貨幣投放
貨幣供給(M2)來對人民幣長期貶值壓力。本文采用人民銀行按月公布的外匯儲備數(shù)據(jù)侣颂,并作對數(shù)處理档桃。
中美十年國債收益率價差(TRS)
根據(jù)利率平價理論,匯率與兩國利率水平有深刻的關(guān)系憔晒,所以選擇中美十年期國債收益率價差藻肄,即中國十年期國債收益率與美國十年期國債收益率之間的差作為衡量兩國收益率水平差距的指標(biāo)。
變量檢驗
ADF 平穩(wěn)性檢驗
傳統(tǒng)的計量經(jīng)濟方法往往用來刻畫平穩(wěn)時間序列的變化規(guī)律拒担,一個時間序列平穩(wěn)與否取決于其各項數(shù)字特征嘹屯,如均值、方差从撼、協(xié)方差等是否隨著時間的變化而變化州弟。對于非平穩(wěn)的時間序列,由于各項數(shù)字特征具有時變性低零,在各個時點上的隨機規(guī)律是不同的婆翔,所以就需要采用與之相適應(yīng)的建模方法。通常選擇ADF 單位根過程掏婶,也叫擴展的迪克富勒檢驗啃奴,用來檢測序列的平穩(wěn)性。該過程可通過statsmodels
庫中的 adfuller()
函數(shù)實現(xiàn)雄妥,如采用函數(shù)默認參數(shù)最蕾,則:
from statsmodels.tsa.stattools import adfuller
# adfuller(x, maxlag=None, regression="c", autolag='AIC', store=False, regresults=False)
# 直接采用默認參數(shù)進行檢驗
adfuller(data)
經(jīng)過對涉及到的四種經(jīng)濟變量進行 ADF 平穩(wěn)性檢驗依溯,發(fā)現(xiàn)進行一階差分(參數(shù)名稱包含Δ)后數(shù)據(jù)可以滿足穩(wěn)定性要求,即所有變量為 1 階單整瘟则,結(jié)果如下:
參數(shù)名稱 | ADF | P-VALUE | 延遲階數(shù) | 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 |
協(xié)整檢驗
平穩(wěn)性是進行時間序列分析的一個很重要的前提黎炉,很多模型都是基于平穩(wěn)下進行的,而現(xiàn)實中醋拧,很多時間序列單個來看是非平穩(wěn)的慷嗜,但是通過協(xié)整我們可以建立起兩個或者多個序列之間的平穩(wěn)關(guān)系,進而充分應(yīng)用平穩(wěn)性的性質(zhì)趁仙。所以協(xié)整檢驗(Cointegration)是從分析時間序列的非平穩(wěn)性入手洪添。
對本文涉及的四種變量,在差分前都是不平穩(wěn)的雀费,需要通過進行協(xié)整檢驗來判斷是否可以直接使用原始數(shù)據(jù)構(gòu)建 VAR 模型干奢。該過程可通過statsmodels
庫中的 coint()
函數(shù)實現(xiàn),即:
# coint(y0, y1, trend='c', method='aeg', maxlag=None, autolag='aic', return_results=None)
from statsmodels.tsa.stattools import coint
# 假設(shè)研究匯率和CAP之間的協(xié)整關(guān)系
coint(fdata['USDCNY'].dropna(),fdata['CAP'].dropna())
經(jīng)過研究 USDCNY 與CAP盏袄、FER忿峻、TRS 之間的協(xié)整檢驗,發(fā)現(xiàn)這三對關(guān)系均不存在長期均衡關(guān)系辕羽,VAR 模型應(yīng)采用一階差分后的數(shù)據(jù)構(gòu)建逛尚,檢驗結(jié)果如下:
數(shù)據(jù)關(guān)系 | COINT_T | P-VALUE | 1% | 5% | 是否通過協(xié)整檢驗 |
---|---|---|---|---|---|
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 模型的構(gòu)建
確定滯后項階數(shù)
在確定模型使用的參數(shù)后,最關(guān)鍵的就是確定滯后項階數(shù)刁愿。確定滯后項過程通過statsmodels.tsa.vector_ar.var_model.VAR
中的select_order()
函數(shù)實現(xiàn)绰寞,即:
from statsmodels.tsa.vector_ar.var_model import VAR
# 使用一階差分后數(shù)據(jù),構(gòu)建VAR模型铣口,數(shù)據(jù)區(qū)間選擇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'))
# 估計最優(yōu)滯后項系數(shù)
lag_order = mod.select_order()
# 輸出結(jié)果
print(lag_order.summary())
根據(jù) AIC滤钱、FPE 和 HQIC 準(zhǔn)則計算,最優(yōu)滯后系數(shù)是 1脑题,根據(jù) BIC 準(zhǔn)則計算為 0件缸。綜合考慮呻顽,本文采用 1 階滯后系數(shù)作為模型參數(shù)休涤。輸出結(jié)果如下表,*
代表最優(yōu)參數(shù)(只展示前五階):
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 |
生成模型
經(jīng)過上面的分析姆吭,我們準(zhǔn)備生成 1 階 VAR 模型已艰,通過fit()
函數(shù)實現(xiàn)痊末,即:
# 生成VAR模型
res = mod.fit(1)
# 輸出模型結(jié)果
print(res.summary())
輸出結(jié)果為:
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維殘差序列相互之間可以同期相關(guān)哩掺,但不與自身的滯后期相關(guān)舌胶,也就是 VAR 模型內(nèi)各個方程各自的殘差序列本身要求為白噪聲過程
。白噪聲過程定義如下:對于隨機過程疮丛,如滿足條件(1)
幔嫂;(2)
,則稱
為白噪聲過程誊薄。所以殘差檢驗涉及三個檢驗:
- 零均值假設(shè)檢驗履恩;
- 殘差序列的方差為有限數(shù)(方差可解)或者標(biāo)準(zhǔn)差為有限數(shù);
- 序列自身不存在相關(guān)性檢驗呢蔫。
零均值假設(shè)檢驗和有限標(biāo)準(zhǔn)差假設(shè)
零均值檢驗切心,即假設(shè) :殘差期望
,對于上述四項變量片吊,其殘差項假設(shè)檢驗 p-value 接近 1绽昏,無法拒絕原假設(shè),零均值假設(shè)成立俏脊。同時全谤,從下表中可以看到殘差項的標(biāo)準(zhǔn)差是有限數(shù),滿足有限標(biāo)準(zhǔn)差假設(shè)爷贫。
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 |
自相關(guān)性檢驗
殘差項自相關(guān)性檢驗通過Q檢驗(Ljung-Box 方法)實現(xiàn)认然,Q 檢驗的原假設(shè)為:檢驗最大滯后項 m 的自相關(guān)系數(shù)為0,即
=
= …… =
=0漫萄。在原假設(shè)成立的條件下卷员,Q(m)服從自由度為m的卡方分布。
首先腾务,先通過繪制殘差項自相關(guān)圖來觀察自相關(guān)性毕骡。可以看到岩瘦,四個變量基本都在邊界范圍內(nèi)未巫,無明顯自相關(guān)性。
# 繪制殘差項自相關(guān)圖担钮,最大滯后系數(shù)=10
res.plot_acorr(nlags=10, resid=True, linewidth=6)
plt.show()
然后進行 Q 檢驗橱赠,通過 statsmodels.tsa.stattools
中的 acf()
函數(shù)實現(xiàn) Q 檢驗,即:
from statsmodels.tsa.stattools import acf
# 以USDCNY變量為例箫津,調(diào)用acf函數(shù)獲得Q檢驗結(jié)果
(resid_acf, qstat, pvalue) = acf(res.resid['USDCNY'], nlags=10, qstat=True)
# 輸出Q檢驗結(jié)果
print(qstat)
下表為不同延遲系數(shù)峽狭姨,USDCNY變量的 Q 檢驗結(jié)果,證明無法拒絕原假設(shè)苏遥,同理可以證明其余變量的殘差為白噪聲饼拍。
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)因果關(guān)系檢驗
格蘭杰因果關(guān)系主要用來分析變量之間是否存在因果關(guān)系。一個變量如果受到另一個變量的滯后影響田炭,則稱它們具有Granger因果關(guān)系师抄。 VAR模型中 Granger因果關(guān)系檢驗的實質(zhì)就是檢驗一個變量的滯后變量是否可以引入到其他變量的方程中,并作為其內(nèi)生變量教硫。本文采用VAR模型窗口聯(lián)合檢驗叨吮,對人民幣匯率 VAR模型的4個方程進行格蘭杰檢驗辆布。其中原假設(shè)為
:對應(yīng)方程右側(cè)的全部變量不能夠 Granger 引起左側(cè)變量。
Python 直接提供了 test_causality()
函數(shù)實現(xiàn) Granger 因果檢驗茶鉴。即:
# 使用Wald(chi-sq)檢驗來判斷方程右側(cè)變量與USDCNY的Granger因果
print(res.test_causality('USDCNY',['USDCNY','CAP','FER','TRS'], kind='wald').summary())
對四個方程進行研究锋玲,具體結(jié)果參見下表『#可以看出 USDCNY惭蹂、CAP、FER 檢驗結(jié)果均拒絕原假設(shè)割粮,即這三種變量方程右側(cè)變量可以引起左側(cè)變量變化盾碗,具有格蘭杰因果關(guān)系;而 TRS 對應(yīng)的方程無法拒絕原假設(shè)舀瓢,方程右側(cè)變量不一定與左側(cè)有因果關(guān)系廷雅。
變量 | 聯(lián)合顯著 |
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 | 是 |
脈沖響應(yīng)分析
脈沖響應(yīng)分析會反映當(dāng) VAR 模型某個變量受到"外生沖擊"時,模型中其他變量受到的動態(tài)影響氢伟。我們會根據(jù)這些變量受到此沖擊后的一段時間內(nèi)的動態(tài)變化畫出脈沖響應(yīng)圖形榜轿。statsmodels
直接提供了脈沖響應(yīng)分析及繪制函數(shù)。其中脈沖響應(yīng)分析通過 irf()
函數(shù)朵锣。
# 直接對VAR模型進行脈沖響應(yīng)分析谬盐,默認為Cholesky方法。
res_irf = res.irf(5)
# 繪制脈沖響應(yīng)分析圖
res_irf.plot()
plt.show()
從脈沖響應(yīng)分析圖可以看出诚些,中美通貨膨脹差異(CAP)對匯率影響是正向飞傀,即中美通貨膨脹擴大,美元升值诬烹,影響會在第1期達到最大砸烦,持續(xù)到第 4 期;中國外匯儲備(FER)對匯率影響是負的绞吁,即外匯儲備增加幢痘,美元貶值,影響在第 1 期達到最大家破,并直到第 5 期仍有影響颜说;十年期中美國債價差(TRS)對匯率影響是負的,隨著利差擴大汰聋,美元貶值门粪,影響在第 1 期達到最大,并持續(xù)到第 3 期烹困。
方差分解
由于 VAR 模型參數(shù)的普通最小二乘估計量只具有一致性玄妈,單個參數(shù)估計值的經(jīng)濟解釋是很困難的。方差分解通過分析每一個結(jié)構(gòu)沖擊對內(nèi)生變量變化(通常用方差來度量)的貢獻度,進一步評價不同結(jié)構(gòu)沖擊的重要性拟蜻。因此绎签,方差分解給出對 VAR 模型中的變量產(chǎn)生影響的每個隨機擾動項的相對重要性的信息。
Python 提供了方差分解的函數(shù) fevd()
瞭郑,并可以直接繪制為圖形展示出來辜御。
# 進行方差分解,滯后系數(shù)為10
res_fevd = res.fevd(10)
# 輸出方差分解結(jié)果
print(res_fevd.summary())
# 繪制方差分解圖
res_fevd.plot()
plt.show()
方差分解結(jié)果為:
# 方差分解結(jié)果(僅展示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
…………
結(jié)合方差分解結(jié)果和分解圖屈张,發(fā)現(xiàn)4個變量對于匯率水平變動的方差貢獻率基本在第 7期達到穩(wěn)定的狀態(tài),人民幣匯率自身的方差貢獻占據(jù)絕對多數(shù)袱巨,最終穩(wěn)定在 94.77%左右阁谆,其次是外匯儲備,穩(wěn)定在 3.45%左右愉老,再次是十年期中美國債價差场绿,穩(wěn)定在 1.34%左右,最小的是中美通貨膨脹差異嫉入,大約為 0.44%焰盗。
VAR 模型預(yù)測
最后,我們通過 VAR 模型咒林,對后續(xù)匯率走勢進行預(yù)測熬拒。可以通過 plot_forecast()
實現(xiàn)垫竞。即:
res.plot_forecast(20)
plt.show()
結(jié)果如下:
總結(jié)
本文通過 Python 語言實現(xiàn) VAR 模型澎粟,研究了 USDCNY 匯率變動與其他宏觀因素的關(guān)系,其實本文生成的模型是什么并不重要欢瞪,因為數(shù)據(jù)處理方法活烙、變量選取、研究目的遣鼓,甚至數(shù)據(jù)選取區(qū)間變化都會影響模型的參數(shù)啸盏,但是關(guān)鍵是掌握 VAR 模型生成過程、如何進行參數(shù)和模型檢驗骑祟,理解統(tǒng)計結(jié)果含義回懦,用于其他復(fù)雜模型研究。