Dynamic Regime Number Selection (动态状态数选择)

在 Hidden Markov Regime Detection 上把状态数 K 从一次性 BIC 升格为滑动窗验证集上的预测对数似然 + 复杂度惩罚。本文 (arXiv:2603.04441) 的 Wasserstein HMM 资产配置框架 步 3 即此设计。

一次性 BIC 的失效

经典 HMM 训练流程是: 先 BIC / AIC 一次性定 K, 然后整段时间共用。问题:

  • 2005–2026 这 21 年里, 危机 (2008/2020/2025) vs 平稳 (2017/2024) regime 复杂度差到 2×+, 固定 K 必有一边欠拟合。
  • BIC 倾向欠拟合 (大 N 时 log N 惩罚过强), 在 regime 数本应该上升的窗口反而把 K 降下去。
  • AIC 倾向过拟合, 在 2020 噪声放大窗口会假阳性产生"伪 regime"。

本文方案: 滑动窗验证集预测表现

不是损失函数选 K, 而是泛化能力选 K:

  1. 在历史窗 (train) 上分别训 K = 2, 3, ..., K_max 的 HMM。
  2. 在近期验证窗 (validation) 上计算一步预测对数似然 \mathrm{LL}_{t}^{\text{val}}(K)。
  3. 加复杂度惩罚:

K_t^* = \arg\max_K\; \mathrm{LL}_t^{\text{val}}(K) - \phi(K)

  1. 隔 N 步 (例如月度 / 季度) 更新一次 K, 不是日频 — 否则 daily regime 标签又抖动。

\phi(K) 通常取 \phi(K) = \beta K \log T (BIC 风格) 或 \phi(K) = \beta K (AIC 风格), \beta 由样本外表现 cross-validate。

本文未明确的实操细节

公众号解读没展开: \beta 取多少、validation 窗多长、K_max 设到几、\gamma_{t,k} 在 K 切换那天如何重映射。后续工作或用户实测可以补:

与 wiki 已有方法的关系

工程坑

  1. K 切换与组合 turnover: K 一变, latent state index 重新洗牌, 即便有 Wasserstein 模板, 也会有一次集中调仓。本文未给出平滑策略。
  2. 冷启动: train 窗不足时强求 5 年不现实, 用更短窗 + BIC fallback 还是等数据?
  3. 多目标验证: 用预测对数似然单一指标选 K, 可能选出"易预测" (噪声大) 的 K, 而非"经济真实"的 K。
  4. 并行: 跨 K 的 HMM 训练可高度并行, 但需要 GPU / 集群调度。

Open Questions

  • K_max 的选取 — 是否该随 regime 复杂度自适应 (即 K_max_{t+1} 也是模型选择的对象)?
  • 是否能用 dirichlet process HMM (DP-HMM) 完全替代"选 K" — 无限潜在状态, 自然允许 K 漂移。
  • K 切换时对组合 turnover 的事前 / 事后约束。
  • A 股 / 国内期货市场 regime 复杂度 (涨跌停阈值 + 限仓) 的特异性 — 是否需要更小 K_max。

Cross-ref