作者:老余捞鱼
原创不易,转载请标明出处及原作者。

写在前面的话:我们来聊聊如何用隐藏马尔可夫模型(HMM)分析市场状态,并结合A股股票的实际数据来进行预测。HMM可以通过价格变化等数据识别市场的隐藏状态,比如牛市、熊市或震荡市。本文通俗易懂,附完整代码示例,希望能对您有所启发!
一、什么是隐马尔可夫模型?
隐马尔可夫模型(Hidden Markov Model)是一种统计模型,用来描述一个系统内部的状态变化。这些状态是“看不见”的,但我们可以通过一些外部的“线索”去推测它们。
举个例子,假设你想知道外面的天气情况,但你只能看到路人有没有带伞。如果很多人带伞,那可能是下雨天;如果没人带伞,那可能是晴天。HMM就是通过这样的逻辑,把看不见的东西“猜”出来。

而在股价预测方面,隐马尔可夫模型允许我们对影响可观测股价走势的潜在市场条件进行建模。每个隐藏状态代表一种市场机制(如牛市、熊市或中性),而可观测变量则来自具体股票的股价走势。

该模型在股价预测领域由三个主要部分组成:
- 隐藏状态 :这是系统内部的实际状态,比如市场的牛市、熊市或震荡市。
- 转换概率 :从一个状态变成另一个状态的可能性。比如从牛市变成熊市的概率是多少。
- 输出概率 :每个状态下,产生特定观测数据的可能性。比如牛市状态下,出现大涨的概率有多大。
二、如何在交易中怎么用HMM?
在交易中,HMM可以帮我们识别市场的“隐藏状态”。比如:
- 当前市场是在牛市、熊市还是震荡市?
- 接下来市场会从牛市变成熊市,还是继续保持牛市?
通过这些信息,我们可以提前调整自己的交易策略。比如,在牛市时可以多买股票,在熊市时可以选择空仓或者做空。
接下来,我将以宁德时代股票为例,用python来展示如何用HMM模型分析市场状态并预测未来的股价走势。
2.1 数据准备
我们用tushare
库获取宁德时代的历史数据,并计算每日的价格变化。这样做的好处是,我们可以忽略绝对价格水平,专注于价格的波动性。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from hmmlearn import hmm
import tushare as ts
# 设置tushare的API key(需要先注册tushare账号并获取API key)
ts.set_token('你的tushare_api_key')
pro = ts.pro_api()
# 获取宁德时代的历史数据
df = pro.daily(ts_code='300750.SZ', start_date='20240315', end_date='20250314')
df['trade_date'] = pd.to_datetime(df['trade_date'])
df = df.sort_values(by='trade_date') # 按日期排序
# 计算每日价格变化
df['price_change'] = df['close'].diff().fillna(0)
# 准备数据
X = df[['price_change']].values
2.2 训练模型
接下来,我们用hmmlearn
库构建一个高斯隐马尔可夫模型,并设置隐藏状态的数量为3。
# 构建HMM模型
model = hmm.GaussianHMM(n_components=3, covariance_type="diag", n_iter=1000)
model.fit(X)
# 预测隐藏状态
hidden_states = model.predict(X)
2.3 可视化结果
最后,我们用图表展示宁德时代股价和隐藏状态的关系。
plt.figure(figsize=(15, 6))
plt.plot(df['trade_date'], df['close'], label='300750.SZ Closing price')
for i in range(3):
mask = (hidden_states == i)
plt.scatter(df['trade_date'][mask], df['close'][mask], label=f'Status {i}', s=10)
plt.legend()
plt.title('300750.SZ Closing price vs HMM Status')
plt.grid(True)
plt.tight_layout()
plt.show()
输出结果如下图:

