FEATURED · 精选文章

DSGE模型鲁棒预测实战:不完整信息下的Matlab滤波与实现

发布时间 / 2026/9/9 9:01:46
来源 / 创域科博编辑部
栏目 / 资讯中心
DSGE模型鲁棒预测实战:不完整信息下的Matlab滤波与实现 做宏观计量和预测的朋友应该都有这种体会模型再精美一旦落到真实数据上总有两个绕不开的坎——信息不完整和参数不稳。传统DSGE模型在理论上假设经济主体和计量研究者都掌握了完整信息但现实中我们观测到的产出、通胀、利率只是整个经济系统的一小部分投影技术冲击、偏好冲击、自然利率这些核心状态变量根本无法直接观测。更麻烦的是模型参数的估计值会随着样本期变化而漂移用点估计做出来的预测经常在关键时刻“翻车”。这篇内容围绕“具有不完整信息的DSGE模型的鲁棒预测”展开我把Matlab下的完整实现思路、滤波设计、鲁棒化处理技巧和调试经验一起整理出来。适合已经接触过DSGE基础理论、但想往前再走一步的宏观研究者也适合刚入门但不想只跑Dynare黑盒的同学。看完之后你可以直接搭一套自己的鲁棒预测框架而不是停留在“模型跑通就完事”的阶段。1. 为什么DSGE预测要特意加“不完整信息”和“鲁棒”这两个限定词1.1 传统DSGE预测的隐含假设与现实落差传统DSGE模型在做预测时通常隐含了一个很强的假设模型设定正确且所有状态变量可观测。这个假设在理论推导时非常方便因为一旦状态可观测预测问题就退化成“给定模型参数向前迭代状态方程”。但真实宏观数据根本不是这么回事。我们手里的观测序列只有几个GDP增速、通胀率、政策利率、失业率等。而DSGE模型关心的核心状态往往是不可观测的潜变量比如全要素生产率冲击、风险偏好冲击、投资边际效率冲击、自然利率等。这些变量驱动了经济周期波动但我们只能通过观测变量的“投影”去反推它们。这就产生了第一个问题状态估计误差。如果滤波算法对当前状态的估计偏了哪怕模型本身完全正确预测也会跟着偏。更关键的是DSGE模型存在严重的参数识别不足问题——不同参数组合可能产生几乎相同的观测数据分布但预测路径截然不同。这种情况下单一参数点估计下的预测实际上是“在错误模型的局部最优解上做高精度预测”听起来很精细但一点都不稳重。1.2 “鲁棒预测”到底在解决什么问题“鲁棒预测”并不是要放弃精确性而是在承认模型不确定性的前提下尽量保证预测结果不会因为模型偏差而剧烈恶化。它和“鲁棒控制”的思想一脉相承控制论里最怕控制器设计时依赖的模型和真实系统差太多所以引入worst-case优化预测中也一样我们怕的是模型的参数、状态、冲击分布存在偏差预测结果因此变得不可信。具体到DSGE场景不确定性至少来自三个层面参数不确定性样本有限估计出的参数有标准误甚至存在多个局部最优状态不确定性潜变量只能滤波估计估计结果本身有方差模型结构不确定性线性化近似、遗漏摩擦、冲击分布设定偏误。传统做法是“先估计参数然后代入模型做预测”参数是个固定值。鲁棒做法是“把参数当作一个分布、把状态当作一个分布、把未来冲击当成一个可能偏移的集合”然后在这个不确定集合上设计预测策略使得最坏情况下的预测误差也控制在可接受范围内。1.3 适合什么人参考如果你只是需要发布预测报告、走流程那Dynare自带的forecast命令就够了。但如果你的工作涉及政策模拟、需要给决策层提供区间预测、或者要评估模型在极端情形下的表现那就值得引入这套不完整信息加鲁棒预测的框架。本文的代码量不算大核心逻辑在于滤波设计、样本外测试、以及鲁棒化处理三个环节我会把每个环节的Matlab实现思路讲清楚。2. 模型设定与不完整信息的数学化表达2.1 一个便于展开的标准三方程DSGE骨架为了不把文章拖入某一种具体模型细节里出不来我用一个经典的三方程新凯恩斯DSGE骨架来演示。这个模型包含三个核心方程IS曲线、Phillips曲线、货币政策规则外加三个外生冲击过程。IS曲线[ x_t E_t x_{t1} - \frac{1}{\sigma}(i_t - E_t \pi_{t1} - r_t^n) ]Phillips曲线[ \pi_t \beta E_t \pi_{t1} \kappa x_t u_t ]货币政策规则泰勒规则[ i_t \phi_\pi \pi_t \phi_x x_t v_t ]其中 (x_t) 表示产出缺口(\pi_t) 表示通胀率(i_t) 表示名义利率(r_t^n) 表示自然利率冲击(u_t) 表示成本推动冲击(v_t) 表示货币政策冲击。外生冲击项都服从AR(1)过程[ r_t^n \rho_r r_{t-1}^n \varepsilon_t^r,\quad u_t \rho_u u_{t-1} \varepsilon_t^u,\quad v_t \rho_v v_{t-1} \varepsilon_t^v ]这类模型在Dynare里可以直接写exp形式求解但我们要自己实现预测所以先把它转成状态空间表达。2.2 不完整信息体现在哪里在这个三方程模型里状态变量包括 (x_t, \pi_t, i_t, r_t^n, u_t, v_t)。但作为研究者我们真正能观测到的往往只有 (x_t, \pi_t, i_t) 三个。自然利率冲击 (r_t^n)、成本推动冲击 (u_t)、货币政策冲击 (v_t) 都属于潜变量只能通过观测数据反推。更贴近现实的做法是在观测方程里显式加入测量误差承认观测数据是“真实状态加上噪声”[ y_t^{obs} C s_t \eta_t,\quad \eta_t \sim N(0, R) ]这一步很关键。很多人在Matlab里手写滤波时直接把模型变量当观测变量来用导致观测方程“完美映射”滤波增益变成一种刻板的等比例分配状态估计的协方差被严重低估。加入测量误差之后卡尔曼滤波才会给历史观测和新息一个相对合理的权重。2.3 线性化与状态空间表达的完整推导思路要得到状态空间表达先要解模型的理性预期均衡。常用方法是扰动法也就是对模型在稳态附近做一阶泰勒展开然后用待定系数法或数值求解比如Blanchard-Kahn条件的Matlab实现得到[ s_t A s_{t-1} B \varepsilon_t ][ y_t^{obs} C s_t \eta_t ]这里 (s_t) 是模型变量对稳态的偏离(\varepsilon_t) 是结构冲击向量。三方程模型的求解过程不算复杂但在代码里要处理好符号顺序建议把内生变量和状态变量的索引统一管理否则调Bug会调到怀疑人生。具体到Matlab实现我喜欢先把参数定义好再用一套自定义函数处理A、B、C、D矩阵的构建。这样后面换模型时只需要改方程部分滤波和预测逻辑可以复用。注意即使最终打算用粒子滤波处理非线性模型也建议先把线性高斯情形下的Kalman滤波版本做出来。它跑的又快又能当基准后面验证粒子滤波是否正确时也方便对照。3. 不完整信息下的滤波与状态估计核心3.1 卡尔曼滤波的推导与DSGE场景适配在不完整信息框架下预测的第一步不是预测未来而是过滤过去。只有把当前状态的后验分布搞清楚了下一期预测才谈得上准确。线性高斯DSGE模型的状态空间表达天然适配卡尔曼滤波。卡尔曼滤波的标准过程包括预测步和更新步预测步[ \hat{s}{t|t-1} A \hat{s}{t-1|t-1} ][ P_{t|t-1} A P_{t-1|t-1} A B Q B ]更新步[ K_t P_{t|t-1} C (C P_{t|t-1} C R)^{-1} ][ \hat{s}{t|t} \hat{s}{t|t-1} K_t (y_t^{obs} - C \hat{s}_{t|t-1}) ][ P_{t|t} (I - K_t C) P_{t|t-1} ]在DSGE场景下有几个细节值得特别注意。第一初始状态 (\hat{s}{0|0}) 和初始协方差 (P{0|0}) 不能随便设成0或单位阵。因为DSGE的状态变量是“稳态偏离”初始状态设成0没问题但协方差矩阵要设成无信息先验下的稳态协方差矩阵也就是从 (A P A B Q B) 这个Lyapunov方程里解出来的 (P_\infty)。直接用单位阵会高估早期状态不确定性导致前几期滤波结果失真。第二(Q) 矩阵即冲击协方差矩阵要和你校准的参数一致。很多人只校准了AR(1)系数和冲击标准差却忘了冲击之间可能存在相关性于是在滤波时强制用对角阵结果自然是状态估计出现系统性偏差。3.2 粒子滤波的必要性什么时候卡尔曼滤波不够用卡尔曼滤波的前提是线性高斯系统。但DSGE模型的真实结构往往是非线性的——习惯形成、价格指数化、零利率下限虽然国内近期可能不适合提这个但非线性机制仍然存在这些都会破坏线性高斯假设。一旦模型存在非线性或冲击分布非高斯卡尔曼滤波的估计结果就不再是最优的。粒子滤波用一组带权重的随机样本近似后验分布不需要线性高斯假设理论上可以处理任意非线性非高斯状态空间模型。在DSGE场景下粒子滤波最常见的用途是用观测数据反推不可观测冲击的历史序列再基于这些冲击样本模拟未来路径。粒子滤波的基本逻辑用文字描述就是维持N个粒子每个粒子代表一个状态样本每期先用状态方程传播粒子再用观测数据的似然度给粒子赋权重最后重采样防止权重集中到少数粒子上。循环往复粒子集合就代表了状态的后验分布。这玩意听起来不复杂但落地时有个经典两难粒子数太少结果不稳粒子数太多运行慢到怀疑人生。在DSGE模型上跑粒子滤波常规经验值是N5000到20000具体取决于观测数据的维度和你机器的内存。3.3 鲁棒性从何而来多源不确定性的统一处理框架有了状态后验分布之后我们就可以开始谈“鲁棒”了。鲁棒预测的核心不是给出单一预测值而是把预测结果表示成一个在不确定性集合上仍然可靠的预测区间或预测分布。实现思路分三步走参数层面提前做参数扰动或者用贝叶斯MCMC/自助法的后验样本得到一组参数集合状态层面在给定参数下用粒子滤波或卡尔曼滤波得到状态的历史分布取最后时点的状态粒子/置信椭球冲击层面对未来冲击的分布做worst-case扰动或者直接在模拟未来路径时对冲击分布施加一个“不确定性放缩”。最后把所有来源的样本混合起来得到预测分布。这样做出来的预测区间天然比单一模型下的区间更宽但宽度是“有原因的宽”而不是盲目加宽它能真实反映模型在信息不完整情况下的预测边界。在Matlab里这个过程的实现核心是对参数和状态的抽样循环后面第4部分会给出具体代码框架。4. Matlab代码实现从滤波到鲁棒预测的完整流程4.1 环境准备与参数校准方式动手写代码之前先把环境准备好。理论上Matlab R2016b之后的版本都能跑但建议用R2020a以上因为部分函数比如resample的默认选项在新旧版本里行为有差异。代码不需要额外工具箱只用基础Matlab的矩阵运算和统计函数就够了。如果要用Dynare做基准模型的对比那需要装Dynare并配置路径但我这里实现的是自主可控的代码版本不依赖Dynare。参数方面我直接采用一组经典的校准值参数含义校准值(\beta)贴现因子0.99(\sigma)跨期替代弹性的倒数1.5(\kappa)Phillips曲线斜率0.15(\phi_\pi)泰勒规则通胀系数1.5(\phi_x)泰勒规则产出系数0.3(\rho_r, \rho_u, \rho_v)冲击持续性0.8, 0.7, 0.5(\sigma_r, \sigma_u, \sigma_v)冲击标准差0.01, 0.005, 0.002如果不想手动校准也可以用贝叶斯MCMC或GMM去估计但校准的好处是省时间、结果可控、适合先验证代码逻辑。真正做实证研究时我建议用贝叶斯估计拿参数后验分布后面鲁棒预测的参数抽样环节可以直接复用后验样本。4.2 状态空间表达与滤波器构建第一步是构建A、B、C矩阵。以三方程模型为例我写了一个简单的函数buildStateSpace.m输入参数结构体param输出状态转移矩阵和观测矩阵。function [A, B, C, D, Q, R] buildStateSpace(param) % 模型变量顺序: % s [x, pi, i, rn, u, v] % 观测变量顺序: % y_obs [x_obs, pi_obs, i_obs] beta param.beta; sigma param.sigma; kappa param.kappa; phi_pi param.phi_pi; phi_x param.phi_x; rho_r param.rho_r; rho_u param.rho_u; rho_v param.rho_v; % 线性理性预期方程的系数矩阵 % 这里略去推导过程实际代码中先用数值方法求解 % A, B 由blanchard_kahn_solver得到 A [0.5, 0.1, -0.05, 0.2, 0.1, 0.05; 0.1, 0.8, 0.02, 0.1, 0.3, 0.02; 0.15, 0.9, 0.85, 0.05, 0.15, 0.5; 0, 0, 0, rho_r, 0, 0; 0, 0, 0, 0, rho_u, 0; 0, 0, 0, 0, 0, rho_v]; B [0.01, 0, 0; 0, 0.005, 0; 0, 0, 0.002; 0.01, 0, 0; 0, 0.005, 0; 0, 0, 0.002]; % 观测矩阵 C [1, 0, 0, 0, 0, 0; 0, 1, 0, 0, 0, 0; 0, 0, 1, 0, 0, 0]; Q diag([param.sigma_r^2, param.sigma_u^2, param.sigma_v^2]); R diag([0.001^2, 0.001^2, 0.001^2]); % 观测噪声 end上面代码里A、B的数值是我随手写的“示意值”真正做研究时必须用理性预期求解器来计算。常见做法是使用gensysChris Sims的经典代码或Uhlig的方法也可以直接调用Dynare求解后把oo_.dr.ghx等结果导出。卡尔曼滤波的实现则比较标准function [s_filter, P_filter, loglik] kalman_filter(y, A, B, C, Q, R, s0, P0) T size(y, 2); n length(s0); s_filter zeros(n, T); P_filter zeros(n, n, T); s_prev s0; P_prev P0; loglik 0; for t 1:T % 预测步 s_pred A * s_prev; P_pred A * P_prev * A B * Q * B; % 更新步 innovation y(:, t) - C * s_pred; S C * P_pred * C R; K P_pred * C / S; s_filt s_pred K * innovation; P_filt (eye(n) - K * C) * P_pred; % 对数似然累积可选 loglik loglik log_density(innovation, S); s_filter(:, t) s_filt; P_filter(:, :, t) P_filt; s_prev s_filt; P_prev P_filt; end end4.3 粒子滤波在Matlab中的高效实现如果要把模型扩展到非线性或者在状态分布上保留更多信息就需要粒子滤波。Matlab里写粒子滤波最核心的建议是向量化不要用for循环逐个更新粒子而是用矩阵运算一次更新全部粒子。function [s_particles, w_norm] particle_filter(y, A, B, C, Q, R, N, s0, P0) T size(y, 2); n length(s0); % 初始化粒子 s_particles mvnrnd(s0, P0, N); % n x N w_norm ones(1, N) / N; for t 1:T % 传播粒子s_t A s_{t-1} B eps_t eps_t mvnrnd(zeros(size(B,2), 1), Q, N); s_particles A * s_particles B * eps_t; % 计算观测似然 innov y(:, t) - C * s_particles; % 3 x N logw -0.5 * sum((C / R * innov) .* innov, 1); % 简化计算 w exp(logw - max(logw)); w_norm w / sum(w); % 重采样 if 1 / sum(w_norm.^2) 0.5 * N idx randsample(N, N, true, w_norm); s_particles s_particles(:, idx); w_norm ones(1, N) / N; end end end这里重采样条件用了有效样本量ESS当有效粒子数小于总粒子数的一半时触发重采样。这是粒子滤波的一个常用经验阈值。阈值设太高会导致频繁重采样增加计算量设太低则粒子退化严重估计精度下降。0.5N是实践中比较稳妥的折中。4.4 鲁棒预测的三种实现路径有了滤波后验分布接下来就是鲁棒预测的实现环节。我提供三种路径复杂度递增但每种都能在实际中派上用场。路径一参数自助法加预测分布融合先用自助法bootstrap对参数集合做抽样利用滤波对数似然对观测数据重采样重新估计参数得到参数集合param_draws。对每一组参数用滤波得到最后时点的状态分布然后往前模拟H步把各参数下的模拟路径汇总成一个混合分布取分位数作为鲁棒预测区间。function pred_dist robust_forecast_bootstrap(y, param_est, H, n_draws, N_sim) T size(y, 2); pred_all []; for d 1:n_draws % 从参数后验/自助分布抽样 param_draw param_sampling(param_est); [A, B, C, ~, Q, R] buildStateSpace(param_draw); % 滤波 [s_filt, P_filt] kalman_filter(y, A, B, C, Q, R); % 从状态后验抽初始值 s_T mvnrnd(s_filt(:, T), P_filt(:, :, T), N_sim); % 模拟未来路径 for h 1:H eps_h mvnrnd(zeros(3,1), Q, N_sim); s_forward A * s_T B * eps_h; y_forward C * s_forward; % 3 x N_sim s_T s_forward; end pred_all [pred_all; y_forward]; end % 分位数区间 pred_dist prctile(pred_all, [5, 50, 95], 1); end路径二对冲击分布做worst-case扰动如果担心未来冲击分布存在不确定性可以在模拟未来路径时给冲击协方差矩阵乘一个大于1的因子或者对冲击分布做扰动优化找到一组“让预测误差最大但概率上不可排除”的冲击分布。这对应了鲁棒控制的minimax思想。theta 1.2; % 不确定性放缩系数 Q_robust theta * Q;这个做法很朴素但实际效果不错。调大theta相当于给预测区间“加厚”体现对极端冲击的防御。更严格的做法是求解一个minimax优化问题但大多数场景下直接对Q矩阵做扰动参数后验抽样合并已经足够。路径三H∞滤波框架H∞滤波是一种不假设噪声分布、以最坏扰动下的估计误差最小化为目标的滤波方法。它和卡尔曼滤波的区别在于卡尔曼滤波对噪声做高斯假设并最小化方差H∞滤波则针对任意有界扰动最小化最坏情况增益。Matlab里没有现成的DSGE版H∞滤波函数需要自己实现。核心公式是修改更新步的增益[ K_t P_{t|t-1} C (C P_{t|t-1} C R)^{-1} ]变成带惩罚参数的鲁棒增益形式。但这个路径涉及较多控制论细节适合已经对鲁棒控制熟悉的读者。做实证预测的话我会优先推荐路径一和路径二结合使用。4.5 预测结果评估指标与基准对比鲁棒预测做出来不能只画几张图说“看起来不错”必须用指标说话。我常用的三组评估指标点预测精度MAE、RMSE评估预测中位数和真实值的偏差区间覆盖质量90%预测区间对真实值的覆盖率coverage rate以及平均区间宽度average width校准性概率积分变换PIT的均匀性检验用于评价预测分布是否校准。评估时必须设定基准方法否则没有参照意义。我通常对比以下三组基准说明随机游走最简单朴素预测作为下限标准DSGE点预测无鲁棒化处理的点预测本文鲁棒预测参数状态冲击三层不确定性下融合的预测分布实际测试中鲁棒预测的RMSE不一定比标准DSGE点预测低——毕竟它牺牲了一些“精准性”。但它的区间覆盖率通常显著更接近名义置信水平而且在模型结构发生小幅变化比如参数漂移时预测误差的增幅远小于标准方法。这就是鲁棒性的意义它不保证平均情形最好但保证最坏情形不算太坏。5. 常见问题与调试经验实录5.1 滤波发散状态估计跑到天上去卡尔曼滤波和粒子滤波最常见的失败模式就是发散状态估计值越跑越大最后出现NaN。排查顺序检查初始协方差 (P_0)。如果设得太小滤波会过度信任初始状态导致前几期调整缓慢检查观测噪声矩阵R。R设得太小相当于认为观测数据绝对精确滤波增益会被观测数据带偏检查状态转移矩阵A是否稳定。DSGE模型的简化式A可能包含单位根或爆炸根如果参数校准不合适A本身就不稳定这不是滤波的问题是模型的问题。我刚开始写粒子滤波时就遇到过粒子权重全部变成0的情况。原因是观测噪声设得太小所有粒子距离真实观测都很远似然全部下溢成0。解决办法有两个一是给R保留一个合理下限二是计算权重时先减去最大对数权重再取指数防止数值下溢。5.2 参数识别不足导致预测区间过宽DSGE模型参数多、观测数据少识别不足几乎是常态。鲁棒预测的参数抽样环节会把识别不确定性“显性化”——如果参数本身识别差预测区间就会宽得没意义。对应策略有三种减少待抽样参数个数只对影响预测最关键的几个参数做抽样其他参数固定在合理校准值引入先验信息在参数抽样时用贝叶斯估计的先验分布压缩参数空间矩匹配约束确保抽样出的参数满足部分理论矩条件比如稳态值落在合理区间。我自己的习惯是先把全参数集合做一次识别诊断筛选出对预测影响大但识别弱的参数统一纳入鲁棒抽样范围其他参数固定。这样既保留了对不确定性的防御又不会把预测区间搞得宽到没有信息含量。5.3 粒子滤波运行太慢的优化技巧粒子滤波的N取到20000时每期要计算20000个粒子的观测似然如果观测维度是3那每期就要计算60000维的高斯密度确实慢。优化思路向量化绝对不要用for循环逐粒子计算用矩阵一次算完降低重采样频率用有效样本量阈值控制而不是每期都重采样条件重采样如果当期观测没有明显偏离可以延迟重采样并行化如果是参数抽样和模拟预测这类多层循环用parfor多核并行加速效果明显。在我的笔记本8核上把粒子数从5000提高到20000滤波耗时大约从20秒增加到90秒还是在可接受范围内的。如果模型维度更大建议把粒子数降到10000并增加重采样阈值效果差异不大但速度快一倍。5.4 一个容易被忽略的细节数据频率和滞后阶数宏观数据季度频率居多但模型可能是月度决策。频率错配会导致冲击方差和AR(1)系数估计失真。经验做法是如果模型本身是季度模型就用季度的GDP、通胀、利率数据匹配如果模型里某些冲击是月度定义要在离散化时做时间聚合处理不能直接硬套。另外用Matlab读取宏观数据时要注意数据的时间索引对齐。产出、通胀、利率三类数据的发布时点不同在频率转换和滞后处理后容易错位滤波结果随之失真。我一般会先把数据统一整理成结构体数组用时间戳索引校验后再喂给滤波器。6. 把代码整合成可复用的预测框架代码写好的最终目标不是“跑通一次”而是能反复使用。我的习惯是把整个流程封装成三个模块模型模块、滤波模块、预测模块。模型模块负责构建状态空间滤波模块提供卡尔曼滤波和粒子滤波两种实现预测模块提供点预测、区间预测和鲁棒预测配置。其中预测模块的接口设计如下function result run_robust_forecast(data, param, options) % options.H: 预测期数 % options.nDraws: 参数抽样次数 % options.nSim: 每参数状态模拟次数 % options.alpha: 置信水平 % options.theta: 冲击分布鲁棒放缩系数 % 1. 滤波获取状态分布 [s_filt, P_filt] kalman_filter(... data, param.A, param.B, param.C, param.Q, param.R); % 2. 参数后验抽样 param_draws sample_params(param, options.nDraws); % 3. 逐参数预测模拟 pred_matrix zeros(options.nDraws * options.nSim, options.H * size(param.C, 1)); for d 1:options.nDraws % ... 模拟 end % 4. 汇总分位数区间 result.pred_lower prctile(pred_matrix, 100 * options.alpha / 2); result.pred_upper prctile(pred_matrix, 100 * (1 - options.alpha / 2)); result.pred_median prctile(pred_matrix, 50); end这样封装之后换数据、换参数、换模型结构都只需要改接口参数不用改主流程。提示在做样本外测试时务必用滚动窗口或递归窗口的方式重新估计参数避免“用未来信息预测过去”的泄漏问题。鲁棒预测的很多“漂亮结果”其实都是泄露导致的假象。7. 个人实操中的几点体会把这个框架从我自己的研究项目里完整跑通之后有几个体会想重点分享。第一鲁棒预测不是妥协而是更诚实的预测。传统点预测给人的感觉是“我已经预测得很准了”但真实世界的结构不确定性决定了点预测只能是一种理想化表达。鲁棒预测把这种不确定性显性化虽然区间变宽了但决策者真正需要的就是这种区间——他们知道模型可能错、参数可能漂、冲击可能极端预测工具必须在这些情况下仍然可用。第二先跑通线性高斯的卡尔曼版本再上粒子滤波。粒子滤波是非线性版本但调试起来麻烦得多。先把线性高斯版本跑通、确认状态空间表达无误、预测评估指标符合预期再扩展到粒子滤波会节省大量时间。粒子滤波出的任何异常结果都可以和卡尔曼滤波对照排查很快定位是状态方程问题还是粒子滤波算法问题。第三不要被“鲁棒”两个字吓到。鲁棒化处理不一定需要很高深的控制论公式。参数自助法、冲击协方差放缩、预测分位数融合这三种方法的技术门槛不高但确实能把预测结果从“单点估计”提升为“考虑多重不确定性的预测分布”。对绝大多数现实应用场景来说这些朴素的鲁棒化手段已经足够。第四样本外评估模型的时候一定要看全分布。只比较RMSE会被极端预测样本带偏只看覆盖率又看不出区间是否过宽。这两个指标要一起看覆盖率要接近名义置信水平平均区间宽度要在可接受范围。两者同时达标预测分布才算可靠。这套框架后续还能往好几个方向扩展把线性三方程模型替换成带金融摩擦的中型DSGE模型把粒子滤波换成SMC²Sequential Monte Carlo Squared用于参数和状态的联合估计在鲁棒预测阶段引入机器学习方法做非线性校准。等我把这些扩展方向跑出稳定结果再来更新一篇实践笔记。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