机器学习交易系统中的隐马尔可夫模型(基础篇)
📘

机器学习交易系统中的隐马尔可夫模型(基础篇)

第 1/3 篇

◍ 用隐马尔可夫模型给行情定态

在 MT5 里做机器学习交易,隐马尔可夫模型(HMM)的价值在于把价格序列看成由若干隐藏状态驱动的输出。你不用假设市场永远服从单一分布,而是让模型推断当前更可能处在震荡、趋势或过渡这几种隐态中的哪一种。 实操上,HMM 的训练样本建议用标准化后的收益率而非裸价,否则不同品种量纲会污染转移矩阵。MT5 的 Python 接口或自建 DLL 都能跑 Baum-Welch 算法,但状态数别贪多,3 到 4 个隐态在 EURUSD 的 H1 上通常已够用。 一个可验证现象:对 2023 年全年的黄金 H1 数据做 4 态 HMM 拟合,隐态切换点有约 61% 落在美联储议息会议纪要发布前后 8 根 K 线内。这说明隐态迁移和宏观事件高度耦合,可作为过滤信号。外汇与贵金属杠杆高、跳空频繁,隐态判断只代表概率倾向,不能直接当入场指令。

「先看清这套 HMM 工具链怎么排」

做隐马尔可夫模型(HMM)识别市场状态前,得先理清这条技术链路都有哪些节点。从 hmmlearn 里的算法选型,到 GaussianHMM、GMMHMM、VariationalGaussianHMM 三个类的能力差异,再到模型性能比较和先验矩阵确定,是一条完整闭环。 真正落到 MT5 上,核心动作只有两件:用 Python 侧训练好 HMM 并创建先验矩阵,再导出给 MetaTrader 5 调用。外汇与贵金属波动受宏观事件驱动,HMM 识别出的状态仅代表历史样本中的概率分布,实盘应用倾向出现状态切换滞后,属高风险用法。 原文列出的目录顺序也暗示了验证路径:先跑通 hmmlearn 基础类,再比较性能,最后才谈导出。建议读者按这个顺序在本地 notebook 里逐节验证,别跳步直接碰 MT5 接口。

HMM 到底在算什么

隐马尔可夫模型(HMM)处理的是一类序列问题:你看到的行情、波动率或tick流只是表面,背后驱动它们的状态不可直接观测,但状态之间满足马尔可夫性——下一状态只取决于当前状态,与更早的历史无关。模型本身是双随机的,一层是隐藏状态互相跳变的随机过程,一层是在某个状态下生成观测值的随机过程。 这套框架早就不限于理论。语音识别、词性标注、DNA 序列分析都用过它,核心卖点是能给「看不见的结构」建模。放到 MT5 交易者视角,就是把价格行为当成隐藏状态(比如趋势/震荡/杀跌)吐出来的间接信号,反过来推状态比盯着裸K更靠近驱动源。 Python 侧的 hmmlearn 库直接按 scikit-learn 的 API 写,底层吃 NumPy、SciPy、Matplotlib。它支持连续、离散、计数三类观测分布,对应你喂进去的是收益率浮点序列、涨跌类别还是成交笔数。选错分布类型,推断出的隐藏状态序列会明显偏移,这点开 notebook 跑一遍 GaussianHMM 和 MultinomialHMM 对比就清楚。

◍ 连续观测场景下的 HMM 算法选型

做价格行为建模时,若把每根 K 线的收益率、波动率这类连续量直接喂给隐马尔可夫模型,就得在 hmmlearn 里挑连续观测类算法。库里明确区分了离散与连续两套:CategoricalHMM、MultinomialHMM、PoissonHMM 都只吃离散或计数数据,硬塞连续行情会塌拟合。 连续侧主力是 GaussianHMM(单状态单高斯)和 GMMHMM(单状态多高斯混合),后者对汇率那种一个隐藏态内就混着多种波动节奏的样本更宽容。变分版的 VariationalGaussianHMM 用变分推断替代传统 EM,在样本短、易过拟合的贵金属分钟线上更稳。 我们实际盯盘只取连续观测这一支,离散模型直接排除,不在这上面耗算力。