三、预测股价走势
为了让模型更有用,我们还可以用它来预测未来的股价走势。
3.1 预测代码实现
下面这段代码通过标准化价格变化数据、训练高斯隐马尔可夫模型(HMM)、预测隐藏状态及生成未来价格走势,并用图表展示实际与预测价格的对比,评估不同隐藏状态数量对宁德时代股价预测的效果。以下是代码示例:
# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df[['price_change']])
# 定义函数训练模型并预测
def run_ghmm(X, n_hidden_states):
model = hmm.GaussianHMM(n_components=n_hidden_states, covariance_type="diag", n_iter=100)
# 篇幅关系,非完整代码。。。
# 可视化预测结果
def plot_predictions(n_hidden_states, predicted_prices):
plt.figure(figsize=(12, 6))
# 篇幅关系,非完整代码。。。
# 测试不同隐藏状态数量
for n_states in [3, 4, 5, 6]:
hidden_states, predicted_prices, model = run_ghmm(X_scaled, n_states)
plot_predictions(n_states, predicted_prices)
隐藏状态 3 的结果如下图:

- 优点 :在某些时间段内(如2024年7月到9月),预测价格与实际价格的走势较为接近,能够较好地捕捉到市场的波动趋势。
- 缺点 :在其他时间段(如2024年5月、2024年11月之后),预测价格与实际价格存在较大偏差,特别是在价格剧烈波动时,模型的表现不够稳定。
隐藏状态 4 的结果如下图:

- 优点 :整体上,预测价格与实际价格的吻合度较高,尤其是在2024年9月之后,模型能够较好地跟随实际价格的变化。
- 缺点 :在一些局部区域(如2024年6月、2024年11月),预测价格出现了一些较大的偏离,未能完全捕捉到市场的真实波动。
隐藏状态 5 的结果如下图:

- 优点 :在大部分时间段内,预测价格与实际价格的走势较为一致,特别是在2024年7月到2025年3月期间,模型表现较为稳定。
- 缺点 :在少数时间段(如2024年3月、2024年6月),预测价格出现了较大的波动,与实际价格存在一定的差距。
隐藏状态 6 的结果如下图:

- 优点 :在某些时间段内(如2024年9月到2025年3月),预测价格与实际价格的吻合度较高,能够较好地捕捉到市场的波动趋势。
- 缺点 :在其他时间段(如2024年3月、2024年6月、2024年11月),预测价格与实际价格存在较大偏差,特别是在价格剧烈波动时,模型的表现不够稳定。
3.2 综合分析与下步工作
谨慎使用预测结果 :尽管HMM模型提供了一种有效的工具来识别市场状态并预测股价走势,但在实际应用中仍需保持谨慎,并结合其他市场信息和专业判断做出决策。
隐藏状态数为4和5的效果相对较好 :在这两个状态下,预测价格与实际价格的吻合度较高,能够较好地捕捉到市场的波动趋势。特别是隐藏状态数为5时,在大部分时间段内表现较为稳定。
调整参数和优化模型 :虽然HMM模型在某些时间段内表现良好,但在价格剧烈波动时仍存在一定的局限性。可以通过调整模型参数、增加更多的特征数据(如成交量、市盈率等)以及结合其他技术指标来进一步优化模型。
3.3 源代码下载
以上的源代码请在我的Google Colab中申请下载,内附中文构建说明。
如觉得对您有所帮助,请我喝杯咖啡就好。https://colab.research.google.com/drive/1CZI5qMgIkKMj1uOo4KF3v5IXOzQr_7aA?usp=sharing
四、观点总结
总的来说,HMM是一种非常有用的工具,可以帮助我们识别市场中的隐藏状态,并预测未来的股价走势。不过,面对像宁德时代这样波动性较大的股票,任何模型都可能有局限性。因此,在使用这些分析结果时,我们需要保持谨慎,并结合其他信息做出决策。
- HMM能帮助识别市场的隐藏状态,如牛市、熊市或震荡市。
- 通过观测数据(如价格变化),推断市场状态的变化。
- 可以用Python快速实现HMM模型,门槛不高。
- 结合HMM的结果,可以优化你的交易策略。
- 实践中需要注意数据质量和参数调整,避免过拟合。
希望这篇文章能为你提供启发!如果你对量化交易感兴趣,不妨动手试试,说不定下一个交易高手就是你!
感谢您阅读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!
本文内容仅限技术探讨和学习,不构成任何投资建议。
Be First to Comment