A股市场状态识别:HMM隐马尔可夫模型 + Optuna超参优化的量化实战
作者:mokamo | 更新日期:2026-05-16
工具链:Python + HMM + Optuna + Walk-Forward Validation + Tushare
代码库:smart-trading-system
代码路径:src/models/stock_hmm_trainer.py、src/models/unified_regime_hmm.py
一、背景:为什么需要隐状态识别?
1.1 A股的残酷现实
A股市场的结构特征决定了趋势策略的天然困境:
- 高波动性:上证指数年化波动率长期在20%~30%区间,远高于成熟市场(标普500约15%)
- 牛熊快速切换:2015年、2018年、2022年均出现短时间内从牛市到熊市的剧烈转换,往往在数周内完成
- 震荡市占据大半时间:根据历史数据估算,A股市场有超过60%的时间处于区间震荡格局,趋势策略在这些阶段频繁产生"双亏"——既亏手续费,又亏假信号
- 政策市特征:A股受政策影响极大,模型容易在政策拐点处产生滞后判断
1.2 传统技术指标的困境
传统技术指标(均线、RSI、MACD)的共同问题是:阈值主观、市场适应性差。
以RSI为例:
- 超买/超卖阈值固定:传统设置是RSI>70超买、RSI<30超卖。但牛市里RSI长期在6080徘徊,熊市里RSI长期在2040徘徊——固定阈值根本无法适应
- 参数孤岛问题:RSI(14)有效吗?RSI(6)更敏感,RSI(28)更平滑——哪个更好?没有理论答案
- 时滞性:移动平均线天然滞后,MACD是双均线差分,滞后更严重
我们需要一个更底层的模型来回答一个本质问题:
“当前市场处于什么状态?”
这个问题比"明天涨还是跌"更基础,也更容易被建模。
1.3 HMM的核心思想
HMM(隐马尔可夫模型,Hidden Markov Model)的核心思想恰好与此吻合——市场状态是"隐藏"的,我们只能通过可观测的价格数据来推断当前最可能处于哪种状态。
举一个直观的例子:
你看不到房间里的天气(隐藏状态),但你能看到窗外行人的行为(观测):
- 行人带伞 → 推断:外面在下雨
- 行人戴墨镜打伞 → 推断:外面出太阳但可能有阵雨
- 行人都待在室内 → 推断:外面可能是暴风雨
同样,股价数据就是"行人行为",市场状态(牛市/熊市/震荡)就是"天气"。
在HMM框架下:
- 隐藏状态:BULL(上涨)、SIDEWAYS(震荡)、BEAR(下跌)
- 观测变量:收益率、波动率、成交量等金融特征
- 模型参数:状态转移矩阵、每个状态的均值/协方差矩阵
二、方法论:GaussianHMM 三状态模型
2.1 模型数学形式
选用 GaussianHMM(高斯隐马尔可夫模型),这是HMM家族中最适合金融数据的变体。每个隐藏状态对应一个多维高斯分布:
模型参数:
- 初始状态概率 π=[π1,π2,π3]\pi = [\pi_1, \pi_2, \pi_3]π=[π1,π2,π3]:P(S1=s)P(S_1 = s)P(S1=s)
- 状态转移矩阵 A=[aij]A = [a_{ij}]A=[aij]:aij=P(St=j∣St−1=i)a_{ij} = P(S_t = j | S_{t-1} = i)aij=P(St=j∣St−1=i)
- 发射概率 B={ bj(x)}B = \{b_j(x)\}B={ bj(x)}:在状态 jjj 下观测到 xxx 的概率密度
bj(x)=N(x;μj,Σj)=1(2π)d∣Σj∣exp(−12(x−μj)TΣj−1(x−μj))b_j(x) = \mathcal{N}(x; \mu_j, \Sigma_j) = \frac{1}{\sqrt{(2\pi)^d |\Sigma_j|}} \exp\left(-\frac{1}{2}(x - \mu_j)^T \Sigma_j^{-1} (x - \mu_j)\right)bj(x)=N(x;μj,Σj)=(2π)d∣Σj∣1exp(−21(x−μj)TΣj−1(x−μj))
状态数固定为3,对应市场三种典型形态:
| 状态 | 标签 | 典型特征 |
|---|---|---|
| 状态0 | BULL | 收益率均值为正、波动率适中、动量向上 |
| 状态1 | SIDEWAYS | 收益率均值接近零、波动率较低、无明显方向 |
| 状态2 | BEAR | 收益率均值为负、波动率高、动量向下 |
2.2 为什么选3个状态?
这是经过实践验证的折中:
- 2个状态太少:只有"涨/跌"两种,无法描述"震荡"这个在实际交易中最重要也最难处理的状态
- 4个状态太多:参数空间急剧膨胀(4个转移概率+4个均值向量+4个协方差矩阵),在小样本下极易过拟合
- 3个状态正好:BULL/SIDEWAYS/BEAR 覆盖了市场的主要矛盾,参数数量适中(3+9+6=18个独立参数),在有足够训练数据时能够稳定估计
2.3 输入特征工程
模型的效果高度依赖输入特征的质量。从原始日线数据中提取11种候选特征,组成7个特征集(C1~C7),由Optuna自动选择最优组合。
特征详解:
# ── 特征定义(代码来源:stock_hmm_trainer.py 第125-137行)──
_FEATURE_MAP = {
"log_return": ("pct_chg", True), # 对数收益率,动态Z-score标准化
"realized_vol": ("volatility_20d", False), # 已实现波动率,直接使用
"trend_strength": ("price_position_20d", False), # 均线位置(close/MA20),直接使用
"volume_ratio": ("volume_ratio", False), # 量比(当日成交量/20日均量)
"macd_momentum": ("macd_hist", False), # MACD柱子值(DIFF-DEA)
"boll_position":


2155

被折叠的 条评论
为什么被折叠?



