说明

本文参考了这里

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

效果图

最新文章

  1. NOIP复赛
  2. 2015年12月28日 Java基础系列(六)流
  3. Java可变参数讲解
  4. D - 蜘蛛牌
  5. Java高级之虚拟机加载机制
  6. Spark ML聚类分析之k-means||
  7. My Linux API
  8. trade 主要前端组件
  9. Android:ViewPager适配器PagerAdapter的使用
  10. google font和@font-face
  11. 通过命令修改wampserver的mysql密码
  12. ASP.NET中实现页面间数据传递的方法
  13. 转 Oracle全文检索http://docs.oracle.com/cd/E11882_01/text.112/e24436/toc.htm
  14. WinForm 基础
  15. sessionstorage,localstorage和cookie之间的区别以及各自的用法
  16. 中间自适应,左右定宽的两种经典布局 ---- 圣杯布局 VS 双飞翼布局
  17. POJ 1018 Communication System(贪心)
  18. webpack使用雪碧图插件
  19. .Net Core项目在Docker上运行,内存占用过多导致pods重启的问题
  20. php 目录

热门文章

  1. 11.@RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  2. Oracle EBS GL 会计科目报错 GL_ACCESS_SET_LEDGERS
  3. Oracle EBS 创建 RMA
  4. 很不错的关于依赖注入和AOP的系列文章
  5. Angular2学习笔记(1)——Hello World
  6. 'No Transport' Error w/ jQuery ajax call in IE
  7. C# ActiveX 网页打包验证自动升级
  8. Dubbo -- 系统学习 笔记 -- 安装手册
  9. Docker 修改已有镜像(转)
  10. centos6.4安装 zabbix agent