07 隐马尔可夫模型 - 案例三 - 股票数据维度信息提取
2018-12-19 本文已影响120人
白尔摩斯
股票数据维度信息提取案例 - 数据格式
SH600000.txt常规操作
import numpy as np
from hmmlearn import hmm
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.metrics.pairwise import pairwise_distances_argmin
import warnings
warnings.filterwarnings("ignore") # hmmlearn(0.2.0) < sklearn(0.18)
def expand(a, b):
d = (b - a) * 0.05
return a-d, b+d
1、 加载数据
0日期 1开盘 2最高 3最低 4收盘 5成交量 6成交额
delimiter: 指定分隔符
skiprows:给定前面多少行数据不进行处理
usecols: 给定第4 5 6 2 3这五列数据进行读入(下标从0开始)
x = np.loadtxt('SH600000.txt', delimiter='\t', skiprows=2, usecols=(4, 5, 6, 2, 3))
close_price = x[:, 0] # 收盘价
volumn = x[:, 1] # 成交量
amount = x[:, 2] # 成交额
amplitude_price = x[:, 3] - x[:, 4] # 每天的最高价与最低价的差
diff_price = np.diff(close_price) # 涨跌值(每天相对于昨天的涨跌幅)
volumn = volumn[1:] # 成交量(今天的成交量)
amount = amount[1:] # 成交额(今天的成交额度)
amplitude_price = amplitude_price[1:] # 每日振幅(今天的振幅)
sample = np.column_stack((diff_price, volumn, amount, amplitude_price)) # 观测值
print("样本量:%d, 特征数目:%d" % sample.shape)
sample
2 模型构建
## 给定隐特征的数目
n = 5
model = hmm.GaussianHMM(n_components=n, covariance_type='full')
model.fit(sample)
y = model.predict_proba(sample) # 获取预测的概率
print(y)
print(model.predict(sample)) # 获取预测状态值
3、画图
t = np.arange(len(diff_price))
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10,8), facecolor='w')
plt.subplot(431)
plt.plot(t, diff_price, 'r-')
plt.grid(True)
plt.title(u'涨跌幅')
plt.subplot(432)
plt.plot(t, volumn, 'g-')
plt.grid(True)
plt.title(u'交易量')
# 产生一个颜色
clrs = plt.cm.terrain(np.linspace(0, 0.8, n))
plt.subplot(433)
for i, clr in enumerate(clrs):
# 画到一张图中
plt.plot(t, y[:, i], '-', color=clr, alpha=0.7)
plt.title(u'所有组分')
plt.grid(True)
# 分开画
for i, clr in enumerate(clrs):
plt.subplot(4, 3, i+4)
plt.plot(t, y[:, i], '-', color=clr)
plt.title(u'组分%d' % (i+1))
plt.grid(True)
plt.suptitle(u'SH600000股票:GaussianHMM分解隐变量', fontsize=18)
plt.tight_layout()
plt.subplots_adjust(top=0.9)
plt.show()
展望:
我们假定了内部具有5个我们无法知道的隐含状态的影响;我们观测到的就是股票在今天相当于昨天是涨了还是迭了;
可以深入探讨以下问题:如果现在假定观测到的今天的股票相对于昨天是"涨",那么明天相对于今天是涨的概率是多大,以及明天相对于今天是跌的概率是多少?
PS: 这个案例是在假定了股票的涨跌只和前一天的相关指标有关,和前几天的无关。