这里要感谢一位研究生师兄分享了我这篇文章
https://www.ricequant.com/community/topic/788/
本文,是对上面文章的梳理,并做出了在本地条件下使用的代码
隐藏马尔可夫(HMM)过程本质上,根据显式的数据,反推隐藏的状态。
类似于从输出链反推导出状态链。而每个状态,都有对应的输出可能。
这里假设所有的特征向量都服从高斯分布。(这个假设是自然的。中心极限定理,大数定理了解一下~)
关于实现这份代码中,遇到了很多坑。
pip install
1.csv
。下载方式为上面链接中的最后一个的,第二种下载方式。from hmmlearn import hmm
import numpy as np
from matplotlib import pyplot as plt
import pandas as pd
n = 6 # 6个隐藏状态
data = pd.read_csv('1.csv', index_col=0)
volume = data['volume']
close = data['close']
logDel = np.log(np.array(data['high'])) - np.log(np.array(data['low']))
logRet_1 = np.array(np.diff(np.log(close)))
logRet_5 = np.log(np.array(close[5:])) - np.log(np.array(close[:-5]))
logVol_5 = np.log(np.array(volume[5:])) - np.log(np.array(volume[:-5]))
# 保持所有的数据长度相同
logDel = logDel[5:]
logRet_1 = logRet_1[4:]
close = close[5:]
Date = pd.to_datetime(data.index[5:])
A = np.column_stack([logDel, logRet_5, logVol_5])
model = hmm.GaussianHMM(n_components=n, covariance_type="full", n_iter=2000).fit(A)
hidden_states = model.predict(A)
plt.figure(figsize=(25, 18))
for i in range(n):
pos = (hidden_states == i)
plt.plot_date(Date[pos], close[pos], 'o', label='hidden state %d' % i, lw=2)
plt.legend()
plt.show()
res = pd.DataFrame({'Date': Date, 'logReg_1': logRet_1, 'state': hidden_states}).set_index('Date')
series = res.logReg_1
templist = []
plt.figure(figsize=(25, 18))
for i in range(n):
pos = (hidden_states == i)
pos = np.append(1, pos[:-1])
res['state_ret%d' % i] = series.multiply(pos)
data_i = np.exp(res['state_ret%d' % i].cumsum())
templist.append(data_i[-1])
plt.plot_date(Date, data_i, '-', label='hidden state %d' % i)
plt.legend()
plt.show()
templist = np.array(templist).argsort()
long = (hidden_states == templist[-1]) + (hidden_states == templist[-2]) # 买入
short = (hidden_states == templist[0]) + (hidden_states == templist[1]) # 卖出
long = np.append(0, long[:-1])
short = np.append(0, short[:-1])
plt.figure(figsize=(25, 18))
res['ret'] = series.multiply(long) - series.multiply(short)
plt.plot_date(Date, np.exp(res['ret'].cumsum()), 'r-')
plt.show()
不过虽然有很多的瑕疵(和现实的差距过于大),但是作为学习的demo,还是非常好的。
感谢那位师兄分享,和原作大神的分享。