halo 的技术博客

返回

月度 CPI、季度 GDP、每周首次申领失业金——这些「慢变量」是资产定价的锚,但它们出得慢、频率低。等月度数据公布,市场早已 price in。真正的信息 Advantage 在日频:股价、利率、搜索指数、卫星图像、信用卡消费……这些「快变量」几乎实时跳动,且往往领先慢变量一个月甚至一个季度。问题是:怎么把几百个日频观测,干净地喂进一个只有 120 个样本点的月度回归?直接降采样会丢掉信息,直接堆几十个滞后又会瞬间耗尽自由度。MIDAS(Mixed-Data Sampling,Ghysels-Kobracki-Kounanos, 2001)的巧思正是:用一个参数化的权重多项式,把几十个高频滞后压缩成 2 个参数,既保留高频信息、又不爆自由度

结论先放这:在「日频流量领先月度目标一个月」的合成设定下,Beta-MIDAS 用近 42 个日频滞后(近 2 个月)做混频加权,样本内 R²=0.912,样本外递归预测 R²=0.896;而只用月度历史的 AR(1) 样本外 R² 仅 0.223、朴素「用上月值」只有 0.007。 差距来自高频数据的领先性 + Beta 权重对日内噪声的平滑。但 MIDAS 要过的陷阱(权重误设、混频对齐、过拟合、频率噪声)同样不轻,文末单列六类。

混频数据:日频流量领先月度目标一个月,并叠加日内噪声

一、混频回归的动机:为什么不能简单降采样#

最常见的偷懒做法是「把日频 x 取月均值,再和月度 y 跑 OLS」。问题在于两处失真:

  1. 信息损失:月均值把 21 个交易日的日内走势抹平,而真正有预测力的往往是「月末加速」「月初跳变」这类时序形态, averaging 直接抹掉。
  2. 对齐错误:月度 y 在月底公布,但月内日频 x 早已反映当月走向。正确的混频该用「截至上月底的日频」预测「当月 y」,而非用「当月均值」——否则等于让 y 同时用了自己月份的 x,制造前视偏差。

MIDAS 不降采样,而是直接把高频滞后按真实日历对齐进低频方程

yt=β0+β1k=1Kwk(θ)xtk+εty_t = \beta_0 + \beta_1 \sum_{k=1}^{K} w_k(\theta)\, x_{t-k} + \varepsilon_t

其中 xtkx_{t-k} 是「距预测月 ttkk 个高频观测」,权重 wk(θ)w_k(\theta) 由少量参数 θ\theta 决定。这样:高频信息全保留,自由度只花在 θ\theta 上。

二、Beta 权重多项式:把 K 个滞后压成 2 个参数#

MIDAS 的灵魂是权重函数 wk(θ)w_k(\theta)。最常用的是 Beta 多项式

wk(θ1,θ2)=(k/K)θ11(1k/K)θ21j=1K(j/K)θ11(1j/K)θ21w_k(\theta_1,\theta_2) = \frac{(k/K)^{\theta_1-1}(1-k/K)^{\theta_2-1}}{\sum_{j=1}^{K}(j/K)^{\theta_1-1}(1-j/K)^{\theta_2-1}}

两个形状参数就勾勒出几十个权重的「衰减轮廓」:

  • θ1\theta_1 控制近端权重(近期日频有多重要);
  • θ2\theta_2 控制远端衰减速度(老数据掉得多快)。

θ1,θ2\theta_1,\theta_2 都在 (1,)(1,\infty) 时权重非负、单调归一,解释清晰。本文用近 2 个月共 K=42K=42 个日频滞后预测当月。

import numpy as np
from scipy.optimize import minimize

def beta_weights(theta, K):
    k = np.arange(1, K + 1)
    raw = (k / K) ** (theta[0] - 1) * (1 - k / K) ** (theta[1] - 1)
    return raw / raw.sum()

def midas_z(x, t, m, K, theta):
    end = t * m                       # 截至第 t-1 月结束(不用 t 月自身,防前视)
    seg = x[end - K:end]              # 最近 K 个日频观测
    if len(seg) < K:
        seg = np.concatenate([np.full(K - len(seg), seg[0] if len(seg) else 0.0), seg])
    return np.dot(beta_weights(theta, K), seg)
python

拟合就是最小化 t(ytβ0β1zt)2\sum_t (y_t - \beta_0 - \beta_1 z_t)^2,对 (β0,β1,θ1,θ2)(\beta_0,\beta_1,\theta_1,\theta_2) 做有界 NLS:

def midas_rss(params, x, y, m, K, T_use):
    b0, b1, th1, th2 = params
    z = np.array([midas_z(x, t, m, K, (th1, th2)) for t in range(T_use)])
    return np.sum((y - (b0 + b1 * z)) ** 2)

bnds = [(None, None), (None, None), (1.01, 20), (1.01, 20)]
res = minimize(midas_rss, [0.3, 0.8, 3.0, 3.0],
               args=(x, y, m, K, T), bounds=bnds, method="L-BFGS-B")
b0_h, b1_h, th1_h, th2_h = res.x
python

跑出来:β^0=0.308\hat\beta_0=0.308β^1=0.851\hat\beta_1=0.851θ=(6.17,2.47)\theta=(6.17,2.47)——β1\beta_1 几乎还原真值 0.8,说明混频聚合确实抓到了高频 x 对月度 y 的领先关系。

Beta-MIDAS 权重多项式:θ=(6.17,2.47),近期日频主导

三、数据生成:让日频真正「领先」月度#

MIDAS 值得做的根本前提是高频 x 真的领先 y。我们构造一个带领先结构的 DGP:低频因子 ftf_t 是 AR(1);第 q 月的日频 x 由「下个月因子 fq+1f_{q+1}」驱动——即日频流量提前一个月暴露了月度目标的走向;月度 y 则只由当月 ftf_t 驱动。日频 x 再叠加日内自相关噪声与白噪声。

