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

简介: 说明本文参考了这里由于数据是连续的,因此使用了高斯隐马尔科夫模型:gaussianHMM一、stock代码import tushare as tsimport pandas as pdimport numpy as npfrom hmmlearn.

说明

本文参考了这里

由于数据是连续的,因此使用了高斯隐马尔科夫模型: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()

效果图

img_e9ef22126fd5729096d36e9b7ce7db2f.png

解释

下面是对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()

效果图

img_ab90d341001bdcd506c51b523692e835.png

目录
相关文章
|
13天前
|
人工智能 并行计算 算法
《C++在贝叶斯网络与隐马尔可夫模型中的深度探索与优化之路》
贝叶斯网络与隐马尔可夫模型是人工智能领域的两颗明珠,尤其擅长处理不确定性推理与时序数据分析。C++以其高性能、高效的数据处理能力和面向对象的特性,成为实现这两类模型的理想选择。C++不仅能够有效管理内存,支持大规模模型构建,还能通过多线程和并行计算显著提升计算效率,为模型的优化与应用提供了强大支持。尽管存在一定的开发挑战,但C++正不断进步,助力贝叶斯网络和隐马尔可夫模型在更多领域展现其独特价值。
46 11
|
7月前
|
自然语言处理 算法 数据挖掘
R语言中的隐马尔可夫HMM模型实例
R语言中的隐马尔可夫HMM模型实例
|
7月前
|
机器学习/深度学习 算法
R语言隐马尔可夫模型HMM识别不断变化的股票市场条件
R语言隐马尔可夫模型HMM识别不断变化的股票市场条件
|
机器学习/深度学习 人工智能 算法
【Pytorch神经网络理论篇】 24 神经网络中散度的应用:F散度+f-GAN的实现+互信息神经估计+GAN模型训练技巧
MINE方法中主要使用了两种技术:互信息转为神经网络模型技术和使用对偶KL散度计算损失技术。最有价值的是这两种技术的思想,利用互信息转为神经网络模型技术,可应用到更多的提示结构中,同时损失函数也可以根据具体的任务而使用不同的分布度量算法。
542 0
|
机器学习/深度学习 算法
【文本分类】《融合后验概率校准训练的文本分类算法》
【文本分类】《融合后验概率校准训练的文本分类算法》
【文本分类】《融合后验概率校准训练的文本分类算法》
|
机器学习/深度学习 人工智能 自然语言处理
【推荐系统】隐语义模型(LFD)与矩阵分解(Matrix Factorization)
【推荐系统】隐语义模型(LFD)与矩阵分解(Matrix Factorization)
205 0
【推荐系统】隐语义模型(LFD)与矩阵分解(Matrix Factorization)
|
机器学习/深度学习 算法 语音技术
隐马尔科夫模型HMM
本文介绍常见的机器学习模型隐马尔科夫模型HMM。 HMM也是generative model。 我是因为看到一篇论文需要用HMM来优化,所以速成。日后如有新的理解将会持续更新,可以收藏关注本文以待。
隐马尔科夫模型HMM
隐马尔科夫模型
隐马模型还是看李航的《统计学习方法》,写的很明了。 以下内容来自邹博的ppt: ...
849 0
|
机器学习/深度学习
【神经网络本质是多项式回归】Jeff Dean等论文发现逻辑回归和深度学习一样好
谷歌用深度学习分析电子病例的重磅论文给出了一个意外的实验结果,DNN与逻辑回归效果一样,引发了热烈讨论。不仅如此,最近Twitter讨论最多的论文,是UC戴维斯和斯坦福的一项合作研究,作者发现神经网络本质上就是多项式回归。下次遇到机器学习问题,你或许该想想,是不是真的有必要用深度学习。
3468 0
下一篇
DataWorks