简述

这里要感谢一位研究生师兄分享了我这篇文章
https://www.ricequant.com/community/topic/788/
本文,是对上面文章的梳理,并做出了在本地条件下使用的代码

过程

隐藏马尔可夫(HMM)过程本质上,根据显式的数据,反推隐藏的状态。
类似于从输出链反推导出状态链。而每个状态,都有对应的输出可能。
这里假设所有的特征向量都服从高斯分布。(这个假设是自然的。中心极限定理,大数定理了解一下~)

关于实现这份代码中,遇到了很多坑。

  • pandas.Series.multiply()含义解释
  • pandas.DataFrame.multiply()含义解释
  • 【解决办法】read_csv()第一列作为index
  • DeprecationWarning: Function log_multivariate_normal_density is deprecated; The function log_multiva
  • 如何下载沪深300历史数据
  • 考虑到jupyter上的连续性操作,和普通的Python脚本之间的不同,所以,我们需要调用np.argsort()来得到最优的几个判断因子。

代码

  • 环境:Python 3.6 + Windows10
  • 调用的所有库都需要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_1templist = []
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()

数据图

实用性分析

  • 由于采用多因子最后整合的出来的效果,所以,对于交易的时候乘上的那个数值可能是大于1的数(这方面的考量上,这里最多是2,最小是0)
  • 对于每个因子,以及后期的交易上,都是采用每日收盘价的收益率(即今天的收盘价减去昨天的收盘价)求和之后,再e^x函数外包一下。这里,我不是很确定跟采用复利的情况下的区别。不过两者的增幅上都是同一量级的。
  • 最后算整个的情况的时候,是先将整个模型分为买入和卖出两个部分分别计算之后,再做收益率的求和变化。但实际交易过程中肯定是不可能这么简单的分的。
  • 还有,这里假设了估计是想要钱就来钱的模型。比如说,这里有可能出现,需要做买入某个指数,和卖出某个指数的操作,当然,做期货交易的时候,都是需要提交一定的佣金的。这里没有考虑这个问题。

不过虽然有很多的瑕疵(和现实的差距过于大),但是作为学习的demo,还是非常好的。

感谢那位师兄分享,和原作大神的分享。

【笔记】HMM在股票指数中的简单应用相关推荐

  1. 【陈工笔记】# Anaconda 虚拟环境中的简单操作指令#

    "良好的习惯,才不会让努力白白浪费." 确认是否安装Anaconda: conda -V 查看当前已存在的虚拟环境: conda env list 查看目前已安装的包: conda ...

  2. tensorflow笔记:流程,概念和简单代码注释

    tensorflow是google在2015年开源的深度学习框架,可以很方便的检验算法效果.这两天看了看官方的tutorial,极客学院的文档,以及综合tensorflow的源码,把自己的心得整理了一 ...

  3. python简单编程-编程中最简单的语言Python,这样学或许更容易

    最近微信小程序上面出了一个跳一跳的小游戏 大家有没有玩呀? 编程中最简单的语言Python,这样学或许更容易 分享之前我还是要推荐下我自己建的Python开发学习群:628979297,群里都是学Py ...

  4. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  5. Linux使用笔记: 设置Samba服务器中新建文件/目录的权限

    From: http://easwy.com/blog/archives/set-file-directory-attribute-for-linux-samba/ 通过Samba服务器实现windo ...

  6. 一、css清除浮动方法学习笔记总结(超详细,简单易懂)

    ** css清除浮动方法学习笔记总结(超详细,简单易懂) ** 问题: 上图中,由于container(父级元素)未设置高度,其内部子元素设置了float浮动,导致与container同级(也就是co ...

  7. Python数据挖掘学习笔记】九.回归模型LinearRegression简单分析氧化物数据

    #2018-03-23 16:26:20 March Friday the 12 week, the 082 day SZ SSMR [Python数据挖掘学习笔记]九.回归模型LinearRegre ...

  8. webpack入门学习笔记10 —— 在项目中使用图片资源

    1. 写在前面 在前端项目中,图片是必不可少的一种资源.在使用图片的时候,我们可以有以下几种方式: 在 .html 文件中,通过 <img src="" alt=" ...

  9. Go语言开发学习笔记(持续更新中)

    Go语言开发学习笔记(持续更新中) 仅供自我学习 更好的文档请选择下方 https://studygolang.com/pkgdoc https://www.topgoer.com/go%E5%9F% ...

最新文章

  1. linux结束ping进程,linux常用命令
  2. 单例模式实现方式详解
  3. Android Studio快捷键(MAC版)
  4. 吴恩达深度学习编程作业汇总
  5. wordpress-Sakurairo美化主题模板
  6. 我遇到了Hibernate异常
  7. Spring Boot设置指定包的日志级别
  8. js获取网络时间(axios获取响应头时间)
  9. 【经验分享】MAC系统自带截屏、录屏小工具
  10. 【原创】差分线——差模,共模,奇模,偶模傻傻的分不清楚
  11. [艾兰岛]制作传送门之boss技能——kura酱长期更新
  12. 数据库 SQL :数据库三大泛式简谈
  13. Ubuntu安装企业微信解决中文字体乱码的问题
  14. 在资深的幻游科技棋牌开发公司,领悟到的棋牌开发分享
  15. 8代处理器安装服务器系统,第八代cpu怎么安装win7
  16. 颜色RGB对照表(颜色大全)
  17. 网站怎么屏蔽指定搜索引擎访蜘蛛的访问
  18. 京东面经!让你的春招不再迷茫!
  19. mysql 时间戳转换为时间_将MYSQL数据库里的时间戳转换成时间
  20. 石墨烯 量子计算机,石墨烯鼓有望成为量子计算机内存

热门文章

  1. WinCE CEDDK之Bus操作函数
  2. python小波特征提取_Python 小波包变换,小波包能量特征提取 代码
  3. 扬州古城门高挂大红春联迎新春 环卫工受邀揭幕
  4. C# 部署失败--上传文件缺失
  5. 浅谈关于特征选择算法与Relief的实现
  6. HTML5无刷新修改URL:利用 History API 无刷新更改地址栏
  7. ASCX呼叫ASPX.CS的方法
  8. 将今天写进历史,即可得出现在的世界是数字的
  9. ORA-01994 故障一例
  10. latex 特殊符号