TVP-VAR(TVP- SV- VAR)时变参数向量自回归模型 资料包中包含做tvp-var实证模型的完整讲解步骤(OX软件适用,Matlab可参考使用)、OX6.0和Matlab有关模型的代码以及eviews软件、OX6.0软件的压缩包

咱做宏观实证的都懂,用传统VAR的时候总有点膈应——假设系数从头到尾不变,就像默认十年前的货币政策对GDP的影响和现在一模一样,这不扯吗?疫情前后的经济结构、美联储加息的传导效果,哪哪都在变,这时候就得靠TVP-VAR(带随机波动率的就是TVP-SV-VAR)救场。时变参数能捕捉不同时期的系数变化,随机波动率(SV)还能抓变量本身的波动突变,比如2020年原油价格的暴跌,用传统VAR根本看不出这种极端波动的影响。

先唠OX软件,毕竟资料包里的OX步骤最完整,而且OX做时间序列计量天生顺手,尤其是带MCMC的贝叶斯模型。懒得自己搭框架的直接用资料包里的OX代码,把数据路径改成自己的就行,连先验参数都给你调好了。贴一段核心估计代码看看:

proc main()
    local data, y, tvpvar, prior, mcmc, results

    // 加载数据,替换成自己的宏观数据csv就行,资料包里有示例格式
    data = load("macro_data.csv");
    y = data[2:rows(data), 1:3]; // 取GDP、CPI、利率3个变量,跳过表头行

    // 初始化TVP-SV-VAR:滞后2阶,带常数项,开启随机波动率
    tvpvar = TVPVar();
    tvpvar.SetLags(2);
    tvpvar.SetEndogenous(y);
    tvpvar.IncludeConstant(true);
    tvpvar.EnableStochasticVolatility(true); // 关键!开启随机波动率就是SV版本

    // 设置先验分布——给模型初始值定个“合理范围”,不能太放飞
    prior = tvpvar.MakePrior();
    prior.SetTvpCoeffPrior(0.0, 1.0); // 时变系数先验均值0,方差1(贴合经济数据惯性)
    prior.SetSvPrior(0.1, 0.01); // 随机波动率的先验,给波动突变留空间但不夸张

    // MCMC抽样配置:抽10000次,前2000次当“预热”直接扔,每2次存1个样本降相关性
    mcmc = McmcSampler();
    mcmc.SetIterations(10000);
    mcmc.SetBurnin(2000);
    mcmc.SetThinning(2);

    // 跑模型、出结果、画图
    results = tvpvar.Estimate(prior, mcmc);
    results.PrintCoeffSummary(); // 输出参数后验统计量
    results.PlotTimeVaryingIRF(1, 3); // 画GDP对利率冲击的时变脉冲响应
    results.PlotStochasticVolatility(); // 画各变量的随机波动率图
endp;

这段代码里最省心的是EnableStochasticVolatility(true),直接把普通TVP-VAR升级成TVP-SV-VAR,不用自己写SV的状态空间模型;MCMC的burnin期就像烤面包的预热,前几次抽的样本太糙,扔了不心疼;时变脉冲响应图跑完直接出,不用自己再写循环计算每一期的IRF,资料包里的完整代码还加了结果保存功能,直接导成png插论文。

TVP-VAR(TVP- SV- VAR)时变参数向量自回归模型 资料包中包含做tvp-var实证模型的完整讲解步骤(OX软件适用,Matlab可参考使用)、OX6.0和Matlab有关模型的代码以及eviews软件、OX6.0软件的压缩包

要是习惯用Matlab的兄弟,资料包里也有现成的Matlab代码,核心是用MCMC抽样跟踪时变参数和随机波动率。贴一段核心估计函数的片段:

function [theta, sigma, irf] = tvp_sv_var_estimation(y, lags, n_draws, n_burn)
    [T, k] = size(y); % T是样本量,k是变量数
    theta = zeros(T, k*lags + 1); % 时变系数:每一期包含滞后项系数和常数项
    sigma = zeros(T, k); % 随机波动率:每一期每个变量的波动水平

    % MCMC抽样循环,抽够次数为止
    for draw = 1:n_draws
        % 抽样时变系数theta:用卡尔曼滤波跟踪状态,就像每天更新对股价的判断
        theta = sample_time_varying_coeff(y, sigma, lags);
        % 抽样随机波动率sigma:抓变量的波动突变,比如2008年的跳涨
        sigma = sample_stochastic_volatility(y, theta, lags);
        
        % 预热期过了再存结果,避免样本太糙
        if draw > n_burn
            saved_thetas(:, :, draw - n_burn) = theta;
            saved_sigmas(:, :, draw - n_burn) = sigma;
        end
    end

    % 计算时变脉冲响应:每一期的系数对应不同的冲击效果
    irf = compute_time_varying_irf(saved_thetas, saved_sigmas, lags);
end

这里的sampletimevaryingcoeff用卡尔曼滤波处理时变参数,就像你调奶茶甜度,试一次记一次,慢慢调到刚好;samplestochastic_volatility用的是多变量SV的MCMC方法,能同时捕捉多个变量的波动联动,比如通胀和利率的波动率总是一起涨。注意Matlab要装Statistics and Machine Learning Toolbox,不然MCMC的随机数生成会报错,资料包里的软件包没包含这个工具箱,得自己补(懂的都懂)。

最后说句实在的,刚碰时变模型的新人别自己啃文献头大,直接扒资料包里的完整讲解步骤,从数据预处理(比如差分、平稳性检验)到模型估计再到结果解读,一步一步跟着走就行;OX和Matlab的代码直接改数据路径就能跑,连OX6.0和Eviews的软件压缩包都打包好了,省得自己找安装包踩版本不兼容的坑。跑出来的时变脉冲响应图往论文里一放,答辩时老师问起来就说“考虑了经济结构的时变性和变量的波动突变,结果比固定系数VAR更贴合现实”,直接拿捏。咱做实证的,效率和实用才是王道对吧?

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