Python实现向量自回归(VAR)模型——完整步骤「建议收藏」

废话不多说,先开始分享:1.首先啥是VAR模型,我这里简略通俗的说一下,想看代码的童鞋直接跳到第3部分就好了:以金融价格为例,传统的时间序列模型比如ARIMA,ARIMA-GARCH等,只分析价格自身的变化,模型的形式为:其中称为自身的滞后项。但是VAR模型除了分析自身滞后项的影响外,还分析其他相关因素的滞后项对未来值产生的影响,模型的形式为:其中就是其他因子的滞后项…

大家好,又见面了,我是你们的朋友全栈君。

废话不多说,先开始分享:

20210127补充————————————–

很多童鞋都问我要源代码和数据,本来是因为工作原因不想公开的,后来越来越多的人私信跟我反映说没有参照物实在太抽象了,那鉴于时间也比较久了,很多细节我也有点模糊了,一个一个解释不过来,因此,就发布一下原来我项目的源代码和当时用的数据,真的有需要的童鞋可以下载做参考。附下载地址:

https://download.csdn.net/download/mooncrystal123/14945452

——————————————————————————————————————

1. 首先啥是VAR模型,我这里简略通俗的说一下,想看代码的童鞋直接跳到第3部分就好了:

以金融价格为例,传统的时间序列模型比如ARIMA,ARIMA-GARCH等,只分析价格自身的变化,模型的形式为:

y_{t} = \beta _{1}\cdot y_{t-1} + \beta _{2}\cdot y_{t-2} + ...

其中y_{t-1}称为自身的滞后项。

但是VAR模型除了分析自身滞后项的影响外,还分析其他相关因素的滞后项对未来值产生的影响,模型的形式为:

y_{t} = \beta _{1}\cdot y_{t-1} + \alpha _{1}\cdot x_{t-1} +\beta _{2}\cdot y_{t-2} + \alpha _{2}\cdot x_{t-2} + ...

其中x_{t-1}就是其他因子的滞后项。

总结一下,就是可以把VAR模型看做是集合多元线性回归的优点(可以加入多个因子)以及时间序列模型的优点(可以分析滞后项的影响)的综合模型。

VAR其实是一类模型,以上是最基础的VAR模型形式,其他还有SVAR,CVAR,VECM,同统称为VAR类模型。

2. VAR模型的建模步骤

这种数学模型都有固定的建模步骤:

1)画N个因子的序列相关图,计算相关系数 correlation coiffiant,查看一下线性相关度。(相关系数大小只反映线性相关程度,不反应非线性相关,如果等于0,不能排除存在非线性相关的可能。)

2)对N个因子的原始数据进行平稳性检验,也就是ADF检验。

VAR模型要求所有因子数据同阶协整,也就是N个因子里面如果有一个因子数据不平稳,就要全体做差分,一直到平稳为止。

3)对应变量(yt)和影响因子(Xt)做协整检验

一般就是EG协整关系检验了,为了看看Y和各个因子Xi之间是否存在长期平稳的关系,这个检验要放在所有数据都通过ADF检验以后才可以做。如果那个因子通不过协整检验,那基本就要剔除了。

4)然后就是通过AIC,BIC,以及LR定阶。

一般来说是综合判断三者。AIC,BIC要最小的,比如-10的AIC就优于-1AIC,LR反之要最大的。但是具体偏重那个,就看个人偏好,一般来说,博主的经验是看AIC和LR,因为BIC的惩罚力度大于AIC,大多数时间不太好用。

具体的实现步骤一般是,把滞后项的阶数列一个范围,比如1-5,然后直接建模,其他啥都不看,先看AIC,BIC,LR的值。一般符合条件的不会只有一个,可以挑2-3个最好的,继续进行。

5)定阶完成后,就是估计参数,看参数的显著性。

好的模型所有参数的要通过显著性检验。

6)对参数进行稳定性检验

VAR除了对原始数据要进行平稳处理,估计出来的参数还需要检验参数稳定性。

这是为了查看模型在拟合时,数据样本有没有发生结构性变化。

有两张检验方法,这两种方法的基本概念是:

第一个是:AR根,VAR模型特征方程根的绝对值的倒数要在单位圆里面。

第二个是:cusum检验,模型残差累积和在一个区间内波动,不超出区间。

这里要注意的是CUSUM检验的原价设(H0):系数平稳,备择假设才是不平稳。所以CUSUM结果要无法拒绝原假设才算通过。

