
简介面向经济学、金融学及相关专业学生与实证研究者这份PDF是一份完整的计量经济学VAR模型应用案例。案例以1978—2015年中国GDP增速与能源生产增速数据为基础按标准实证流程完整展开先后进行单位根检验判断序列平稳性利用Eviews 9.0建立无约束VAR模型通过AR根表与AR根图验证模型稳定性并结合LR、FPE、AIC、SC、HQ准则确定最优滞后阶数完成Granger因果检验。在此基础上进一步借助脉冲响应函数与方差分解深入揭示经济增长率与能源生产增长率之间的动态影响关系及贡献度变化结果分析还给出了供需平衡、政策与市场协同等现实启示兼具方法演示与应用参考价值。资源共1个PDF文件压缩包大小约632KB内容紧凑、可直接阅读已有318人学习下载适合从模型构建到结果解读的系统性自学也可作为课程作业或论文实证的参考模板。1. 从一份“完成”的报告说起VAR模型应用案例到底在解决什么问题宏观数据、金融序列很少单独变动。CPI、利率、货币供应量互相缠绕单方程回归会丢反馈。VAR模型把每一个内生变量都作为其余变量滞后项的方程成员同时估计整套动态反馈因此VAR模型是“让数据先说话”的标准起点。标着“完成”的PDF报告收尾工作往往卡在人不会把理论变成命令和判断需要一套能落到变量上的分析流程。以三类经济指标居民消费价格指数、工业增加值、贷款余额为例演示从ADF检验到脉冲响应的完整可复现路径。对量化分析、宏观策略和做预测系统的工程师VAR是建LSTM前值得先跑一遍的基准。打开报告PDF看到的不应该只是一串系数而应是数据路径、检验表和两个以上动态图形。2. 建VAR模型的数前准备平稳性与协整检验VAR要求所有内生序列为平稳过程。如果序列带单位根方程里的t检验、F检验和置信区间都会失真而“伪回归”现象会在案例报告里制造虚假结论。实际项目第一步不是直接调用fit()而是先把每个变量拆开看形态。statsmodels 是这一环节最常用的工具先以它为准走完整条预处理链路。2.1 数据从CSV到DataFrame先做肉眼与统计上的双重检查准备一份月度入库的CSV字段依次是日期、消费价格指数、工业增加值、贷款余额。用pandas读入后先看有没有缺失和年度突变。一张多子图走势图能直接暴露趋势项和异常值这比任何单位根检验都直观。import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(macro_data.csv, index_col0, parse_datesTrue) print(df.head()) print(df.dtypes) print(df.isnull().sum()) fig, axes plt.subplots(df.shape[1], figsize(8, 6)) for i, col in enumerate(df.columns): axes[i].plot(df[col]) axes[i].set_title(col) plt.tight_layout() plt.savefig(series.png, dpi150)这段代码先打印前五行和字段类型缺失值单独统计。随后按列画独立子图既能判断趋势是线性还是突变也能发现局部离群点。如果出现明显增长趋势原序列大概率非平稳。注意缺失值不要一上来就插值先用前后项观察连续缺口超过样本量5%时可以选用线性插值但要在报告里如实标注。2.2 单位根检验ADF与差分处理ADF检验是VAR应用案例里出现频率最高的前置检验。对每一列执行如下循环from statsmodels.tsa.stattools import adfuller for col in df.columns: stat, pval, lags, nobs, crit adfuller(df[col], autolagAIC) print(f{col}: ADF stat{stat:.3f}, p{pval:.4f}, AIC到{lag})autolagAIC让函数自动选择能消除残差自相关的滞后阶数。p值小于0.05才能拒绝“存在单位根”的原假设。如果某个序列p大于0.05就做一阶差分df_diff df.diff().dropna()差分之后要重新跑一次ADF确认差分序列平稳然后在后面用df_diff建模。这里的坑是多次差分会造成信息损失所以差分后模型解释的是“变化量的动态关系”不再是水平值。若后续需要预测水平值必须在模型预测结果上做累计还原否则最终报告的数据会明显偏离真值。2.3 Johansen协整检验同阶单整时的长期均衡校验当两个或以上序列都是一阶单整I(1)直接对差分序列建VAR会丢掉变量之间存在的长期均衡关系。协整检验就是判断这些I(1)变量是否存在平稳线性组合。经济学里“消费与收入长期同向”就属于协整含义。使用statsmodels的Johansen检验from statsmodels.tsa.vector_ar.vecm import coint_johansen res coint_johansen(df, det_order0, k_ar_diff1) print(res.lr1) # 迹统计量 print(res.cvt) # 90%, 95%, 99%临界值det_order0表示不包含确定性趋势k_ar_diff1表示差分项滞后期数为1也就是基础滞后。读取轨迹统计量与临界值矩阵在报告里列出“r0”“r≤1”两行。若第一个迹统计量大于95%临界值说明至少存在一个协整向量。此时如果项目目标是长期关系建模应转向VECM若更关注短期脉冲响应差分VAR也可以使用但必须注明结论只覆盖短期动态。实际交付报告时建议两条路线都做再比较预测误差。3. 滞后阶数选择与VAR模型拟合VAR系数估计本身不复杂复杂的是滞后阶数。滞后阶数选小了残差中会残留自相关选大了参数矩阵膨胀样本量不足时模型抖动明显。应用案例里最稳妥的方式是先用一个统一判据矩阵选阶再对选定模型做残差诊断。3.1 信息准则矩阵AIC/BIC/HQIC怎么选用statsmodels的select_order一次性得到多准则结果。from statsmodels.tsa.api import VAR model VAR(df_diff) lag_order model.select_order(maxlags8) print(lag_order[aic]) print(lag_order[bic]) print(lag_order[hqic])输出是一串每阶对应的信息量逐行看AIC、BIC和HQIC最低值落在哪一阶。常见习惯是BIC优先因为惩罚更重在样本量不宽裕时能防止过拟合。月度数据案例里BIC给出的阶数为2或3时采用1或2阶都很常见。表格对比是最适合放进PDF报告的格式lagAICBICHQIC112.4313.0212.66211.8212.4112.07311.7912.6812.11411.9112.2712.52注意表格数据仅是演示格式真实报告必须基于自己数据打印。若AIC和BIC相差很大优先选BIC且后面观察残差是否白噪声。3.2 statsmodels的VAR实现与参数解释选好阶数后直接构造VAR对象并拟合results model.fit(maxlags2, icbic, trendc) print(results.summary())trendc表示方程包含常数项适合均值不为零的差分序列。icbic会从0到maxlags之间自动选择准则最低的滞后数。拟合结果会输出每个方程各自的系数、标准误和R方。VAR应用案例中系数不能简单解读成“一个单位变化导致多少变化”因为滞后项之间存在多重共线性单独看某一个系数很可能有误导性。需要把视线转向后文的脉冲响应和方差分解才能理解变量间的实际传播路径。3.3 模型残差诊断自相关与正态性检验模型选得好不好看残差是否接近白噪声。对每个方程的残差做Ljung-Box检验resid results.resid from statsmodels.stats.diagnostic import acorr_ljungbox for col in resid.columns: lb_p acorr_ljungbox(resid[col], lags[12], return_dfTrue) print(f{col}: p {lb_p[lb_pvalue].values[0]:.3f})如果某一列p值小于0.05说明残差里还有可利用的信息滞后阶数不够需要加阶数。除了单变量白噪声还可以用results.test_normality()做多变量正态性检验但正态假设对VAR点预测影响不大大异常值更多体现在误差协方差矩阵放大。真正的坑在残差交叉相关性如果残差间高度同步后续的脉冲响应考虑用正交化版本。4. 应用案例核心产出脉冲响应、方差分解与格兰杰因果一份“完成”的VAR报告应该有这三个输出格兰杰因果判断谁领先谁脉冲响应说明传导路径方差分解量化贡献占比。三者配合使用才能回答“变量A变动后在多久、以多大程度影响变量B”。4.1 格兰杰因果检验用test_causality区分“谁领先谁”格兰杰因果在经济语境里不是哲学因果而是预测能力检验。原假设是“X不是Y的格兰杰原因”拒绝意味着加入X滞后项能显著改善对Y的预测。# 检验贷款余额loan是否对工业增加值ind有预测能力 c_test results.test_causality(causedind, causingloan, kindf) print(c_test.summary())kindf是F检验也可以用wald。caused是被影响变量causing是候选原因变量。结果的p值小于0.05说明loan的历史信息有助于预测ind。建议双向都测并把F统计量和p值并排做成表格。常见错误是仅测单向就下结论尤其是当两个变量互为格兰杰原因时报告需要明确写出这种反馈关系。4.2 脉冲响应函数IRF怎么观察传导路径脉冲响应用来考察某个变量受到一个标准差冲击后系统内其他变量的动态响应。irf results.irf(periods12) irf.plot(orthTrue) plt.savefig(irf.png)orthTrue做Cholesky正交化使各变量冲击之间互不相关。这一选项会受到变量排列顺序影响排在前面变量可以即时影响后面变量反过来则不行。应用案例里要根据业务假设排序比如货币政策排在价格前面贷款余额排在工业增加值前面。如果顺序换一下图形可能明显变化。稳妥做法是做两种顺序的图并列展示验证结论对排序不依赖。4.3 方差分解FEVD说明影响占比FEVD就是把预测误差方差按到来视图拆开观察各变量贡献比例随时间变化。fevd results.fevd(periods10) fevd.plot() plt.savefig(fevd.png)绘制的图中横轴是预测期数纵轴是贡献百分比。在报告里可以用表格形式输出第1、第4、第8期的数值表达“某变量的冲击解释了目标变量约X%的预测均方误差”。方差分解同样受排序影响结论要与IRF保持一致性。如果第10期后各变量贡献仍在剧烈变化说明系统收敛慢最好把期数扩大到20期再验证。5. 把VAR结论固化成PDF的轻量方案5.1 将检验结果与图表打包成结构化摘要VAR分析结果有很多数字直接在文档里贴控制台输出会显得杂乱。常见做法是把关键量写入字典再统一渲染。summary { 最优滞后阶数: results.k_ar, 格兰杰因果: {ind_from_loan: 0.01, loan_from_ind: 0.20}, ADF检验: {cpi: 0.04, ind: 0.10, loan: 0.03} } for k, v in summary.items(): print(k, v)这样做可以避免手动抄写造成的错漏后续还要生成PDF时也方便直接转成表格。5.2 用ReportLab与Matplotlib控制PDF页面输出Python生成PDF的方案很多ReportLab适合控制段落和表格位置。from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 c canvas.Canvas(var_case_report.pdf, pagesizeA4) c.drawString(72, 760, VAR Model Application Case) c.drawImage(irf.png, 72, 420, width460, height260) c.showPage() c.save()这里把IRF图放进一页A4画布。width460对应150dpi下约7.3厘米图片太大会拉伸模糊。中文标题需要用pdfmetrics.registerFont注册字体否则会乱码。如果公司统一用微软雅黑注册路径要注意中文字体文件名。生成的PDF若还要批注或合并可以用pdf编辑器处理想复核页面里的数字用pdfplumber按坐标抽取文本也顺便验证图上的标注没被截断。对于VAR案例报告把IRF和FEVD分开放在两页不要堆在一个页面。表格则建议用platypus的Table对象替代逐行drawString避免文字对齐错位。最后一个实用技巧绘制IRF前设置plt.rcParams[figure.dpi] 150同时在savefig时传bbox_inchestight这样得到的PNG与PDF页面边界更契合导出后再用pdf解析工具检查字体嵌入避免交付给评审方后打开出现缺失字体的问题。本文还有配套的精品资源点击获取