HMM模型(Ⅱ)—量化投资

引言

关于HMM模型数学原理及简用,笔者上文已有阐述,此文主要内容是HMM模型在量化投资上的应用;主要为为所览的博客、文献的思路整理,不足之处望多多指正。

何为量化投资

作为没有上过多少经济学课程的菜鸡,笔者对此的解释以一个例子为引子,避免失误:
据说量化投资大佬是数学家西蒙斯,其人送外号“对冲王”,老人家利用自己掌握的数学本领投身股票市场,在华尔街赚的是盆满锅满,而在众多用于量化投资的数学利器中,HMM模型便是其中之一。

实现思想

结合前HMM的数学思想,笔者结合实现的python工具,总结其大概可以实现的功能。
在这里插入图片描述

试水实现

获取数据

在获取数据上,据笔者所知:可以在调用API函数,使用get price()直接在网址上爬取,但笔者使用朋友pycharm似乎做不到这一点(不会),于是选用了比较直接的方式通过别人给的数据,和网易财经的数据,实现数据的获取,本文以沪深300为例。

对数据使用HMM模型

在python的hmmlearn库中,主要有三种hmm的数学模型,按照观测状态是连续状态还是离散状态,可以分为两类。GaussianHMM和GMMHMM是连续观测状态的HMM模型,而MultinomialHMM是离散观测状态的模型,我们在文章里面使用的模型为GaussianHMM在这里插入代码片。由于对hmmlearn库掌握还不是不很熟练,下面主要为实现方法与结果,原理暂不做阐述。

数据读入与处理

n=3#状态数
data=pd.read_csv('399300.csv',engine='python')
#print(data.head())
volume=data['成交量'][0:3674]
#print(volume)
close=data['收盘价'][0:3674]
print(close)
logDel = np.log(np.array(data['最高价'][0:3674])) - np.log(np.array(data['最低价'][0:3674]))
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]))

# 保持所有的数据shape相同
logDel = logDel[5:]
logRet_1 = logRet_1[4:]
close = close[5:]
#将行数合并
Date = pd.to_datetime(data['日期'][5:3674])
print(Date)
# print(logDel.shape)
# print(logRet_5.shape)
# print(logVol_5.shape)
A = np.column_stack([logDel, logRet_5, logVol_5])
#model=hmm.GaussianHMM()

调用HMM模型

model = hmm.GaussianHMM(n_components=n, covariance_type="full", n_iter=2000).fit(A)
hidden_states = model.predict(A)

对HMM的结果进行可视化处理

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()

3隐藏状态下的可视化效果:
在这里插入图片描述
在这里插入图片描述

做出量化策略

对冲的思想是到谷底进行进仓操作,到波峰进行出仓操作。这里将操作进行理想化,不考虑买入卖出的费率。

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()

结果:
在这里插入图片描述

小结

此文主要试水,在结果阐述上、模型优化上仍有许多可提升之处,原理解释也不够详尽,同时,准确率、收益率计算也尚未进行,也希望读者可以不吝给出更好的方案,共同探讨。

发布了29 篇原创文章 · 获赞 36 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Zengmeng1998/article/details/104439369