只有通过参数稳定性检验的模型才具有预测能力,进行脉冲响应和方法分解分析才有意义。

7)使用乔里斯基正交化残差进行脉冲响应分析

举例:要分析和预测的是Y,影响Y的有两个因子X1,X2。

脉冲响应是1对1,根据以上条件,就要做两个脉冲响应分析,分别是:Y和X1,Y和X2。

看看不同因子上升或者下降,对Y的冲击的程度和方式(Y上升还是下降),以及持续时间。

8)使用乔里斯基正交化残差进行方差分解分析

举例:要分析和预测的是Y,影响Y的有两个因子X1,X2。

方差分解是1对1,根据以上条件,就要做两个方差分解分析,分别是:Y和X1,Y和X2。

9)为什么使用乔里斯基正交化残差?

因为进行方差分解和脉冲响应分析的时候,要求模型的残差为白噪声。但是!现实中,我们很难把所有影响Y的因素都囊括进方程,这就导致,现实中VAR模型的残差一般都不是白噪声。因此使用乔里斯基正交化来处理模型的残差。

VAR建模的时候以上面的条件为例,其实模型估计参数时会给出三个3个方程(应变量各自不同):

方程1:y_{t} = \beta _{1}\cdot y_{t-1} + \alpha _{1}\cdot X1_{t-1} +\Theta_{1}\cdot X2_{t-1} + \varepsilon _{t}

方程2:X1_{t} = \beta _{1}\cdot X1_{t-1} + \alpha _{1}\cdot y_{t-1} +\Theta_{1}\cdot X2_{t-1}+ \eta _{t}

方程3:X2_{t} = \beta _{1}\cdot X2_{t-1} + \alpha _{1}\cdot y_{t-1} +\Theta_{1}\cdot X1_{t-1}+ \omega_{t}

方程1的残差序列:\varepsilon _{t}

方程2的残差序列:\eta _{t}

方差3的残差序列:\omega_{t}

三个方程的乔里斯基正交化的步骤就是:

正交1:\frac{\eta _{t}}{\varepsilon _{t}}

正交2:\frac{\omega _{t}}{\varepsilon _{t}}

正交3:\frac{\omega _{t}}{\eta _{t}}

正交4:\frac{\frac{\eta _{t}}{\varepsilon _{t}}}{\frac{\omega _{t}}{\varepsilon _{t}}}

正交5:\frac{\frac{\eta _{t}}{\varepsilon _{t}}}{\frac{\omega _{t}}{\eta _{t}}}

最后用正交4/正交5,得到的序列就是乔里斯基正交化残差了。

乔里斯基正交化之前要对方程的变量按重要性排序,更重要的放在分子上。

 

 

3. 然后就是如何使用PYTHON 实现VAR模型的建模了:

以上的步骤是不是很庞大,看着很麻烦?但是电脑都会一下子嗖嗖嗖处理好的。

1)导入模块

# 模型相关包
import statsmodels.api as sm
import statsmodels.stats.diagnostic
# 画图包
import matplotlib.pyplot as plt
# 其他包
import pandas as pd
import numpy as np

2)画序列相关图

fig = plt.figure(figsize=(12,8))
plt.plot(changeXAUUSD,'r',label='XAU USD')
plt.plot(shfeXAU,'g',label='SHFE XAU')
plt.title('Correlation: ' + str(correlation))
plt.grid(True)
plt.axis('tight')
plt.legend(loc=0)
plt.ylabel('Price')
plt.show()

3)ADF单位根

python里的ADF检验结果就是下面的adfResult,我这里用output整理了一下,方便浏览。童鞋们也可以print结果,然后自行整理。

这里的数据格式应该是DataFrame里面的series格式,不过dataframe应该也可以吧,没试过。

adfResult = sm.tsa.stattools.adfuller(data,maxlags)
output = pd.DataFrame(index=['Test Statistic Value', "p-value", "Lags Used", "Number of Observations Used",
                                         "Critical Value(1%)", "Critical Value(5%)", "Critical Value(10%)"],
                                  columns=['value'])
 output['value']['Test Statistic Value'] = adfResult[0]
 output['value']['p-value'] = adfResult[1]
 output['value']['Lags Used'] = adfResult[2]
 output['value']['Number of Observations Used'] = adfResult[3]
 output['value']['Critical Value(1%)'] = adfResult[4]['1%']
 output['value']['Critical Value(5%)'] = adfResult[4]['5%']
 output['value']['Critical Value(10%)'] = adfResult[4]['10%']