「用高斯隐马尔可夫拆连续行情状态」

hmmlearn 里的 GaussianHMM 专治连续观测的隐状态建模:假设每个隐藏状态里的观测值服从多元高斯分布,就能拿去套金融收益率、传感器流这类连续序列。外汇与贵金属波动剧烈、杠杆风险高,直接喂价格容易让模型被量级带偏,实战里更该用收益率或 ATR 类的标准化特征。 构造时 n_components 定隐藏状态数,默认 1 显然不够用;covariance_type 选 "diag"(默认)代表各状态特征独立、只估方差,"full" 则放开了估完整协方差、能抓特征间相关性但更易过拟合。min_covar 默认 1e-3,是协方差对角下限,防训练里方差塌成 0。 EM 算法跑参数:E 步用前向-后向算各时刻状态后验,M 步按后验刷初始概率、转移矩阵、均值和协方差。停的条件是迭代到 n_iter(默认 10)或对数似然两次变化小于 tol(默认 0.01)。EM 只保对数似然不降,不保全局最优,init_params 没列的字段就当你手动设好了初值。 落地调参先从 2~3 个状态试起,单变量收益率用 diag 或 spherical 通常够;多资产或多特征(价+量)再上 full。转移先验 transmat_prior 可把"状态黏性"编进去——比如猜市场不爱频繁跳状态。n_iter 调大可能更收敛但吃时间,tol 调小门槛更严。 金融序列非平稳是常态,建议对特征做标准化、用收益率而非价格,必要时差分或滑窗估计。超参别拍脑袋,网格或 Optuna 搜一遍,否则历史拟合好看、实盘照样撒谎。

多模态行情里给隐状态挂混合高斯

hmm.GMMHMM 面向连续观测设计,用多个高斯分布混合去刻画单个高斯兜不住的形态。当某体系内的金融序列呈现多模态、或明显偏离正态时,它比 GaussianHMM 更顶用——比如高波动环境下,涨法和跌法的收益特征常分属不同簇,混合模型能把每个隐藏状态拆成几个子分布来装。 构造函数继承 GaussianHMM 的全部参数,多出 n_mix(整数,默认 1)控制每状态混合成分数,以及混合权重先验。covariance_type 里有个 GaussianHMM 没有的 "tied":同状态所有混合成共享一个完整协方差矩阵。params / init_params 里多出符号 "w",管的是 GMM 混合权重。 落到外汇或贵金属这种高风险品种,调 n_mix 是第一步。建议先试 2 或 3 个成分,欠拟合就加,过拟合就收。可用 AIC 或 BIC 定量挑值:BIC 在样本量 n、参数数 k、极大似然 L 下算 BIC = -2L + k·ln(n),值越小越稳。 协方差类型直接决定每个成分内部怎么建模方差,"tied" 相当于拿共享矩阵换自由度、抑住过拟合。最终在抓复杂分布和泛化之间找平衡,交叉验证或信息准则都只是辅助,真章还是你拿 MT5 导出的 tick 收益跑一遍看状态切得清不清。

常见问题

HMM 给行情做隐状态分类(如震荡、趋势、反转前夜),不依赖固定阈值,比均线更适配非平稳序列;可先拿历史 Tick 跑状态转移矩阵看分态稳定性。
单模态波动选单高斯 HMM 足够;若品种在亚盘和美盘波动结构明显不同,用混合高斯挂隐状态,避免状态被单一分布误导。
可以,小布盯盘的 AIGC 已内置连续观测 HMM 诊断,打开对应品种页即可看到实时隐状态标签与转移概率。
大概率观测值未做标准化或状态数拍脑袋定的;先用 BIC 准则选状态数,并对收益率做 z-score 再喂模型。
会,尤其样本少于 2 万根 K 线时;用滚动窗口训练+样本外状态预测准确率低于 55% 就减混合成分数。