文章目录

  • 0 前言
  • 1 马尔科夫链
  • 2 隐马尔科夫模型
  • 3 HMM预测股票
  • 4 最后

0 前言

不少同学让我出一起HMM的教学文章,学长为了满足各位同学的要求,写下此文

1 马尔科夫链

隐马尔科夫模型是自然语言处理中很重要的一种算法。在此之前,我们首先给大家介绍马尔科夫链。马尔科夫链,因安德烈·马尔科夫得名,是指数学中具有马尔科夫性质的离散事件的随机过程。在给定当前知识或信息的情况下,过去对于预测未来是无关的。每个状态的转移只依赖于之前的N个状态,这个过程被称为1个n阶的模型。其中n是影响转移状态的数目。最简单的马尔科夫过程就是一阶过程,每一个状态的转移只依赖于其之前的哪一个状态。用数学的表达式表示就是如下所示:

假设天气服从马尔科夫链:

转移矩阵


那么,从今天开始,在遥远的未来的某天,晴阴的概率分布是什么?

其实,不管是今天是晴天,还是阴天,其实很多天之后的晴阴分布收敛到一个固定分布。这个固定分布就是我们熟悉的稳态分布。因此,我们就为上面的一阶马尔科夫过程定义一以下三个部分:

  • 1、状态:晴天、阴天
  • 2、初始向量:定义系统在时间为0的时候的状态概率
  • 3、状态转移矩阵:每种天气转换的概率。所有的能被这样描述的系统就是一个马尔科夫过程。

但是

以上出现一个明显的缺陷,也就是前后关系的缺失,带来了信息的缺失:例如我们经常玩的股市,如果只是观测市场,我们只能知道当天的价格,成交量等信息,但是并不知道当前的股市是处于什么状态。

在这种情况下我们有两个状态集合,一个是可以观察到的状态集合;另一个是一个隐藏的状态集合。我们希望能够找到一个算法可以根据股市价格的成交量状况和马尔科夫假设来预测股市的状况。基于上面我们提到的情况下,我们可以观察到状态序列和隐藏的状态序列是概率相关的。因此,我们可以将这种类型的过程建模为一个有隐藏的马尔科夫过程和一个与这个隐马尔科夫过程概率相关的并且可以观察到的状态集合,这就是我们今天要介绍的隐马尔科夫模型(HMM)。

接下学长来为大家详细介绍隐马尔科夫模型。

2 隐马尔科夫模型

隐马尔科夫模型是一种统计模型,用来描述一个含有隐含层未知参数的马尔科夫过程。但是其中最大的难点就是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步分析。我们以日常的投骰子为例来解释隐马尔科夫模型:假设有三个不同的骰子(6面、4面、8面),每次先从三个骰子里面选择一个,每个骰子选中的概率为1/3,如下图所示,重复上述过程,得到一串数值[1,6,3,5,2,7]。这些可观测变量组成可观测状态链。同时,在隐马尔可夫模型中还有一条由隐变量组成的隐含状态链,在本例中即骰子的序列。比如得到这串数字骰子的序列可能为[D6, D8, D8, D6, D4, D8]。

具体如下:

隐含状态转换示意图

3 HMM预测股票

这次使用HMM算法来进行股票预测,使用昨天的股票数据来预测今天是否涨跌。

import tushare as tstoken = ''  # 设置tocken
pro = ts.pro_api(token)  # 初始化pro接口
# 获取数据
df_gldq = pro.daily(ts_code='000651.sz', start_date='20201210', end_date='20210513')df_gldq.sort_values(by='trade_date', inplace=True)
# 打印数据
df_gldq.to_excel('data/stock.xls')

首先使用tushare模块来获取数据。token是自己获取的,ts_code决定哪支股票,还有时间区间以及排序,最后写入stock.xls文件中。

#数据处理
df = pd.read_excel("data/stock.xls")
print("原始数据的大小:", df.shape)
print("原始数据的列名", df.columns)df['trade_date'] = pd.to_datetime(df['trade_date'])
df.reset_index(inplace=True, drop=False)
df.drop(['index', 'ts_code', 'open', 'high', 'low' , 'pre_close', 'change', 'pct_chg', 'amount'], axis=1, inplace=True)
#df['trade_date'] = df['trade_date'].apply(datetime.datetime.toordinal)
print(df.head())
dates = df['trade_date'][1:]
close_v = df['close']
volume = df['vol'][1:]
diff = np.diff(close_v)
#获得输入数据
X = np.column_stack([diff, volume])
print("输入数据的大小:", X.shape)   #(1504, 2)min = X.mean(axis=0)[0] - 8*X.std(axis=0)[0]   #最小值
max = X.mean(axis=0)[0] + 8*X.std(axis=0)[0]  #最大值
X = pd.DataFrame(X)
#异常值设为均值
for i in range(len(X)):  #dataframe的遍历if (X.loc[i, 0]< min) | (X.loc[i, 0] > max):X.loc[i, 0] = X.mean(axis=0)[0]#数据集的划分
X_Test = X.iloc[:-30]
X_Pre = X.iloc[-30:]
print("训练集的大小:", X_Test.shape)     #(1474, 2)
print("测试集的大小:", X_Pre.shape)      #(30, 2)

接下来是数据的预处理。获取特征因子与标签,归一化、异常值处理、数据集划分等等。

model = GaussianHMM(n_components=8, covariance_type='diag', n_iter=1000, min_covar=0.1)
model.fit(X_Test)expected_returns_volumes = np.dot(model.transmat_, model.means_)
expected_returns = expected_returns_volumes[:,0]
predicted_price = []  #预测值
current_price = close_v.iloc[-30]
for i in range(len(X_Pre)):hidden_states = model.predict(X_Pre.iloc[i].values.reshape(1,2))  #将预测的第一组作为初始值predicted_price.append(current_price+expected_returns[hidden_states])current_price = predicted_price[i]