4)协整检验

python里面的协整检验通过coint()这个函数进行的,返回P-value值,越小,说明协整关系越强

result = sm.tsa.stattools.coint(data1,data2)

5)模型估计+定阶

这里PYTHON真的很烦,python有两套var估计,一个是VARMAX,一个是VAR。我看了官方文档后,觉得估计参数和定阶还是用VARMAX最好,因为可以返回很多东西,尤其是summary()里面的统计结果特别详细,直接包含了AIC,BIC,HQIC。

这里要注意,PYTHON定阶没有LR这个指标,要看LR的童鞋只能用EVIEWS和R了。不过AIC,BIC也够用了。

这里插入的数据只能是DATAFRAME格式的,不然就报错。

给大家看一下数据构造吧:

lnDataDict = {'lnSHFEDiff':lnSHFEDiff,'lnXAUDiff':lnXAUDiff}
lnDataDictSeries = pd.DataFrame(lnDataDict,index=lnSHFEDiffIndex)
data = lnDataDictSeries[['lnSHFEDiff','lnXAUDiff']]

这里的fitMod和resid变量后面会用到哦~~

#建立对象,dataframe就是前面的data,varLagNum就是你自己定的滞后阶数
orgMod = sm.tsa.VARMAX(dataframe,order=(varLagNum,0),trend='nc',exog=None)
#估计:就是模型
fitMod = orgMod.fit(maxiter=1000,disp=False)
# 打印统计结果
print(fitMod.summary())
# 获得模型残差
resid = fitMod.resid
result = {'fitMod':fitMod,'resid':resid}

6)系数平稳检验:CUSUM检验

这里也注意,Python这里不像EVIEWS,python没有办法算AR根,弄不到AR根图,但是python可以进行cusum检验。返回3各变量,第2个是P-value值,记得我之前说的吗,cusum检验要无法拒绝原假设,也就是说P-value值要大于0.05

这里的resid就是前面模型的resid

# 原假设:无漂移(平稳),备择假设:有漂移(不平稳)
result = statsmodels.stats.diagnostic.breaks_cusumolsresid(resid)

7)脉冲响应图

orthogonalized=True代表使用乔里斯基正交,这里很奇葩,官方文档没有加plt.show(),但是博主亲身试验,一定要加,不然画不出来。terms代表周期数。

# orthogonalized=True,代表采用乔里斯基正交 
ax = fitMod.impulse_responses(terms, orthogonalized=True).plot(figsize=(12, 8))
plt.show()

8)方差分解图

这里要注意:

VARMAX很怪,没有做方差分解的方法,但是VAR这个方法里面有。(python就是这么任性!)

所以这里就用VAR重新估计,然后直接使用fevd进行方差分解

打印summary()可以看到方差分解的具体结果,plot可以画图,要记得加plt.show()哦~~

这里的dataFrame就是前面的data噢~~

md = sm.tsa.VAR(dataFrame)
re = md.fit(2)
fevd = re.fevd(10)
# 打印出方差分解的结果
print(fevd.summary())
# 画图
fevd.plot(figsize=(12, 16))
plt.show()

 

以上就是今日份的分享~~然后博主要开始吐槽了!

博主真是苦逼,最近定期要写研报,博主挑了个向量自回归模型(VAR)来研究,然而博主之前接触过的就只有MATLAB和python,matlab虽然做这种统计很方便,但是一个是博主好久不用啦有点生疏,还有一个是跟项目开发合在一起的话不方便。

然后博主现在天天用python,所以为了赶稿子,也只能硬着头皮用python搞一波了。但是,博主发现,全网,基本没有人用python搞过这种高级计量经济学模型,因为连范文都找不到1篇!!!!博主亲身尝试摸索后,虽然完成了研报,但是!博主还是要说,统计类的东西,要么用R,要么用EVIEWS,用Python真心苦逼!!!

主要是各个函数都藏在不知道什么旮旯角落里!!!有些还没有!比如AR根和AR图,要不是靠参考链接里R语言的一篇样板文,我都不知道还有个检验系数稳定性的方法叫cusum,再从另一篇样例里面找到python做cusum的样例。cusum的原假设和备择假设还跟普通检验不一样,反过来的,我查了好多中外文献,才确定这一点。python里面还没有EG因果关系检验,而协整关系检验的名字竟然叫coint……也是从另一篇样例文中找到的!!!都是泪…………