这个设定下,「上月日频 x」里已经藏着本月 ftf_t 的信息,MIDAS 把这段领先信号抠出来;而 AR(1) 只看 y 历史,朴素法只看上月 y,天然少了这条信息通道。

Beta-MIDAS:仅用日频 x 的混频加权,还原月度 y 的走势

图上 MIDAS 拟合(红)几乎贴合实际 y(灰),样本内 R²=0.912——高频信息经 Beta 加权被高效榨出。

四、样本外对比:递归预测见真章#

样本内 R² 会骗人(自由度用得多就高)。真正分高下的是递归样本外预测:用 [0,t)[0,t) 估计,预测第 tt 月 y,滑窗到末尾,算 OOS R²。

样本外预测力:混频 MIDAS 显著优于单频基准

结果:MIDAS 样本外 R²=0.896,AR(1)=0.223,朴素=0.007。差距不是拟合技巧,而是信息结构——高频领先变量提供了低频历史里没有的预测增量。这也是 MIDAS 在央行 nowcasting(用日频金融数据预测季度 GDP、月度通胀)里被大量采用的原因。

五、U-MIDAS 与权重选择的取舍#

Beta-MIDAS 强制权重呈「近端高、远端低」的单调轮廓,省自由度但可能误设形状。当真实权重非单调(比如「月初效应」强于月末),Beta 约束会偏。两个出路:

  1. U-MIDAS(无约束):直接估计全部 K 个权重(配强正则或降维),自由度高、适合大样本,但 42 个参数在小样本会过拟合。
  2. Almon / 多项式权重:用低阶多项式逼近权重,是 Beta 与 U 之间的折中。

实务建议:先用 U-MIDAS 看权重真实形状,再决定是否用 Beta 约束。若真实权重明显非单调,强行 Beta 会系统性漏信号。

六、真实陷阱:比想象中更硬的六类#

陷阱一:权重函数误设(最隐蔽)。 Beta 多项式默认「近端权重最大、单调衰减」。若真实领先结构是非单调(远端某段反而更重要),Beta 约束会给你一个「拟合漂亮但预测烂」的模型。必须先 U-MIDAS 探形状,再决定约束。本文 DGP 的领先是近端主导,Beta 恰合适;换数据未必。

陷阱二:混频对齐 / 前视偏差(最致命)。 预测第 t 月 y,只能用「截至 t-1 月月底」的日频。一旦误用了 t 月自身的日频(哪怕只是月末几天),就等于把答案喂进模型,OOS R² 会虚高到离谱。日历对齐必须严格「目标月之前的全部高频观测」。midas_zend = t*m 而非 (t+1)*m 正是这条纪律。

陷阱三:过拟合(自由度伪装)。 MIDAS 表面只估 4 个参数,但权重是 K 个滞后的非线性组合,等效自由度远高于 4。小样本 + 多高频滞后,NLS 很容易「记忆噪声」。必须靠递归 OOS 而非样本内 R² 判定,并考虑对 θ\theta 加先验/正则。本文用 120 月样本、OOS 仍稳,才敢说信号真。

陷阱四:频率噪声与微观结构。 日频 x 含大量与「对 y 的领先」无关的日内噪声(买卖价差、盘中波动)。Beta 权重平滑了部分,但高频采样本身可能引入伪信号。实务上可对日频 x 先做去趋势/标准化,或换周频降低噪声。本文日频噪声已含,真实 tick 数据噪声更猛。

陷阱五:领先关系时变 / 结构突变。 「日频 x 领先月度 y」不是永久真理——政策转向、市场 regime 切换会让领先关系断裂甚至反转。用全样本估的静态 MIDAS 在断点后失效。应做滚动/扩展窗口估计,监控 β1\beta_1 与 OOS R² 是否漂移。本文静态设定下表现好,真实要加断点监测。

陷阱六:样本量天花板与幸存者视角。 低频 y 只有 120 个样本点,统计功效本就有限;文献常只报告「成功的 nowcasting 案例」,对「MIDAS 失灵的时段」沉默。真实落地要报全样本 OOS 指标 + 分时段稳健性,而不是挑漂亮窗口讲。本文合成可控、OOS 可算,真实宏观样本要更保守地解读。

七、诚实结论#

MIDAS 解决的是一个真实的痛点:低频目标出得慢,但高频数据既领先、又实时。它用一个 Beta 权重多项式,把几十个高频滞后压成 2 个形状参数,既榨出领先信号、又不被自由度拖垮。在「日频领先月度一个月」的合成设定里,样本外 R²=0.896,把只依赖月度历史的 AR(1)(0.223)和朴素法(0.007)远远甩在身后。

但落到真实宏观 nowcasting 上,先过了权重误设、混频对齐前视、过拟合、频率噪声、领先时变、样本天花板这六关。模型最有用的姿势,是作为央行/投研的实时 nowcasting 管件——把日频金融数据、搜索指数、卫星图像喂进混频回归,在官方数据公布前先给市场一个「快半拍」的读数,而不是当成一个能闭眼押注的神谕。

注:全文数据为自洽合成(日频由「下月因子」驱动以构造领先关系,月度目标由当月因子驱动,含日内噪声),仅用于演示 Beta-MIDAS 权重构造、混频对齐与递归 OOS 的预测性质。真实复现请替换为实际宏观/高频数据,并对权重形状、前视对齐、过拟合与结构突变逐一做稳健性检验。

MIDAS 混频回归:用高频数据预测低频变量
https://blog.halo26812.eu.org/blog/midas-mixed-frequency
Author halo
Published at 2026年7月15日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