SVAR建模前置三关:X-13季节调整、ADF检验与识别约束全解析

SVAR建模前置三关:X-13季节调整、ADF检验与识别约束全解析 简介面向经济学与计量经济学研究者的SVAR模型实操文档系统讲解从数据准备到模型诊断的完整流程。内容覆盖月度宏观数据选取、季节调整原理与Eviews操作、模型结构设定、参数估计及残差分析等关键环节并结合GDP、CPI、M2等变量说明实际处理细节。文档重点演示Census X-12/X-13季节调整与ADF平稳性检验的操作步骤对加法模型与乘法模型的适用场景做了清晰区分也给出了季节调整结果诊断、模型参数设定的注意事项有助于减少建模试错成本。资源为单个doc文档容量562KB文字简明、步骤连贯便于在Eviews中按步骤对照练习。已有378人学习下载适合经济类高年级本科生、研究生及需要独立完成宏观实证研究的科研人员参考。1. 为什么SVAR建模前要过三关SVAR和普通VAR最大的区别是它要把简化式残差里那个同期相关矩阵拆成有经济含义的结构冲击。实践中绝大多数第一次跑SVAR的人都会栽在同一个地方原始月度数据带着明显的季节效应ADF检验的结果在0阶和1阶之间摇摆VAR模型选出来的滞后阶数在两个准则里打架最后脉冲响应的置信区间宽到没法看。问题不在SVAR本身而在前置流程——季节调整、平稳性检验、识别约束设定这三关缺一不可。以CPI、FOOD、HOUSE、M1、VMI这组宏观月度数据为线索把从X-13季节调整到SVAR估计、脉冲响应分析的完整路径拆开讲透。适合已经知道VAR是什么、但第一次碰SVAR的研究者和做宏观数据分析的从业者。每一步都给出EViews里的具体入口和判断依据照着操作能复现遇到报错也能按章节定位排查。2. X-13季节调整加法、乘法与对数加法的判定2.1 时间序列的四个成分和两种叠加模型月度宏观数据里季节性因素会直接污染VAR的残差。食品价格在春节前后、鲜菜上市季节会有规律波动M1在季末年末也有脉冲式冲高这些季节特征如果不剔除模型会把季节性波动当成随机冲击来估计导致脉冲响应和方差分解的结果严重失真。时间序列分解的标准写法是X_t T_t C_t S_t I_t其中T是长期趋势C是循环变动S是季节变动I是不规则变动。对任何时刻都有E(I_t)0Var(I_t)σ²这是加法模型的前提。两种叠加模型的数学形式分别是加法模型X_t T_t C_t S_t I_t适用于趋势线性、季节波动幅度相对固定的序列比如PMI这类制造业景气数据。乘法模型X_t T_t × C_t × S_t × I_t适用于趋势呈指数增长、季节波动幅度随水平值放大的序列比如GDP、工业增加值、投资类名义值。判断一个序列适合哪类模型最直接的办法是看图形如果序列的波峰波谷幅度随时间变化不大选加法如果波动幅度随水平值上升而扩大选乘法。还有一个更细的分类是对数加法模型对序列取对数后再做加法分解适合同比增速呈线性增长的数据。本文里的CPI和VMI文档给出的结论是走对数加法模型。2.1.1 伪加法模型和样本长度的坑还有一种情况容易被忽略乘法模型要求季节因子不为0但某些农产品产量序列每年固定月份接近0此时乘法模型会产生严重偏差要用伪加法模型。这是X-13里单独一个选项在实际处理农产品产量这类序列时会用到。提示季节调整对样本长度有硬性要求。X-13至少要36个月以上的月度数据才能稳定估计季节因子原文从2021M01到2021M08只有8个月这个样本量做出来的季节因子不可靠。真要用这份数据做研究先扩充到至少3年否则后续ADF和VAR的自由度也不够。2.2 EViews里X-13的参数设定路径进入EViews后双击打开变量组选择Proc Seasonal Adjustment Census X-13。X-13是X-12的升级版加入regARIMA和离群值检测官方名称是X-13ARIMA-SEATS当前季节调整工具里功能最完整的就是它。在X-13设置窗口里需要关心的选项依次是1Method选择Multiplicative或Additive。CPI和VMI按上面的结论选加法。2Seasonal Filter选AutoX12 default。X-13会根据序列长度自动选择3×5或3×9移动平均滤子。如果诊断报告里M4超标再手动改成3×9。3Component Series to Save至少勾选Final Seasonally Adjusted Series生成以_SA结尾的调整后序列如果还要检查季节因子的变化再勾Final Seasonal Factor生成_SF序列。4Trend Filter选AutoX12 default。5ARIMA Model如果后续要做预测才需要配(p,d,q)(P,D,Q)s单纯做回归可以留空。6Trading Day/Holiday这个选项针对交易日效应和假日效应EViews默认按西方假日体系设计对中国数据不适用。原文文档里也明确写了“西方模式不适合中国模式”这一项要取消勾选。7Outliers选择AdditiveAO、Level ShiftLS和Transitory ChangeTC三种离群值。一次不建议全勾先选AO和LS运行后看诊断报告再决定要不要开启TC。8Diagnostics必须勾选否则拿不到质量评估报告。设置完成后点OK执行EViews会生成季节调整后序列。后续所有平稳性检验和VAR建模都用_SA序列。2.3 诊断报告M1到M11以及Q统计量的判读执行完季节调整输出报告里有一张Quality Assessment表列出M1到M11共11个诊断指标和加权Q统计量每个指标衡量季节调整质量的某个侧面。指标含义合格线M1季节成分对序列方差的相对贡献小于1M2季节因子随时间的稳定性小于1M3季节因子估计算法的稳定性小于1M4残差中是否还有季节成分小于1M5季节波动是否随时间变化过快小于1M6不规则成分相对脉冲的稳定性小于1M7不规则成分的自相关强度小于1M8季节因子与趋势的独立性小于1M9季节因子与不规则成分的独立性小于1M10极端值对季节因子的影响小于1M11季节模式是否稳定小于1Q统计量是M1到M11的加权综合。EViews的判断惯例是Q小于1为优1到1.5可接受超过1.5说明季节调整失败。实际操作中M4和M5最容易出问题。M4超标说明滤子长度不够季节因子没提干净回Seasonal Filter改成3×9M5超标说明序列里有结构性突变或离群值没识别出来回头把Outliers里的LS打开再跑一次。2.4 季节调整后序列怎么进Excel调整后序列在EViews里可以直接用Store或复制粘贴到Excel。注意粘贴时选Values而不是Formulas保留序列名和日期列。后续计算环比增长率Excel公式可以这样写C2/C1-1把公式填充到整个序列得到环比增速序列。做SVAR时如果用一阶差分D(_SA)而不是环比增速两者在量纲上是等价的线性变换差分更常用。3. ADF单位根检验趋势项、截距项和滞后阶数的选择3.1 平稳性放哪一步检查季节调整之后的序列不能直接进VAR。SVAR要求变量必须是平稳序列或者满足同阶单整且存在协整关系。原文引用SIMS1990的研究结论只有变量之间存在长期均衡关系即协整关系时VAR模型才能避免错误识别才能通过最小二乘法得到一致估计。处理顺序是季节调整 → ADF检验 → 同阶单整判断 → Johansen协整检验 → VAR/SVAR。不要跳过中间任何一步。3.2 ADF检验三个选项的组合规则进入路径Quick Series Statistics Unit Root Test。ADF检验的回归设定是Δy_t α βt γy_{t-1} Σ_{i1}^p δ_i Δy_{t-i} ε_t其中α对应截距项βt对应时间趋势项p对应滞后差分项。这三个成分怎么选直接决定检验结论。1检验对象Level、1st Difference、2nd Difference。对_SA序列先做Level如果ADF统计量不拒绝单位根再做1st Difference。多数宏观变量是I(1)也就是一阶差分后平稳。2附加项Intercept、Trend and Intercept、None。选择依据是看序列图。Quick Graph Line序列围绕0值上下波动选None。序列围绕非零常数波动选Intercept。序列整体随时间上升或下降选Trend and Intercept。3滞后长度Lag Length有两种方式。方法一User Specified里从0开始增加运行一次看一次最下方的AIC和SC值取两者同时最小或相近的期数。方法二Automatic Selection选AICMaximum Lag填7或更大EViews自动搜索。序列图形特征检验对象附加项围绕0值附近波动LevelNone围绕非零常数波动LevelIntercept有持续上升或下降趋势LevelTrend and Intercept一阶差分后围绕0波动1st DifferenceNone文档里提到“滞后阶数的问题”时引用了一条经验最佳滞后阶数主要根据AIC和SC准则判定从0开始逐个尝试。这个说法对ADF和VAR都适用。EViews里D(x(-1))表示x的一阶差分滞后1项在模型输出里看到这种写法就是滞后项的位置。3.3 用Python批量跑ADF做初筛实际项目里我不会在EViews里一个一个点而是先用Python把五个变量的ADF结果批量过一遍看清楚了再去EViews做正式建模from statsmodels.tsa.stattools import adfuller def check_unit_root(series, name): stat, p, usedlag, nobs, crit, icbest adfuller( series.dropna(), autolagAIC, maxlag12 ) result 平稳 if p 0.05 else 非平稳 print(f{name}: ADF{stat:.3f}, p{p:.3f}, lag{usedlag}, {result}) for level, cval in crit.items(): print(f 临界值 {level}: {cval:.3f}) for col in [cpi_d11, food_d11, house_d11, m1_d11, vmi_d11]: check_unit_root(data[col], col)adfuller里的autolagAIC等价于EViews的Automatic Selection的AIC模式maxlag12限定最大滞后12期。输出的p值大于0.05说明不能拒绝单位根序列非平稳p值小于0.05则拒绝单位根序列平稳。五个变量的结论要并列比较得出一致的是I(0)还是I(1)。3.4 同阶单整与Johansen协整检验如果ADF检验显示全部变量都是I(1)就可以直接做Johansen协整检验。如果变量里混着I(0)和I(1)不能做Johansen只能把I(1)的变量差分后再统一阶数。进入路径Quick Group Statistics Johansen Cointegration Test。选定变量后协整方程类型Intercept (no trend)最常用滞后阶数要和后面VAR保持一致。输出表里主要看Trace统计量。第一行原假设是0组协整关系如果Trace大于临界值拒绝原假设说明至少存在1组长期均衡关系第二行再看是否拒绝“最多1组”。如果至少拒绝一次说明变量间存在协整关系满足建立SVAR的前提。注意Johansen检验对滞后阶数敏感。先在前面用VAR的Lag Length Criteria确定阶数再回来做Johansen顺序别反。4. VAR到SVAR三件套诊断、可识别约束与矩阵设定4.1 VAR模型的初始设定进入EViewsObjects New Object VARVAR Type选Unrestricted VAR。内生变量填d(cpi_d11) d(food_d11) house_d11 d(m1_d11) d(vmi_d11)d()表示一阶差分_d11是X-13季节调整后的序列名。house_d11不带d()说明这个变量本身已经平稳不需要差分。先让所有变量都作为内生变量跑一遍初始滞后区间随便填(1,1)后续通过检验确定最优阶数。4.2 三件套之一滞后阶数检验在VAR工作表中Views Lag Structure Lag Length Criteria最大滞后填8或12。结果表里有LR、FPE、AIC、SC、HQ五个准则每个准则会在最小值对应的滞后期后面打星号。如果AIC给8阶、SC给2阶不要盲目跟着AIC走。月度数据滞后阶数超过4通常已经足够复杂5个变量8阶滞后的VAR每个方程要估计41个参数样本量在百级的话几乎没有自由度。先看SC和HQ再考虑AIC五个准则里至少三个一致时才采用。文档里说“滞后阶数越小越好”更准确的说法是在残差白噪声的前提下滞后阶数取最小值。阶数增加会让参数矩阵膨胀自由度损失严重脉冲响应也更容易发飘。4.3 三件套之二AR根稳定性检验Views Lag Structure AR Roots Table/Graph。AR根表里每个特征根的模长小于1就落在单位圆内模型稳定。这是脉冲响应分析和方差分解能做的前提。如果AR根表里有模长等于1或接近1的根说明VAR模型不稳定序列中可能还存在单位根回第3章重新做差分或者减少滞后阶数再试。AR根表同时给出根的模长和角度角度可以粗略对应波动周期比如月度数据模长接近0.9的复根往往对应12个月左右的季节周期但这只会在季节调整没做干净时出现。4.4 三件套之三格兰杰因果检验Views Lag Structure Pairwise Granger Causality Tests。这一步有双重作用一是确认哪些变量之间具有统计意义上的预测关系为SVAR的同期零约束提供参考。文档的做法是“构架的短期约束以格兰杰因果检验为主”。如果格兰杰检验显示变量A对变量B不显著那么SVAR的A矩阵里对应的同期系数就有理由设为0。二是识别外生变量。如果某个变量进入内生变量组后对其它所有变量的格兰杰因果都不显著可以考虑把它移到外生变量组减少需要估计的参数。提示格兰杰因果反映的是预测能力不是经济因果。做约束时优先用经济理论定大方向格兰杰结果用于辅助确认不要反过来。4.5 残差同期相关矩阵与SVAR引入条件在VAR窗口Views Residuals Correlation Matrix。观察残差之间的同期相关矩阵非对角线元素绝对值明显大于0说明简化式残差间存在同期相关性有必要上SVAR。如果所有非对角线元素都接近0直接停在这里用VAR就够了强行设约束反而引入噪声。4.6 SVAR可识别约束的数量拆分SVAR模型写成A e_t B u_te_t是VAR简化式残差u_t是结构冲击。AB型SVAR的可识别条件是约束总数至少为2k² - k(k1)/2以5变量为例2×25 - 5×6/2 35个约束。35个约束分三部分1B矩阵设为单位阵给出k²25个约束 2A矩阵主对角线元素设为1给出k5个约束 3还需要5个零约束放在A矩阵非对角线位置位置由经济理论和格兰杰因果确定。这种把B设为单位阵的设定是SVAR里的K型模型执行起来最简单但缺点很明显它默认所有结构冲击方差都是1。文档里专门有一条经验“最好不要把B矩阵设为单位阵”。更通用的做法是把B限制为对角阵给出k²-k20个约束这样A矩阵需要的零约束就从5个增加到10个模型更灵活也能估出结构冲击的标准差。4.7 矩阵设定与估计操作EViews里先生成矩阵对象Objects New Object Matrix-Vector-Coef名字填A维度5×5。然后在命令窗口里按格式逐项填约束A(1,1)1 A(1,2)NA A(1,3)NA A(1,4)NA A(1,5)NA A(2,1)NA A(2,2)1 A(2,3)0A(1,1)1表示A矩阵第1行第1列取1NA表示待估计参数0表示按经济理论强制为零的同期系数。EViews还支持直接写matrix(5,5) xdata创建5×5模板矩阵再逐项覆盖。约定A(2,3)0的写法里行号表示方程列号表示同期变量意思是第二个方程里第三个变量的同期影响被限制为0。填完后回到VAR窗口Procs Estimate Structural Factorization选Matrix选项和Short-Run Pattern在面板里填两个矩阵名A和B。EViews会根据零约束和待估参数估计出A和B矩阵里的数值和统计量。4.8 一组5变量短期约束的实际写法文档给出一组约束表达式值得逐条看e1 -c(1)*e2 - c(2)*e3 - c(3)*e4 - c(4)e5 1u1 e2 -c(5)*e1 - c(6)*e4 - c(7)e5 1u2 e3 -c(8)*e1 - c(9)*e4 - c(10)e5 1u3 e4 -c(11)*e1 - c(12)e3 1u4 e5 -c(13)*e1 - c(14)*e2 - c(15)e3 1u5第二个方程里没有e3的同期影响对应A矩阵中a230第四个方程里只有e1和e3对应a420、a450第五个方程里没有e4对应a540。这些0所在位置就是4.6节里算出的那5个零约束。用表格整理这些零约束的位置零约束位置说明来源a230第2个方程中第3个变量的同期系数为0短期约束设定a320第3个方程中第2个变量的同期系数为0短期约束设定a420第4个方程中第2个变量的同期系数为0短期约束设定a450第4个方程中第5个变量的同期系数为0短期约束设定a540第5个方程中第4个变量的同期系数为0短期约束设定实际的约束方向要根据研究主题换上面只是说明矩阵零位的排布逻辑。识别条件只要求零的个数够不代表位置随意位置必须来自两条依据经济理论上的同期因果方向以及格兰杰因果检验给出的统计信号。4.9 长期约束与短期约束怎么选短期约束作用于e_t对u_t的同期反应脉冲响应函数随时间推移会逐步衰减长期约束作用于累计脉冲响应描述结构冲击对变量的长期影响实质通过长期响应矩阵C的限制来识别A和B。EViews在长期约束的求解过程中无论矩阵C怎么填最后解出的A都是单位阵这一点很多资料没有明说。长期约束在货币政策分析里更常用其它领域用短期约束更方便解释。两者不能混用一次估计只能选一个。5. 脉冲响应与方差分解从结果反推约束是否合理5.1 脉冲响应函数的参数设置VAR/SVAR窗口里View Impulse Response。Impulses填产生冲击的变量Response填要观测的变量。5变量系统一次会输出25张小图不要全看先看围绕自己研究主题的几个关键组合。月度数据一般看24期到36期。少于24期看不到冲击衰减多于36期置信区间会明显变宽图形线条会变得不稳定。EViews里的响应区间默认是10期要手动改到24或36。5.2 方差分解的读取顺序View Variance Decomposition选项和脉冲响应一样。输出表每一行是一期比如第1、6、12、24期每一列是这个变量的方差贡献率。注意一期和一期的数据是累积的不是边际分解。分析时先看短期第6期再看长期第24期判断哪个冲击在时间维度上主导序列波动。5.3 用R代码画方差分解占比图EViews自带的方差分解图可以导出但要在论文格式下统一字体和图注时我一般把数据导出后用R重画。参考文档附的ggplot2模板替换成EViews导出的贡献率数据就行library(ggplot2) type - c(d(cpi_d11), d(food_d11), house_d11, d(m1_d11), d(vmi_d11)) nums - c(42.5, 18.3, 21.6, 10.2, 7.4) # 替换成24期方差分解的贡献率 df - data.frame(type type, nums nums) p - ggplot(data df, mapping aes(x Content, y nums, fill type)) geom_bar(stat identity, position stack, width 1) plabel_value - paste((, round(df$nums / sum(df$nums) * 100, 1), %), sep ) label - paste(df$type, plabel_value, sep ) p coord_polar(theta y) labs(x , y , title ) theme(axis.text element_blank()) theme(axis.ticks element_blank()) scale_fill_discrete(labels label)这段代码的逻辑是先按type和nums建堆叠柱状图再用coord_polar把直角坐标转成极坐标得到饼图。plabel_value把贡献率算成百分比拼到图例里。用的时候把nums替换成EViews方差分解表里第24期的数据并确保sum(nums)等于100。5.4 结果验证约束改一次图复现一次脉冲响应和方差分解出来以后做一件事改动约束矩阵里任一零位重新估计对比脉冲响应图的符号和幅度。如果约束的小改动导致脉冲响应符号方向翻转说明识别约束离真实经济结构太远零约束的位置需要重新推敲如果只是幅度变化方向稳定说明约束方向基本可信。这是判断SVAR识别是否可靠的最简单方法。另一个检查点是脉冲响应初期是否出现明显的阶梯状跳跃若同时叠加方差分解第一行某变量的贡献率异常高说明残差同期相关没有完全被A矩阵消化回去查零约束个数或位置。按这个顺序排查可以确认约束设定没问题先回到VAR窗口看残差相关矩阵确认非对角线相关性不为0再看AR根表确认全部根模长小于1最后改一次约束矩阵的零位重跑一次SVAR对比脉冲响应方向。如果方向稳定说明约束可复现如果方向翻转说明零位的位置需要用经济理论重新推导。这套流程在EViews里按Procs Estimate Structural Factorization进入每次修改A矩阵后重新估计不需要重头建VAR。本文还有配套的精品资源点击获取