然后,python只能对VAR模型,VECM模型进行估计,其他var类模型,各位别白废力气寻找了,直接用EVIEWS或者R吧。

好啦~吐槽结束,博主可以保证,这是全网唯一的,最完整的利用python进行VAR模型建模的教程文了~~~

 

参考文献:

1. VARMAX官方样例

http://www.statsmodels.org/stable/examples/notebooks/generated/statespace_varmax.html

2. VARMAX官方文档

http://www.statsmodels.org/stable/generated/statsmodels.tsa.statespace.varmax.VARMAX.html?highlight=varmax

3.VARMAX fit官方文档

http://www.statsmodels.org/stable/generated/statsmodels.tsa.statespace.varmax.VARMAX.fit.html#statsmodels.tsa.statespace.varmax.VARMAX.fit

4.VARMAX fit返回值

http://www.statsmodels.org/stable/generated/statsmodels.tsa.statespace.mlemodel.MLEResults.html#statsmodels.tsa.statespace.mlemodel.MLEResults

5. CUSUM检验文献:平稳过程趋势项变点的CUSUM检验

https://www.ixueshu.com/document/1d642b472b5dc0717d721b29bfac1625.html#pdfpreview

6. CUSUM检验文献:关于CUSUM检验的改进

https://wenku.baidu.com/view/65d91ee1172ded630b1cb62c.html

7. cusum外文文献

https://doc.docsou.com/b77f40843604bd6fcc70f6d0b-10.html

8.python实现时间序列

https://max.book118.com/html/2017/1006/136205976.shtm

9.VAR python W3Cschool样例

https://www.w3cschool.cn/doc_statsmodels/statsmodels-examples-notebooks-generated-interactions_anova.html?lang=en

10.R语言实现VAR模型

https://blog.csdn.net/Imliao/article/details/80352158

11. python statsmodel手册

https://blog.csdn.net/qq_41518277/article/details/85101141#VARVAR_processes_175

12. python cusum检验方法说明:breaks_cusumolsresid

https://www.cherylgood.cn/doc/statsmodels/statsmodels-statistics/5bacda5744e2a52489c5292a.html

13.python 进行cusum检验样例

https://blog.csdn.net/CoderPai/article/details/83657386

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128944.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何创建属于自己的博客!「建议收藏」

    如何创建属于自己的博客!「建议收藏」如何创建属于自己的博客!首先,我们需要一些创建博客必须的工具,如下:1. 云虚拟主机+数据库。如果把创建网站比作盖房子的话,主机与数据库就相当于地基,是整个网站的基本,地基稳固,我们的房子

    2022年8月1日
    11
  • 为Nginx开启SSI模块以支持SHTML解析

    为Nginx开启SSI模块以支持SHTML解析

    2021年8月29日
    55
  • 根立加训练系统[通俗易懂]

    根立加训练系统[通俗易懂]根立加训练系统

    2022年5月22日
    135
  • Android—Gradle教程(九)完结篇

    Android—Gradle教程(九)完结篇前言到目前为止,Gradle基础以及Kotlin基础讲解完毕。因此,在本篇里,将会以Gradle的构建优化以及如何从Groovy迁移到KTS进行详解!话不多说,直接开始!1、Gradle构建优化优化都是些配置,快速过一下就行了!重点在迁移KTS1.1并行编译开启默认情况下Gradle处理多模块时,往往是挨个按顺序处理。在项目根目录下面的gradle.properties中设置开启并行编译,提升编译速度:org.gradle.parallel=true1.2开启编译守护进程(默认开启)

    2022年6月28日
    27
  • Java爬虫系列二:使用HttpClient抓取页面HTML

    爬虫要想爬取需要的信息,首先第一步就要抓取到页面html内容,然后对html进行分析,获取想要的内容。上一篇随笔《Java爬虫系列一:写在开始前》中提到了HttpClient可以抓取页面内容。今天就

    2022年2月16日
    39
  • Python基础常见面试题总结[通俗易懂]

    Python基础常见面试题总结[通俗易懂]以下是总结的一些常见的Python基础面试题,帮助大家回顾基础知识,了解面试套路。会一直保持更新状态。PS:加粗为需要注意的点。基础知识题1、深拷贝和浅拷贝的区别是什么?深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。浅拷贝是将对象的引用复制给另一个对象。因此,如果我们在副本中进行更改,则会影响原对象。**2、能否解释一下*args和kwar…

    2022年10月21日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号