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

 

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • jvm的垃圾回收算法_jvm垃圾回收策略

    jvm的垃圾回收算法_jvm垃圾回收策略前言相比C语言,JVM虚拟机一个优势体现在对对象的垃圾回收上,JVM有一套完整的垃圾回收算法,可以对程序运行时产生的垃圾对象进行及时的回收,以便释放JVM相应区域的内存空间,确保程序稳定高效的运行,但在真正了解垃圾回收算法之前,有必要对JVM的对象的引用做一个简单的铺垫JVM对象可达性分析算法Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象扫描堆中的对象,看是否能够沿着GCRoot对象为起点的引用链找到该对象,找不到表示可以被回收想象一下,对象在什么情况下会被认为是垃圾对象呢?

  • TCP服务端和客户端连接

    TCP服务端和客户端连接TCP:Transmission Control Protocol 传输控制协议 ,是一种面向连接的、可靠的、基于字节流的传输层通信协议。注:先启动服务端,再启动客户端。客户端:package TCP;import java.io.IOException;import java.net.Socket;import java.util.Scanner;// 客户端pub…

  • jQuery页面顶部下拉广告

    本广告可以是图片也可以是Flash,可以设置自动播放的时间,可以手动停止和重播。效果展示 http://hovertree.com/texiao/jquery/80/源码下载:http://

    2021年12月27日
  • 自动刷视频挂机软件(电脑无限刷屏代码)

    该楼层疑似违规已被系统折叠隐藏此楼查看此楼[SPARKLES]。[GLOWINGSTAR]。[SPARKLES]。[CHRISTMASTREE]。。[SPARKLES][CHRISTMASTREE][CHRISTMASTREE]。。[SPARKLES][SPARKLES][CHRISTMAST…

  • 超详细!Vue-Router手把手教程

    超详细!Vue-Router手把手教程(目录)最近在重温vue全家桶,再看一遍感觉记忆更深刻,所以专门记录一下(本文vue-router版本为v3.x)。1,router-view<router-view>是一个功能性组

  • minhash算法_小k

    minhash算法_小k对于web网页去重的应用,如抄袭、镜像等,通过将网页表示为字符k-grams(或者k-shingles)的集合,把网页去重的问题转化为找到这些集合的交集。使用传统的方法存储这些巨大的集合以及计算它们之间的相似性显然是不够的,为此,对集合按某种方式进行压缩,利用压缩后的集合推断原来集合的相似性。 Jaccard相似性:只关注集合之间的交集大小。集合S和T的Jaccard相似性定义如下:

    2022年10月30日

发表回复

您的电子邮箱地址不会被公开。

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