隐马尔科夫模型研究 stock 以及 lotto

说明

本文参考了这里

由于数据是连续的,因此使用了高斯隐马尔科夫模型:gaussianHMM

一、stock代码

import tushare as ts
import pandas as pd
import numpy as np
from hmmlearn.hmm import GaussianHMM

from matplotlib import cm, pyplot as plt
import seaborn as sns
sns.set_style('white')

'''
假定隐藏状态数目为4,观测状态数目为2
'''

# 1.准备 X
df = ts.get_hist_data('sh',start='2014-01-01',end='2017-07-27')[::-1] # 上证指数

close = np.log(df['close'])
low, high = np.log(df['low']), np.log(df['high'])
t = 5
X = pd.concat([close.diff(1), close.diff(t), high-low], axis=1)[t:] # 显状态时间序列(观测得到)

# 2.拟合 HMM
model = GaussianHMM(n_components=6, covariance_type="diag", n_iter=1000).fit(X)
Z = model.predict(X) # 隐状态时间序列

# 3.画图看看
plt.figure(figsize=(12, 7))
for i in range(model.n_components):
    mask = (Z==i) # 注意这里的Z!!!
    plt.plot_date(df.index[t:][mask], df['close'][t:][mask],'.',label=f'{i}th hidden state',lw=1)
    plt.legend()
    plt.grid(1)

plt.show()

效果图

解释

下面是对6种隐状态的一种可能的解释:【图文对不上,文字来自这里

  • 状态0————蓝色————震荡下跌
  • 状态1————绿色————小幅的上涨
  • 状态2————红色————牛市上涨
  • 状态3————紫色————牛市下跌
  • 状态4————黄色————震荡下跌
  • 状态5————浅蓝色————牛市下跌
    以上的意义归结是存在一定主观性的。因为HMM模型对输入的多维度观测变量进行处理后,只负责分出几个类别,而并不会定义出每种类别的实际含义。所以我们从图形中做出上述的判断。

所以,这种方法本质上是一种 Classification(分类) 或者 Clustering(聚类)

二、lotto 代码

import tushare as ts
import pandas as pd
import numpy as np
from hmmlearn.hmm import GaussianHMM

from matplotlib import cm, pyplot as plt
from matplotlib.widgets import MultiCursor

import seaborn as sns
sns.set_style('white')

import marksix_1
import talib as ta

'''
假定隐藏状态数目为6,观测状态数目为4
'''

# 1.准备 X
lt = marksix_1.Marksix()
lt.load_data(period=1000)

#series = lt.adapter(loc='0000001', zb_name='ptsx', args=(1,), tf_n=0)
m = 2
series = lt.adapter(loc='0000001', zb_name='mod', args=(m, lt.get_mod_list(m)), tf_n=0)
# 实时线
close = np.cumsum(series).astype(float)

# 低阶数据
t1, t2, t3 = 5, 10, 20
ma1 = ta.MA(close, timeperiod=t1, matype=0)
std1 = ta.STDDEV(close, timeperiod=t1, nbdev=1)

ma2 = ta.MA(close, timeperiod=t2, matype=0)
std2 = ta.STDDEV(close, timeperiod=t2, nbdev=1)

ma3 = ta.MA(close, timeperiod=t3, matype=0)
std3 = ta.STDDEV(close, timeperiod=t3, nbdev=1)

# 转换一
'''
t = t3
X = pd.DataFrame({'ma1':ma1,'ma2':ma2,'ma3':ma3,'std1':std1,'std2':std2,'std3':std3}, index=lt.df.index)[t:]
'''

# 转换二
t = t2
X = pd.DataFrame({'ma1':ma1,'ma2':ma2,'std1':std1,'std2':std2}, index=lt.df.index)[t:]

#close = np.log(df['close'])
#low, high = np.log(df['low']), np.log(df['high'])
#t = 5
#X = pd.concat([close.diff(1), close.diff(t), high-low], axis=1)[t:] # 显状态时间序列(观测得到)

# 2.拟合 HMM
model = GaussianHMM(n_components=6, covariance_type="diag", n_iter=1000).fit(X)
Z = model.predict(X) # 隐状态时间序列

# 3.画图看看
fig, axes = plt.subplots(2, 1, sharex=True)
ax1, ax2 = axes[0], axes[1]

show_period = 300
# 布林线
upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
axes[0].plot_date(lt.df.index[-show_period:], close[-show_period:], 'rd-', markersize = 3)
axes[0].plot_date(lt.df.index[-show_period:], upperband[-show_period:], 'y-')
axes[0].plot_date(lt.df.index[-show_period:], middleband[-show_period:], 'b-')
axes[0].plot_date(lt.df.index[-show_period:], lowerband[-show_period:], 'y-')

for i in range(model.n_components):
    mask = (Z[-show_period:]==i) # 注意这里的Z!!!
    axes[1].plot_date(lt.df.index[-show_period:][mask], close[-show_period:][mask],'d',markersize=3,label=f'{i}th hidden state',lw=1)
    axes[1].legend()
    axes[1].grid(1)

multi = MultiCursor(fig.canvas, (axes[0], axes[1]), color='b', lw=2)

plt.show()

效果图

时间: 2024-10-24 11:30:30

隐马尔科夫模型研究 stock 以及 lotto的相关文章

【问】一个多用户文本编辑的数据挖掘问题,类似隐马尔科夫模型

