关闭
您正在使用的浏览器版本较低,无法支持聚宽的某些特性。
为了获得更好的体验,推荐使用:
Google Chrome
或者
Mozilla Firefox
或者
IE9以上
。
返回主题列表
HMM择时进一步研究
luffyasce
发布于2017-05-07
回复 51
浏览 12115
117
listen
分享到:
微信
微博
雪球
阅读陈小米大神“运用HMM模型的择时策略”的帖子,觉得非常厉害,于是自己也试了试。 原帖:[https://www.joinquant.com/post/1054?tag=new][1] 一、研究过程:方法参考陈大神的帖子 1、研究对象。考虑到之后以沪深300期货作为回测对象,因此以沪深300指数为研究对象,采用python中的hmmlearn.hmm模块中的GaussianHMM模型进行拟合,拟合样本范围为2005-2014,测试样本为2015-2017。 2、观测变量选取。选取日对数收益率、5日对数收益率、日极差对数收益率(最高减最低后取对数)作为观测变量。三个观测变量经偏度、峰度及正态性检验,符合高斯分布。 3、拟合。隐含状态数取13,进行GaussianHMM模型拟合.。 4、分析。画出沪深300指数2005-2014年每日股价所处的状态;画出每个状态在10年间的累计收益图。由图分析出状态4、9、10为上涨状态、状态0、2、8为下跌状态。 5、简单回测。在拟合样本及测试样本中,分别将每个上涨状态的下一天的累计收益率,减去下跌状态下一天的累计收益率,得到拟合范围及测试范围的隐马尔科夫择时模型的累计收益率图。 6、初步结论:2005-2014年,该策略多空累计收益约55倍,且少有回撤。2015-2017的测试样本,该策略累计收益约1.7倍,收益率曲线前半段上升较为平稳,16年7月之后收益有所回撤。 二、回测 1、回测思路: (1)选取沪深300股指期货10年至17年作为回测对象,调仓周期为每天,时间为开盘,为尽可能模拟沪深300指数收益,设佣金为0,保证金比率为100%。每天开盘,将截止昨日收盘前90天的日对数收益率、5日对数收益率、日极差对数收益率输入第一步中拟合出的HMM模型对昨日进行隐含状态预测。昨日预测为上涨状态即做多、下跌状态即做空。其结果与原先大相近庭,收益为负数。 (2)不在每天进行模型预测,而将“一、研究过程”中产生的信号直接输入进行回测,15-17年收益为38.75%,最大回撤为12.87%,表现大幅度提高。 2、反思:经过反复试验,发现隐马尔科夫模型具有前视性,原先使用完整收益序列预测每一天的状态时会使用到未来数据,其预测结果为最大后验概率的状态。而真实回测时预测最后一天的状态,状态预测会根据未来数据变化而变化、不稳定。 三、稳定HMM信号模型 为提高HMM的稳定性,构造稳定HMM信号模型。利用观测变量正态分布的特征,计算前750天观测变量的均值与标准差,对当日及之后共5天的观测值进行模拟。将这未来5天的模拟数据与过去750天的观测变量连同一起产生1000个样本,输入HMM模型进行预测,产生1000个当天状态的预测值。若某状态预测频率高于80%,则认为其为稳定信号。根据稳定信号进行回测,11-14年收益率为32.49%,最大回撤16.32%;15-17年收益率为12.49%,最大回撤为16.13%。可见稳定HMM信号模型稍稍改善了模型预测能力,但收益和原HMM模型不可同日而语。 四、HMM状态动量反转策略 1、思路:改变一下使用HMM模型的思路。根据前面的研究,HMM模型虽然在预测上不稳定,但其对历史数据具有极强形态识别能力。考虑根据HMM识别出的牛熊特征,进行择时。 2、回测实现:仍以沪深300指数期货为标的,佣金为0、保证金比率为100%。每个交易日,利用HMM模型获取过去60天的牛熊状态,分类为牛、熊与震荡,状态值分别为1,-1和0。选取过去10天为短周期、60天为长周期,将短周期和长周期每日状态值进行累加,得到牛熊指标。当短期牛熊指标大于6(短期动量)或者长期牛熊指标小于-25且短期牛熊指标大于0(长期反转),则做多;做空策略相对称。该策略在10年6月至16年12月,累计收益率为81.77%,最大回撤为20.18%。 3、结论:该策略有一定的收益潜力,能够识别大趋势,在大涨大跌中获取趋势收益,但在震荡市中表现尚一般。另外,该模型收益受参数影响大,有过拟合的风险。 **才疏学浅,对hmm研究不深,最后没研究出啥牛逼成果。在这里抛砖迎玉,欢迎大家批评指正,提供新思路哈。** pickle文件:[https://pan.baidu.com/s/1dFIMjTZ][1] [1]: https://pan.baidu.com/s/1dFIMjTZ
117
listen
分享到:
微信
微博
雪球
评论
幻音
有没未来函数啊 求大神看下
2017-05-08
spoon37
latent_states_sequence2,有问题
2017-05-08
jiezi
运行出错
2017-05-08
luffyasce
@jiezi 把最后网盘里的pickle文件上传到研究里,才能运行。
2017-05-08
luffyasce
@spoon37 你是说latent_states_sequence2判断为下跌状态不合适?
2017-05-08
luffyasce
@幻音 大神不敢当。回测里拟合的预测模型用的是沪深300 05-14年的数据。严格意义上说14年底前的收益可能有未来函数。但回测用的逻辑有点脱离原来马尔科夫模型预测的逻辑了,感觉问题不大。
2017-05-08
luffyasce
三、稳定HMM信号模型 大家看看有没有更好的方法。
2017-05-08
spoon37
@luffyasce 研究文件运行出错,latent_states_sequence2没有定义.
2017-05-08
感到不爽
这个模型我试过,最好的方法是用几百天的数据进行训练,然后预测几十天的状态,不断滚动;第二点就是一定要注意HMM的指标选择,原文的三个指标可以考虑更换;第三就是hmmlearn这个包产生的状态具有随机性,最好使用自己电脑回测,把源码中的随机数种子给锁定住,这样结果就很稳定了。
2017-05-09
luffyasce
@spoon37 已修改。抱歉,因为当中改了很多次,出现了错误。
2017-05-09
luffyasce
@感到不爽 谢大神指点,有空试试。
2017-05-09
spoon37
@感到不爽 第三就是hmmlearn这个包产生的状态具有随机性,最好使用自己电脑回测, 使用平台和使用自己电脑,这点区别体现在哪儿?是指一个回测程序本地可以不中断继续使用数据吗?
2017-05-09
spoon37
@luffyasce 哪里.这块儿我完全是小白.还请教以下:1. 三、稳定HMM信号模型中, 只是修改策略,研究文件每次结果不一样不用考虑去稳定吗?2. data2.pkl好像没有
2017-05-09
luffyasce
@spoon37 1、是这样,我试验下来发现只要最后一天后面有数据,hmm模型预测还是比较准的,所以感觉可以用它来判断历史的牛熊状态。2、data2.pkl我上传到网盘了。这个我自己实验时候加的,后来忘了删了,其实和策略没啥关系,原来用来检验研究文件里的信号直接输入回测时用的,你也可以删了那一段代码。
2017-05-09
spoon37
@luffyasce 关于第1,每次我运行data2['backtest_return'].cumsum() ,结果都不同,差别很大.不过同一个训练结果出来的,回测完全一致.
2017-05-09
luffyasce
@spoon37 每次重新拟合模型后,上涨下跌的状态序号你改了吗?
2017-05-09
spoon37
@luffyasce 额.这个不懂怎么回事.
2017-05-09
luffyasce
@spoon37 每次重新拟合模型,隐含状态的序号是随机分配的。你要重新观察每个状态,计算每个状态累计收益率,判断哪些状态是上涨状态、哪些是下跌状态。
2017-05-10
感到不爽
@spoon37 在本地可以把源码包的代码改了
2017-05-11
住危楼养癫狗
之前有用过hmm择时,我是把08年那几年作为一个完整的市场周期,特征就是你那三个特征,设置3个隐藏状态训练好模型后,再用原数据预测,得到下跌周期某一天肯定为为下跌状态,并且设置这一天的隐藏状态值为下跌状态值。然后在14年后预测每天的状态,遇到下跌的隐藏状态就清仓
2017-07-13
首页
上一页
1
2
3
下一页
尾页
您尚未登录,请
登录
或者
注册
聚宽发表回复。
取 消
提 交