看到我这篇文章,相信您已经是有一定的数学基础的,隐马尔科夫模型的介绍这里不做赘述。

目录

ricequant研究平台训练模型

回测框架测试结果

ricequant研究平台训练模型

我们假设隐藏状态数量是6,即假设股市的状态有6种,虽然我们并不知道每种状态到底是什么,但是通过后面的图我们可以看出那种状态下市场是上涨的,哪种是震荡的,哪种是下跌的。可观测的特征状态我们选择了3个指标进行标示,进行预测的时候假设假设所有的特征向量的状态服从高斯分布,这样就可以使用 hmmlearn 这个包中的 GaussianHMM 进行预测了。下面我会逐步解释。

首先导入必要的包:

from hmmlearn.hmm import GaussianHMM
import numpy as np
from matplotlib import cm, pyplot as plt
import matplotlib.dates as dates
import pandas as pd
import datetime

测试时间从2005年1月1日到2015年12月31日,拿到每日沪深300的各种交易数据。

beginDate = '2005-01-01'
endDate = '2015-12-31'
n = 6 #6个隐藏状态
data = get_price('000300.XSHG',start_date=beginDate, end_date=endDate,frequency='1d')
data[0:9]

拿到每日成交量和收盘价的数据。

volume = data['volume']
close = data['close']
logDel = np.log(np.array(data['high'])) - np.log(np.array(data['low']))
logDellogRet_1 = np.array(np.diff(np.log(close)))#这个作为后面计算收益使用
logRet_5 = np.log(np.array(close[5:])) - np.log(np.array(close[:-5]))
logRet_5logVol_5 = np.log(np.array(volume[5:])) - np.log(np.array(volume[:-5]))
logVol_5logDel = logDel[5:]
logRet_1 = logRet_1[4:]
close = close[5:]
Date = pd.to_datetime(data.reset_index()["date"][5:])

合并成训练数据

A = np.column_stack([logDel,logRet_5,logVol_5])
A

将数据送入模型,进行6分类隐马尔科夫预测

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

将预测的6个分类图形画,从图中可观测出红色点阵代表牛市,绿色代表熊市,其他颜色反应微涨微跌的,震荡等市场格局

plt.figure(figsize=(25, 18))
for i in range(model.n_components):pos = (hidden_states==i)plt.plot_date(Date[pos],close[pos],'o',label='hidden state %d'%i,lw=2)#plt.legend(loc="left")

从图中可以比较明显的看出绿色的隐藏状态代表指数大幅上涨,浅蓝色和黄色的隐藏状态代表指数下跌。

为了更直观的表现不同的隐藏状态分别对应了什么,我们采取获得隐藏状态结果后第二天进行买入的操作,这样可以看出每种隐藏状态代表了什么。

从图中可以看出在状态3和状态4做多可以获得较高收益,状态1和状态2做空可以获得较小损失

long = (hidden_states==3) + (hidden_states == 4) #做多
short = (hidden_states==1) + (hidden_states == 2)  #做空
long = np.append(0,long[:-1]) #第二天才能操作
short = np.append(0,short[:-1]) #第二天才能操作
res['ret'] =  df.multiply(long) - df.multiply(short)
plt.plot_date(Date,np.exp(res['ret'].cumsum()),'r-')

最后保存模型

#保存模型
import pickle# 保存模型
with open('hmm.txt', 'wb') as f:pickle.dump(model, f)# 读取模型
with open('hmm.txt', 'rb') as f:hmm = pickle.load(f)

回测框架测试结果

import pickle
from six import BytesIO
from rqfactor import *
import rqdatac
import datetime
import numpy as np
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):context.stocklist = []body = get_file('hmm.txt')context.dict_model = pickle.load(BytesIO(body))context.hs300 = "000300.XSHG"# before_trading此函数会在每天策略交易开始前被调用,当天只会被调用一次
def before_trading(context):pass# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):cnt = 16close = history_bars(context.hs300, cnt, '1d', 'close')high = history_bars(context.hs300, cnt, '1d', 'high')low = history_bars(context.hs300, cnt, '1d', 'low')volume = history_bars(context.hs300, cnt, '1d', 'volume')print(context.now)print(close)print(high)logDel = np.log(high) - np.log(low)logRet_5 = np.log(close[5:]) - np.log(close[:-5])logVol_5 = np.log(volume[5:]) - np.log(volume[:-5])logDel = logDel[5:]B = np.column_stack([logDel,logRet_5,logVol_5])ret = context.dict_model.predict(B)print(B)print(ret)if ret[-1] == 1 or ret[-1] == 2:for stock in context.portfolio.positions.keys():if context.portfolio.positions[stock].quantity > 0:order_target_percent(stock, 0)if ret[-1] == 3:order_target_percent(context.hs300, 1)# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):pass

隐马尔科夫过往10年收益曲线