问题描述 [问]一个多用户文本编辑的数据挖掘问题,类似隐马尔科夫模型 是一个多用户的文本编辑系统.对于一段文字的编辑,从最终的编辑结果来看,每个用户在编辑过程中的编辑位置是不确定的,有什么概率模型可以让我们大致模拟出每个新来的用户的编辑位置? 比如有一段已经编辑过的文本如下: 1166633355552222777744444(假设每个数字代表一个用户,数字的多少和位置代表用户编辑的多少和位置),然后现在有个新来的数字8用户,我们可以用怎样的模型来计算概率得出他最可能的编辑位置?

一篇文章教你用隐马尔科夫模型实现中文分词

  什么问题用HMM解决 现实生活中有这样一类随机现象,在已知现在情况的条件下,未来时刻的情况只与现在有关,而与遥远的过去并无直接关系. 比如天气预测,如果我们知道"晴天,多云,雨天"之间的转换概率,那么如果今天是晴天,我们就可以推断出明天是各种天气的概率,接着后天的天气可以由明天的进行计算.这类问题可以用 Markov 模型来描述. markov 进一步,如果我们并不知道今天的天气属于什么状况,我们只知道今明后三天的水藻的干燥湿润状态,因为水藻的状态和天气有关,我们想要通过水藻来推测

隐马尔可夫模型的Viterbi解码算法

前言 前面在做自然语言处理时涉及到一些词性标注的工作,一般会使用隐马尔科夫模型(HMM)来实现词性标注,而HMM模型的解码实现算法一般就会使用Viterbi算法. 关于穷举法 HMM模型有多种应用,这里说的是其中一个常见应用,即根据观察序列找到最可能的隐含状态序列.最朴素的想法就是直接穷举所有可能的隐含状态序列,并计算出每个组合成的状态序列的概率,概率最大的那个组合序列即是最可能的隐含状态序列.举个水藻和天气的例子,穷举出所有可能的隐含状态序列的概率,如下, P(dry,damp,soggy |

一文搞懂HMM(隐马尔可夫模型)

什么是熵(Entropy) 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序,意味着具有确定和有规则的运动状态.熵的中文意思是热量被温度除的商.负熵是物质系统有序化,组织化,复杂化状态的一种度量. 熵最早来原于物理学. 德国物理学家鲁道夫·克劳修斯首次提出熵的概念,用来表示任何一种能量在空间中分布的均匀程度,能量分布得越均匀,熵就越大. 一滴墨水滴在清水中,部成了一杯淡蓝色溶液 热水晾在空气中

统计学习方法笔记 -- 隐马尔可夫模型

参考,隐马尔可夫模型(HMM)攻略 首先看看确定的状态序列,这种状态序列中状态的变化是确定的,比如  红绿灯,一定是绿灯->红灯->黄灯,这样的状态序列  当然也有些不确定状态序列,比如  天气,今天是晴天,你不能确定明天也一定是晴天或雨天  于是我们用概率来表示这种不确定性,称为马尔可夫过程 (Markov Process),马尔可夫过程的阶数表示当前状态依赖于过去几个状态,出于简单考虑往往用一阶马尔可夫过程,即当前状态仅仅取决于前一个状态. 马尔可夫过程,由状态集合,初始状态和状态转移矩阵

小波域 隐马尔可夫 模型

问题描述 有没有人研究过小波域隐马尔可夫树模型的图像分割,这方面的理论国内外很多学者以及研究过,较为成熟,现在根据别人的论文,实现模型,可是在编程实现的时候有些问题,不知道有没有人做过这方面的研究,如果有的话,想请教一下 解决方案 解决方案二:帮顶了,研究图像的应该还是有很多人的

马尔科夫转移矩阵法

一.马尔科夫转移矩阵法的涵义单个生产厂家的产品在同类商品总额中所占的比率,称为该厂产品的市场占有率.在激烈的竞争中,市场占有率随产品的质量.消费者的偏好以及企业的促销作用等因素而发生变化.企业在对产品种类与经营方向做出决策时,需要预测各种商品之间不断转移的市场占有率.市场占有率的预测可采用马尔科夫转移矩阵法,也就是运用转移概率矩阵对市场占有率进行市场趋势分析的方法.马尔科夫是俄国数学家,他在20世纪初发现:一个系统的某些因素在转移中,第n次结果只受第n-1的结果影响,只与当前所处状态有关,与其他

增强学习——马尔科夫决策过程(MDP)

增强学习--马尔科夫决策过程(MDP),最近因为研究需要,要开始学习机器学习了.之前只是懂些CNN什么的皮毛,对机器学习的整体认识都比较缺乏,后面我会从头开始一点点打基础,正好也用博客把自己的学习历程记录一下,如果有大牛看到博文中有错误,欢迎指正! 增强学习(reinforcement learning,RL)是近年来机器学习和智能控制领域的主要方法之一.在增强学习中有三个概念:状态.动作和回报. "状态(state)"是描述当前情况的.对一个正在学习行走的机器人来说,状态是它的两条腿

mdp-马尔科夫决策过程的C++实现示例

问题描述 马尔科夫决策过程的C++实现示例 马尔科夫决策过程中怎么根据回报值来确定策略?马尔科夫决策过程的C++实现示例 解决方案 马尔科夫决策 解决方案二: 此问题应该去问问百度,实在不行翻墙去谷歌,不过白度应该有详细的解释...