然后是利用HMM做股票预测

x = dates[-29: ]
y_act = close_v[-29:]
y_pre = pd.Series(predicted_price[:-1])
plt.figure(figsize=(8,6))
plt.plot_date(x, y_act,linestyle="-",marker="None",color='g')
plt.plot_date(x, y_pre,linestyle="-",marker="None",color='r')
plt.legend(['Actual', 'Predicted'])
plt.show()

将预测股票走势折线图与股票真实折线图做对比


可以看出预测的股票曲线虽然无法完全拟合真实股票走势,但是大体的趋势是一致的。另外值得一提的是,很多股票预测实验预测值与真实值贴的很紧密,这一般都是用今天的信息预测今天涨跌了,这种预测是无意义的。

4 最后

HMM隐马尔科夫模型及股票预测相关推荐

  1. HMM隐马尔科夫模型(附维特比代码)

    背景知识:马尔科夫模型 1 马尔科夫的局限性 在一些情况下,我们并不能直接得到观测的结果,比如在天气系统中,我们不能直接得到天气的状态,但是我们有一堆蚂蚁,可以从蚂蚁的行为状态找到天气变化的关系规律. ...

  2. HMM(隐马尔科夫模型)

    HMM模型基础 介绍 隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用.当然,随着目前深度学 ...

  3. 通过hmmlearn学习使用HMM隐马尔科夫模型

    一.了解隐马尔科夫模型(HMM) 具体可参考https://www.zhihu.com/question/20962240,讲得很通俗易懂. 本文使用的是hmmlearn模块,可以使用pip inst ...

  4. 一文讲透:HMM隐马尔科夫模型

    一.马尔科夫模型 1 马尔科夫的几个概念 要想理解隐马尔科夫模型,首先要理解马尔科夫模型. 下面通过一个天气变化的例子来认识马尔科夫模型中的几个重要概念.

  5. 炎热天气看书还是钓鱼?隐马尔科夫模型教你预测!

    高温天气与行为概率 夏季是一年最热的时候,气温普遍偏高,一般把日最高气温达到35℃以上的天气叫作高温天气,但是一般情况下高温天气分为两类.  (1)干热型高温.一般是指气温较高.太阳辐射强而且空气的湿 ...

  6. HMM隐马尔科夫模型浅析

    http://www.zhihu.com/question/20962240 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Yang Eninala 链接:http:/ ...

  7. HMM隐马尔科夫模型 学习总结

    隐马尔可夫模型(Hidden Markov Model,简称HMM)是结构最简单的动态贝叶斯网(dynamic Bayesian network),这是一种著名的有向图模型,主要用于时序数据建模,在语 ...

  8. 隐马尔科夫模型HMM详解(1)

    目录 隐马尔科夫模型基本概念 隐马尔科夫模型的三个基本问题 概率计算 预测算法-Viterbi算法 HMM学习算法参考下篇文章 代码地址:https://gitee.com/liangcd/speec ...

  9. 隐马尔科夫模型——简介

    1.  前言 学习了概率有向图模型和概率无向图模型,回头再看了一下隐马尔可夫模型(hidden Markov model,HMM). HMM属于树状有向概率图模型,主要用于对时序数据的建模,它的潜在变 ...

  10. 强化学习(一)-->隐马尔科夫模型HMM-->HMM模型基础

    隐马尔科夫模型HMM 隐马尔科夫模型算是比较经典的机器学习模型了,在自然语言处理.语言识别.模型识别等这些领域也得到了广泛的应用.在深度学习的崛起,尤其是RNN.LSTM等神经网络序列模型的火热,HM ...

最新文章

  1. Python的零基础超详细讲解(第四天)-Python的数据类型
  2. 焦李成教授谈深度神经网络发展历程
  3. 多协议标签交换中的标签指的是什么?—Vecloud微云
  4. nginx用户权限问题
  5. python计算最大回撤_Python进阶量化交易场外篇3——最大回撤评价策略风险
  6. 生动形象的理解什么是装饰器!
  7. MySQL中保存emoji表情
  8. python获取命令行参数_Python获取命令行参数的正确方法,案例详解
  9. 深入理解磁盘文件系统之inode
  10. Unity3D基础33:物理射线
  11. RDLC使用手册_RDLC报表部署
  12. 解决 U盘安装Windows Server 2012 R2 报错 Windows 无法打开所需的文件 Sources\install.wim...
  13. 光配件招标采购技术标准
  14. php 交换机 密码,S5100系列交换机使用正确的用户名和密码进行SSH登录时提示错误的解决方法...
  15. 做电子相册思路 c语言,C/C++编程笔记:C语言制作情侣必备《爱情电子相册》,源码解析!...
  16. 网线传输速度测试_千兆网络的速度测试
  17. 灰度、rgb之间的概念
  18. 三个点在同一个半圆的概率_圆内任取三点/四点在同一半圆内的概率是多少?...
  19. 建模simulink - 手把手教你搭建xpc平台
  20. 32位程序和64位程序这些区别你知道吗?

热门文章

  1. 蓝屏代码大全 蓝屏全攻略
  2. SQL Server2005彻底卸载
  3. 如何快速学python
  4. codematic2连接mysql失败_动软代码生成器Codematic
  5. python——向Excel读取或写入数据
  6. java实现ping_java实现Ping示例代码
  7. dubbo线程池中无可用线程
  8. 使用JQuery快速高效制作网页交互特效第六章课后
  9. 数据库课程设计报告——员工工资管理系统
  10. sklearn中digits手写字体数据集