基于ricequant隐马尔科夫模型量化交易相关推荐

  1. 中文分词与马尔科夫模型之二:隐马尔科夫模型与维特比

    转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebv.html 前面一篇博客讲到了中文分词的机械分词算法,这种算法实现相对比较简单,但是分词效果还是有 ...

  2. python地图匹配_基于隐马尔科夫模型(HMM)的地图匹配(Map-Matching)算法

    1. 摘要 本篇博客简单介绍下用隐马尔科夫模型(Hidden Markov Model, HMM)来解决地图匹配(Map-Matching)问题.转载请注明网址. 2. Map-Matching(MM ...

  3. 基于隐马尔科夫模型文本相似度问题研究

    文本相似度是表示两个或者多个文本之间匹配程度的一个度量参数,相似度数值大,说明文本相似度高:反之文件相似程度就低.文本相似度的精确计算问题是进行信息处理的关键. 在如今信息技术飞速发展的互联网时代,文 ...

  4. 20200918:【广发金融工程】2018年重磅专题系列之九:基于隐马尔科夫模型的选股策略研究

    参考链接:https://www.sohu.com/a/252454782_465470 [广发金融工程]2018年重磅专题系列之九:基于隐马尔科夫模型的选股策略研究 2018-09-07 11:26 ...

  5. 基于C#的序列分类器:Part I:隐马尔科夫模型

    原文地址:http://www.codeproject.com/Articles/541428/Sequence-Classifiers-in-Csharp-Part-I-Hidden-Marko B ...

  6. m基于隐马尔科夫模型(HMM)的手机用户行为预测(MMUB)算法matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计模型,广泛应用在语音识别, ...

  7. 基于隐马尔科夫模型的道路匹配

    随着导航定位.移动互联网等技术的快速发展,手机.车载定位装置等设备都可以进行地理空间数据采集.这些不同类型的地理空间数据往往能反映出某种规律.以时空轨迹为例,这些新形式的泛在地理空间数据,能够反映个体 ...

  8. 隐马尔科夫模型HMM(一)HMM模型

    2019独角兽企业重金招聘Python工程师标准>>> 隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理 ...

  9. 第十九课.隐马尔科夫模型

    目录 隐马尔科夫模型的结构 马尔科夫链与隐马尔科夫模型 实例 HMM的要素 模型的性质 推理问题:HMM的状态解码 隐状态解码问题 最大路径概率与维特比算法 使用维特比算法解码 实例演示 基于Pyth ...

  10. 【NLP】用于语音识别、分词的隐马尔科夫模型HMM

    大家好,今天介绍自然语言处理中经典的隐马尔科夫模型(HMM).HMM早期在语音识别.分词等序列标注问题中有着广泛的应用. 了解HMM的基础原理以及应用,对于了解NLP处理问题的基本思想和技术发展脉络有 ...

最新文章

  1. [android] 从gallery获取图片
  2. Choosing technologies for .NET project
  3. MySQL中保存emoji表情
  4. boost采取什么驱动电路_当我们只是采取积极的意愿时会发生什么?
  5. 无法创建ssis数据流任务_SSIS中的数据分析任务概述
  6. Java知识积累——同时输出到控制台和指定文件,或直接输出到指定文件
  7. c#中如何删除数组中的元素_C中的数组
  8. 基于Android的数据采集系统,一种基于Android的新型用户数据采集发送系统
  9. 附加属性来控制控件中,要扩展模块的visibility
  10. 喜马拉雅音频批量下载
  11. 毕业设计记录(二):基于VUE框架与ECharts和Axios技术结合的Web移动高校实验室管理系统设计与实现
  12. 浅谈JSONP跨域漏洞
  13. web网页设计期末课程大作业:美食餐饮文化主题网站设计——中华美德6页面HTML+CSS+JavaScript
  14. ESP32 WIFI MESH 网络个人学习笔记整理
  15. 权重推送 产品定位 直通车投放 关键词 直通车人群 创意标题 补单 新手上路,直通车烧钱没效果怎么办?
  16. 嵌入式Linux系统环境搭建全流程-4412友善之臂开发板
  17. 推荐一个好用的OKR工具
  18. FMDB And Dao
  19. mac安装软件允许任何来源(sudo spctl --master-disable)
  20. OSPF---路由备份的设计实验

热门文章

  1. 通达信公式-当天成交量不大于百日均成交量比例
  2. 问题解决:com.lowagie.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H'
  3. 客户服务与工单管理系统—工单管理
  4. 大学生活的真实写照(经典)
  5. uniapp将h5链接打包成安卓
  6. 使用 CP2102通过串口下载程序到STM32F103中 (MCUISP)
  7. 如何学习opencv
  8. 利用Sen2cor工具对哨兵2影像进行大气校正和辐射校正
  9. 【腾讯犀牛鸟开源人才培养计划】开源人才培养计划活动参与指南
  10. 下载sqlserver2012 试用_大肥虫助手app下载-大肥虫助手最新版本下载v7.0.4