使用hmmlearn分析股票数据
时间:2022-07-28
本文章向大家介绍使用hmmlearn分析股票数据,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
@猴子 求第三关门票
hmmlearn 原为sklearn中的模块,现在已经独立出来,需要另外安装。
pip install hmmlearn
这个库在ubuntu环境下安装很顺利,但是win7下安装老是出错,如果遇到出错的情况,可以去Python非官方第三方库网站下载whl文件自行使用pip安装。
因为hmmlearn的官方文档写得不清不楚,所以要学习hmmlearn之前要对隐马尔可夫模型有一定的了解。
首先要知道隐马尔可夫模型的五大要素、三大假设、三大问题。
五大要素
S:状态值序列 O: 观察值序列 π:初始化概率 A: 状态转移矩阵 B: 给定状态下,观察值概率矩阵
而HMM模型本身具有三大参数
三大假设
- 有限历史性假设: 当前状态是否发生只与上一状态相关,即
- 齐次性假设 状态变化与具体时间无关,即
- 输出独立性假设 输出值仅与当前状态有关
三大问题
- 评估问题 已知模型参数
,计算某个观测序列O出现的概率。
- 解码问题 已知模型和观测序列,寻找与观测序列对应的可能性最大的状态序列。
- 学习问题 调整模型参数
,使观测序列O的概率
最大。
在hmmlearn的官方文档中给出了使用hmmlearn分析股票隐藏状态的例子,相当于上述三大问题中的学习+解码问题。
因为例子中的雅虎金融数据获取不到,所以数据获取源使用了国内的Tushare,可以通过pip安装:
pip install tushare
分析步骤
1. 导入数据
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts
from hmmlearn.hmm import GaussianHMM
data = ts.get_hist_data('600848',start = '2010-01-01',end='2017-12-31')
close_v = data['close'].values#当日收盘价格
volume = data['volume'].values#当日交易量
dates = np.array([i for i in range(data.shape[0])])#懒得处理日期了,这里直接使用阿拉伯数字代替日期
fig1 = plt.figure()
plt.plot(close_v,color = 'blue')
plt.show()
fig1.savefig("H:/learning_notes/study/machine_learning/HMM/stocks.jpg")
股票数据如下图所示:
2. 处理数据
接下来需要将收盘价格转换成涨跌幅数据。
diff = np.diff(close_v)#要训练的是收盘价格的变化值
dates = dates[1:]
close_v = close_v[1:]
volume = volume[1:]
X = np.column_stack([diff,volume])
diff = diff.reshape(-1,1)#一维数据需要进行处理
3. 建立模型
hmmlearn的API继承了sklearn一贯的简洁风格,初始化模型时只需要提供几个简单的参数就可以了,下面的ncomponents是状态序列中的状态种类数量,niter是迭代次数:
model = GaussianHMM(n_components=2,n_iter=1000)
model.fit(diff)#训练模型————学习问题
hidden_states = model.predict(diff)#估计状态序列————解码问题
4. 绘制股票的不同状态
fig2 = plt.figure()
for j in range(len(close_v)-1):
for i in range(model.n_components):
if hidden_states[j] == i:
plt.plot([dates[j],dates[j+1]],[close_v[j],close_v[j+1]],color = colors[i])
plt.show()
fig2.savefig("H:/learning_notes/study/machine_learning/HMM/hidden_states.jpg")
不同时刻的状态如下图所示,明显能看出该股票被分成了震荡与剧烈涨跌两种状态:
完整代码:
- Linux添加/删除用户和用户组
- 次小生成树
- HDU 4786Fibonacci Tree(最小生成树)
- HDU 1847 Good Luck in CET-4 Everybody!(找规律版巴什博奕)
- HDU 4764 Stone(巴什博奕)
- 博弈论入门之巴什博奕
- 理清字符集和字符编码关系
- 我是如何巧妙渗入安全脉搏的(附官方还原详情)
- vscode编写插件详细过程
- zabbix最新SQL注入漏洞+EXP
- 本地密码检索工具 – LaZagne Project
- 我是如何在SQLServer中处理每天四亿三千万记录的
- 程序猿是如何解决SQLServer占CPU100%的
- 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用 Tensorflow 在 CIFAR-10 二进制数据集上构建 CNN
- Hold Time违例,该如何解决
- Tensorflow BN详解:4_使用tf.nn.batch_normalization实现BN
- Tensorflow BatchNormalization详解:3_使用tf.layers高级函数来构建带有BN的神经网络
- 【DB宝17】使用mysqldump+mysqlbinlog恢复误删除的数据库
- 13-3 vi编辑模式和移动光标
- Tensorflow BatchNormalization详解:2_使用tf.layers高级函数来构建神经网络
- 使用 numpy 切分训练集和测试集
- 反向学习,相对基学习 opposition-based learning 简介
- python获取指定目录下所有文件名os.walk和os.listdir
- 腾讯地图SDK实现点击建筑显示围栏及建筑信息效果
- 【pyspark】parallelize和broadcast文件落盘问题
- 终于知道Kafka为什么这么快了!
- 使用 L2 正则化和平均滑动模型的 LeNet-5MNIST 手写数字识别模型
- Tensorboard 监控指标可视化