Statsmodels SVAR(Python)无法添加外生变量问题求助
Statsmodels SVAR模型添加外生变量的解决方法
问题核心
statsmodels的SVAR类构造函数没有直接提供exog参数来指定外生变量,但可以通过先拟合包含外生变量的VAR模型,再基于该VAR结果初始化SVAR的方式绕开这个限制。你遇到的SVARResults' object has no attribute 'exog'错误,本质是因为IRF的蒙特卡洛模拟需要调用VAR模型时,找不到外生变量的引用。
修改后的代码实现
import numpy as np import statsmodels.api as sm from statsmodels.tsa.vector_ar.svar_model import SVAR # 设定AB约束矩阵 A = np.asarray([[1,0,0,0,0],['E',1,0,0,0], ['E','E',1,0,0], ['E','E','E',1,0],['E','E','E','E',1]]) B = np.asarray([['E',0,0,0,0],[0,'E',0,0,0], [0,0,'E',0,0], [0,0,0,'E',0],[0,0,0,0,'E']]) endogenous_vars = ["r","dyca", "infl", "dm","dex"] exogenous_vars=["dpcm"] # 第一步:先拟合包含外生变量的VAR模型 var_model = sm.tsa.VAR(reg_data[endogenous_vars], exog=reg_data[exogenous_vars]) var_results = var_model.fit(maxlags=12) # 第二步:基于VAR结果初始化SVAR模型 svar_model = SVAR(var_results, svar_type='AB', A=A, B=B) svar_results = svar_model.fit(solver='bfgs') # 计算脉冲响应并绘图 irf = svar_results.irf(periods=48) irf.plot() response=['dyca','dm','dex'] for i in response: irf.plot_cum_effects(impulse='r', response=i, plot_stderr=True, stderr_type='mc', repl=1500)
关键说明
- 先拟合VAR时传入外生变量,VAR结果会保留
exog属性,后续SVAR初始化时会继承这个属性 - SVAR类接受已拟合的VAR结果作为输入(而非直接传入原始内生数据),这样就能间接引入外生变量的信息
- 蒙特卡洛模拟计算IRF置信区间时,会正确读取继承的
exog属性,避免报错
内容的提问来源于stack exchange,提问作者EOmic
相关产品推荐
相关产品推荐

