专栏首页量化投资与机器学习量价特征因子:基于HMM的多空策略(附代码)

量价特征因子:基于HMM的多空策略(附代码)

标星★公众号 爱你们♥

作者:Sergey Malchevskiy

编译:1+1=6 | 公众号海外部

前言

我们通常使用股市的一手数据来创建一个策略模型,预测下一时刻价格的多少、走势的判断或其他。 今天,我们想结合多样的市场条件(波动性,交易量,价格变化等等)和结合隐马尔科夫(HMM)来构建我们的交易策略。

HMM是一个统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。我们的观测数据就是的市场特征,隐藏状态是市场的行为。

我们的目标是解释建模后的隐藏状态,并基于此建立交易策略。

特征工程与模型构建

先导入有关的包:

数据来自quandl:

先看看价格和成交量的走势图:

现在我们开始正式的特征工程和建模:

训练集:01 / 01 / 2018之前。下面的代码有关特征工程:

然后,我们得到了五个新的时间序列和训练模型:

特征序列

在上面的代码中,我们还创建了future_return列,它为last_return移动了一个lag。这是理解隐藏状态的第一个关键。我们把这个值画成每个状态的累加和。

正如我们看到的,状态#0有下降的趋势。状态#1没有一个明确的趋势。最后一个状态#2有强烈的上行趋势。 这个带有累积和future_return的简单技巧使我们能够理解每个状态如何对应下一个价格波动。

第二个关键是通过特征来研究每个状态。在此之后,我们可以将这两个事件(未来走势和当前状态)联系起来。让我们为每个状态的特征编写代码和可视化。

每个状态的特征分布

现在你可以看到每个状态是如何描述当前状态的。例如,状态 #0和#2具有较大的成交量偏差,这意味着这些状态通常呈现在大成交量上,而状态#1呈现在较小的成交量上。此外,状态#0和#2经常表现出高度的波动性。

有趣的是,状态#0的last_return和ma_ratio的值都很低。也许,状态#0对应的是当前的条件(目前)。状态#2的情况是滞后的。

对上面的两个表述,我们可以总结为:

  • 如果市场目前的状态是#0,那么在当前的情况下,我们主要处于下跌的市场状态,而这个趋势将会继续。
  • 如果市场处于当前状态#1,趋势处于不确定性中。
  • 如果市场目前的状态是#2,那么在当前的情况下,我们主要处于上升的市场状态,而这种趋势将会继续。

验证策略

逻辑很简单:

  • 状态为#0时:做空
  • 状态为#1时:空仓
  • 状态为#2时:做多

我们将使用 Catalyst 框架:

初始化函数:

handle_data函数:

analyze函数(绘制图形并打印结果):

运行策略:

正如我们预期的,策略跑赢了基准。如果没有趋势期,则它的结果可能一般。

  • 总收益: 1.49
  • Sortino coef: 1.88
  • Max drawdown: -0.31
  • alpha: 0.57
  • beta: -0.15

总结

如何改进策略:

1、向模型添加新特征。

2、尝试不同窗口长度。

3、建立具有不同隐藏状态数的模型。

4、对策略中的隐藏状态和使用规则做出新的解释。

5、添加简单的交易规则,如止损等。

文章来自:https://twitter.com/TDataScience

—End—

本文分享自微信公众号 - 量化投资与机器学习(Lhtz_Jqxx),作者:QIML编辑部

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【HMM研究实例】运用HMM模型的择时策略

    下面拿A股市场来做检验。 模型的设定如下: 隐藏状态数目:6 输入变量:当日对数收益率,五日对数收益率,当日对数高低价差(其他备选因素成交量、成交额等大家可以自...

    量化投资与机器学习微信公众号
  • 创新AI算法交易:重新定义Bar、标签和平稳性(附代码)

    我们经常采用非常简单的方法来预测金融时间序列:利用整个数据集,使用移动窗口生成X和Y,把它分为历史和样本外数据,训练一些机器学习模型映射X到Y并用多空策略进行回...

    量化投资与机器学习微信公众号
  • 【Matlab量化投资】用数据包络分析和基因算法进行选股分析?你get了吗!(附源程序)

    本文主要介绍用数据包络分析和基因算法按上市公司的基本面数据进行选股分析。其中基因算法用于选择基本面指标,数据包络分析对股票进行效率评分。‍‍‍‍‍ ‍由于代码较...

    量化投资与机器学习微信公众号
  • UML学习-状态图

    1.状态图概述 状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(E...

    水击三千
  • 强化学习(六)时序差分在线控制算法SARSA

        在强化学习(五)用时序差分法(TD)求解中,我们讨论了用时序差分来求解强化学习预测问题的方法,但是对控制算法的求解过程没有深入,本文我们就对时序差分的在...

    刘建平Pinard
  • 章神的私房菜之数据预处理

    作者:章华燕 编辑:徐松 Scikit-learn实战之数据预处理 ——Data Preprocessing ---- 各位看官,我们又见面了, 今天我们继续学...

    机器学习算法工程师
  • Flink 状态管理与 Checkpoint 机制

    相对于其他流计算框架,Flink 一个比较重要的特性就是其支持有状态计算。即你可以将中间的计算结果进行保存,并提供给后续的计算使用:

    zhisheng
  • Oracle 12c CC安装部署攻略 (中)

    设置SYSMAN管理账号密码、Agent注册密码,会自动设置CC使用的表空间路径和文件名,

    bisal
  • ICML2016最佳论文《深度强化学习的竞争网络架构》(附下载)

    【新智元导读】ICML2016最佳论文今天出炉,三篇最佳论文中,谷歌DeepMind占了两篇。新智元特邀Facebook资深研究员田渊栋对其中的《深度强化学习的...

    新智元
  • Android自定义View九宫格手势密码解锁

    由于公司新的项目需要用到九宫格手势密码解锁的功能,于是觉得自己写一个。废话不多说,直接上效果图:

    砸漏

扫码关注云+社区

领取腾讯云代金券