[研究]西蒙斯的赚钱秘籍:隐马尔科夫模型(HMM)的择时应用

之前做过相关方面的研究,针对的是国外的期货市场。也有朋友建议说拿A股来试试看。所以有了下面的这篇东西。扯上西蒙斯前辈,是因为确实不少猜测认为文艺复兴用的就是HMM模型。

一、从大奖章讲起

Renaissance & Medallion(文艺复兴科技和大奖章)量化圈都非常熟悉了。Simons一群物理学家和数学家碰撞在一起,1989年到2008年的yearly return达到35.6%。文艺复兴大概一百多个员工,AUM:50亿美金,在全球金融危机的08年,大部分对冲基金都亏损,而大奖章的return高达80%。

神秘的文艺复兴科技和神秘的大奖章基金,到底一群数学家和物理学家聚在一起搞出了什么赚钱利器?外界猜测众说纷纭。而隐马尔科夫模型也由于一些原因被推举出来。

成立初期的创始人中,有一位科学家发明了广泛应用在语音识别等领域的鲍姆-威尔士算法,用来确定不可确知的变量可能出现的概率。今天要介绍的HMM模型,也是在语音识别中运用非常成功的模型,最早是由鲍姆等人提出的。

之前拜读人大的一位教授14年写的一本书,解密复兴科技:基于隐蔽马尔科夫模型的时序分析方法,书中介绍了为什么觉得HMM是Renaissance使用的模型,并且含有详细的公式推导和运算,以及附上了一些些实证结果(个人认为还有很多有待补充和粗糙的地方)。感兴趣推荐研读。

二、认识模型

HMM模型,又叫隐马尔科夫模型。要正确的理解和搞懂模型,教材里有很多经典的例子。我从自己理解后的角度尽量浅显的给大家做一个解释,方便大家快速理清概念投入应用。

我们能观测到的序列(Y1,...,Yn)称为可观测序列,如股价,成交量,资金净额等等。

而每一个可观测值的产生对应着市场状态序列(Z1,...,Zn),每个状态通过不同的分布函数来产生观测值。

通过HMM模型,可以用简单的输入,来得出对目前市场状态的判断,从而帮助我们进行择时选择。因为市场状态不是显性可观测的,属于隐藏状态,我们通过对可观测变量的处理来进行推测。

这里对HMM模型进行了扩展得到HMS-GMD模型,因为收益率序列尖峰厚尾的特性导致的非正态分布,引入了混合高斯分布作为状态到观测值之间产生关系的分布函数。

将HMM模型看作一个黑箱子,这个黑箱子可以利用极其方便、简洁的数据,处理后得出:

1. 每个时刻对应的状态序列;

2. 混合分布的均值和方差矩阵;

3. 混合分布的权重矩阵;

4. 状态间转移概率矩阵。

而黑箱子需要事先给定两个参数:状态数目、混合高斯分布的成分数目。

当然,输入这里是拿单一的价格序列举例。输入也可以是并行的数据矩阵,比如从价格、成交量、资金净额等多个角度来看。

总结一下,使用模型需要在初期设定:

1. 隐藏状态数目

2. 输入的观测变量

3. 混合高斯分布成分数目

三、A股市场实证

下面拿A股市场来做检验。

模型的设定如下:

1. 隐藏状态数目:6

2. 输入变量:当日对数收益率,五日对数收益率,当日对数高低价差(其他备选因素成交量、成交额等大家可以自行尝试)

3. 混合高斯分布成分数目:1(为了简便,假定对数收益率服从单一高斯分布)

In [1]:

from hmmlearn.hmm import GaussianHMMimport datetimeimport numpy as npimport pandas as pdimport seaborn as snsfrom matplotlib import cmfrom matplotlib import pyplotstartdate = '2012-06-01'enddate = '2016-04-07'df = get_price(['000300.XSHG'], start_date=startdate, end_date=enddate, frequency='daily', fields=['close','volume','high','low'])close = df['close']['000300.XSHG']high = df['high']['000300.XSHG'][5:]low = df['low']['000300.XSHG'][5:]volume = df['volume']['000300.XSHG'][5:]money = df['volume']['000300.XSHG'][5:]datelist = pd.to_datetime(close.index[5:])logreturn = (np.log(np.array(close[1:]))-np.log(np.array(close[:-1])))[4:]logreturn5 = np.log(np.array(close[5:]))-np.log(np.array(close[:-5]))diffreturn = (np.log(np.array(high))-np.log(np.array(low)))closeidx = close[5:]X = np.column_stack([logreturn,diffreturn,logreturn5])len(X)

Out[1]:

931

In [2]:

hmm = GaussianHMM(n_components = 6, covariance_type='diag',n_iter = 5000).fit(X)latent_states_sequence = hmm.predict(X)len(latent_states_sequence)

Out[2]:

931

In [3]:

sns.set_style('white')plt.figure(figsize = (15, 8))for i in range(hmm.n_components): state = (latent_states_sequence == i) plt.plot(datelist[state],closeidx[state],'.',label = 'latent state %d'%i,lw = 1) plt.legend() plt.grid(1)

Out [3]:

  以上。我们看到了六个状态的HMM模型输出的市场状态序列。需要注意的是:HMM模型只是能分离出不同的状态,具体对每个状态赋予现实的市场意义,是需要人为来辨别和观察的。

下面我们来用简单的timming策略来识别6种latent_state所带来的效果。

In [4]:

data = pd.DataFrame({'datelist':datelist,'logreturn':logreturn,'state':latent_states_sequence}).set_index('datelist')plt.figure(figsize=(15,8))for i in range(hmm.n_components): state = (latent_states_sequence == i) idx = np.append(0,state[:-1]) data['state %d_return'%i] = data.logreturn.multiply(idx,axis = 0) plt.plot(np.exp(data['state %d_return' %i].cumsum()),label = 'latent_state %d'%i) plt.legend() plt.grid(1)

Out [4]:

  上图可以看出:

1. 状态0——蓝色——震荡下跌

2. 状态1——绿色——小幅的上涨

3. 状态2——红色——牛市上涨

4. 状态3——紫色——牛市下跌

5. 状态4——黄色——震荡下跌

6. 状态5——浅蓝色——牛市下跌

以上的意义归结是存在一定主观性的。因为HMM模型对输入的多维度观测变量进行处理后,只负责分出几个类别,而并不会定义出每种类别的实际含义。所以我们从图形中做出上述的判断。

四、择时策略

我们根据模拟出来的隐藏状态,来进行择时。

(1)理论版:股指期货可卖空。

策略是这样设计的:

1. 当天处在状态0,3时,买入指数基金;

2. 当天处在状态1,2,4,5时,卖空股指期货;

我们来看一下收益效果:4年7倍。

In [5]:

buy = (latent_states_sequence == 1) + (latent_states_sequence == 2)buy = np.append(0,buy[:-1])sell = (latent_states_sequence == 0) + (latent_states_sequence == 3) \ + (latent_states_sequence == 4) + (latent_states_sequence == 5)sell = np.append(0,sell[:-1])data['backtest_return'] = data.logreturn.multiply(buy,axis = 0) \ - data.logreturn.multiply(sell,axis = 0)plt.figure(figsize = (15,8))plt.plot_date(datelist,np.exp(data['backtest_return'].cumsum()),'-',label='backtest result')plt.legend()plt.grid(1)

Out [5]:

(2) A股版

鉴于卖空指数对散户来说没什么可操作性,我们单看能做多的A股市场。选择嘉实沪深300基金来复制沪深300指数。

策略是这样设计的:

1. 当天处在状态0,3时,买入指数基金;

2. 当天处在状态1,2,4,5时,空仓;

看一下回测效果

回撤和收益都看起来很漂亮。虽然我也没太懂为什么跟可卖空的结果差不多= =,可能是单纯算收益率的伪回测不太准吧。第二是状态5(浅蓝色)有涨有跌,卖空它也有亏钱的时候。

五、最后的结论

搞量化的小伙伴们每每总是以为发现了『天上掉钱』的秘籍法宝,但仔细想想每一个模型都不是那么简单的。而且相信一部分人已经反映过来了,这是个In-Sample的测试,模型是根据全部时间段的数据得出状态序列的。也就是,天然的,我们就提前知道了什么时候涨跌。简单说,有未来函数。

但是,这不能否认模型优秀的模式识别能力。接下来要做的,是真正的分开In-Sample和Out-Sample来做回测。用一段时间训练得到的模型参数来分析之后一段时间的市场状态。

本文意在抛砖,大神们一起来研究HMM吧。

致谢

本文研究工具为IPython Notebook 2.7。API来自聚宽(JoinQuant),在此表示感谢。

文中代码均可至【研究】运用HMM模型的择时策略 克隆运行。

资源共享,是人类进步的推动力

『分享文章+关注公众号』

回复『大数据书籍』or『量化书籍』领取

之前做过相关方面的研究,针对的是国外的期货市场。也有朋友建议说拿A股来试试看。所以有了下面的这篇东西。扯上西蒙斯前辈,是因为确实不少猜测认为文艺复兴用的就是HMM模型。

一、从大奖章讲起

Renaissance & Medallion(文艺复兴科技和大奖章)量化圈都非常熟悉了。Simons一群物理学家和数学家碰撞在一起,1989年到2008年的yearly return达到35.6%。文艺复兴大概一百多个员工,AUM:50亿美金,在全球金融危机的08年,大部分对冲基金都亏损,而大奖章的return高达80%。

神秘的文艺复兴科技和神秘的大奖章基金,到底一群数学家和物理学家聚在一起搞出了什么赚钱利器?外界猜测众说纷纭。而隐马尔科夫模型也由于一些原因被推举出来。

成立初期的创始人中,有一位科学家发明了广泛应用在语音识别等领域的鲍姆-威尔士算法,用来确定不可确知的变量可能出现的概率。今天要介绍的HMM模型,也是在语音识别中运用非常成功的模型,最早是由鲍姆等人提出的。

之前拜读人大的一位教授14年写的一本书,解密复兴科技:基于隐蔽马尔科夫模型的时序分析方法,书中介绍了为什么觉得HMM是Renaissance使用的模型,并且含有详细的公式推导和运算,以及附上了一些些实证结果(个人认为还有很多有待补充和粗糙的地方)。感兴趣推荐研读。

二、认识模型

HMM模型,又叫隐马尔科夫模型。要正确的理解和搞懂模型,教材里有很多经典的例子。我从自己理解后的角度尽量浅显的给大家做一个解释,方便大家快速理清概念投入应用。

我们能观测到的序列(Y1,...,Yn)称为可观测序列,如股价,成交量,资金净额等等。

而每一个可观测值的产生对应着市场状态序列(Z1,...,Zn),每个状态通过不同的分布函数来产生观测值。

通过HMM模型,可以用简单的输入,来得出对目前市场状态的判断,从而帮助我们进行择时选择。因为市场状态不是显性可观测的,属于隐藏状态,我们通过对可观测变量的处理来进行推测。

这里对HMM模型进行了扩展得到HMS-GMD模型,因为收益率序列尖峰厚尾的特性导致的非正态分布,引入了混合高斯分布作为状态到观测值之间产生关系的分布函数。

将HMM模型看作一个黑箱子,这个黑箱子可以利用极其方便、简洁的数据,处理后得出:

1. 每个时刻对应的状态序列;

2. 混合分布的均值和方差矩阵;

3. 混合分布的权重矩阵;

4. 状态间转移概率矩阵。

而黑箱子需要事先给定两个参数:状态数目、混合高斯分布的成分数目。

当然,输入这里是拿单一的价格序列举例。输入也可以是并行的数据矩阵,比如从价格、成交量、资金净额等多个角度来看。

总结一下,使用模型需要在初期设定:

1. 隐藏状态数目

2. 输入的观测变量

3. 混合高斯分布成分数目

三、A股市场实证

下面拿A股市场来做检验。

模型的设定如下:

1. 隐藏状态数目:6

2. 输入变量:当日对数收益率,五日对数收益率,当日对数高低价差(其他备选因素成交量、成交额等大家可以自行尝试)

3. 混合高斯分布成分数目:1(为了简便,假定对数收益率服从单一高斯分布)

In [1]:

from hmmlearn.hmm import GaussianHMMimport datetimeimport numpy as npimport pandas as pdimport seaborn as snsfrom matplotlib import cmfrom matplotlib import pyplotstartdate = '2012-06-01'enddate = '2016-04-07'df = get_price(['000300.XSHG'], start_date=startdate, end_date=enddate, frequency='daily', fields=['close','volume','high','low'])close = df['close']['000300.XSHG']high = df['high']['000300.XSHG'][5:]low = df['low']['000300.XSHG'][5:]volume = df['volume']['000300.XSHG'][5:]money = df['volume']['000300.XSHG'][5:]datelist = pd.to_datetime(close.index[5:])logreturn = (np.log(np.array(close[1:]))-np.log(np.array(close[:-1])))[4:]logreturn5 = np.log(np.array(close[5:]))-np.log(np.array(close[:-5]))diffreturn = (np.log(np.array(high))-np.log(np.array(low)))closeidx = close[5:]X = np.column_stack([logreturn,diffreturn,logreturn5])len(X)

Out[1]:

931

In [2]:

hmm = GaussianHMM(n_components = 6, covariance_type='diag',n_iter = 5000).fit(X)latent_states_sequence = hmm.predict(X)len(latent_states_sequence)

Out[2]:

931

In [3]:

sns.set_style('white')plt.figure(figsize = (15, 8))for i in range(hmm.n_components): state = (latent_states_sequence == i) plt.plot(datelist[state],closeidx[state],'.',label = 'latent state %d'%i,lw = 1) plt.legend() plt.grid(1)

Out [3]:

  以上。我们看到了六个状态的HMM模型输出的市场状态序列。需要注意的是:HMM模型只是能分离出不同的状态,具体对每个状态赋予现实的市场意义,是需要人为来辨别和观察的。

下面我们来用简单的timming策略来识别6种latent_state所带来的效果。

In [4]:

data = pd.DataFrame({'datelist':datelist,'logreturn':logreturn,'state':latent_states_sequence}).set_index('datelist')plt.figure(figsize=(15,8))for i in range(hmm.n_components): state = (latent_states_sequence == i) idx = np.append(0,state[:-1]) data['state %d_return'%i] = data.logreturn.multiply(idx,axis = 0) plt.plot(np.exp(data['state %d_return' %i].cumsum()),label = 'latent_state %d'%i) plt.legend() plt.grid(1)

Out [4]:

  上图可以看出:

1. 状态0——蓝色——震荡下跌

2. 状态1——绿色——小幅的上涨

3. 状态2——红色——牛市上涨

4. 状态3——紫色——牛市下跌

5. 状态4——黄色——震荡下跌

6. 状态5——浅蓝色——牛市下跌

以上的意义归结是存在一定主观性的。因为HMM模型对输入的多维度观测变量进行处理后,只负责分出几个类别,而并不会定义出每种类别的实际含义。所以我们从图形中做出上述的判断。

四、择时策略

我们根据模拟出来的隐藏状态,来进行择时。

(1)理论版:股指期货可卖空。

策略是这样设计的:

1. 当天处在状态0,3时,买入指数基金;

2. 当天处在状态1,2,4,5时,卖空股指期货;

我们来看一下收益效果:4年7倍。

In [5]:

buy = (latent_states_sequence == 1) + (latent_states_sequence == 2)buy = np.append(0,buy[:-1])sell = (latent_states_sequence == 0) + (latent_states_sequence == 3) \ + (latent_states_sequence == 4) + (latent_states_sequence == 5)sell = np.append(0,sell[:-1])data['backtest_return'] = data.logreturn.multiply(buy,axis = 0) \ - data.logreturn.multiply(sell,axis = 0)plt.figure(figsize = (15,8))plt.plot_date(datelist,np.exp(data['backtest_return'].cumsum()),'-',label='backtest result')plt.legend()plt.grid(1)

Out [5]:

(2) A股版

鉴于卖空指数对散户来说没什么可操作性,我们单看能做多的A股市场。选择嘉实沪深300基金来复制沪深300指数。

策略是这样设计的:

1. 当天处在状态0,3时,买入指数基金;

2. 当天处在状态1,2,4,5时,空仓;

看一下回测效果

回撤和收益都看起来很漂亮。虽然我也没太懂为什么跟可卖空的结果差不多= =,可能是单纯算收益率的伪回测不太准吧。第二是状态5(浅蓝色)有涨有跌,卖空它也有亏钱的时候。

五、最后的结论

搞量化的小伙伴们每每总是以为发现了『天上掉钱』的秘籍法宝,但仔细想想每一个模型都不是那么简单的。而且相信一部分人已经反映过来了,这是个In-Sample的测试,模型是根据全部时间段的数据得出状态序列的。也就是,天然的,我们就提前知道了什么时候涨跌。简单说,有未来函数。

但是,这不能否认模型优秀的模式识别能力。接下来要做的,是真正的分开In-Sample和Out-Sample来做回测。用一段时间训练得到的模型参数来分析之后一段时间的市场状态。

本文意在抛砖,大神们一起来研究HMM吧。

致谢

本文研究工具为IPython Notebook 2.7。API来自聚宽(JoinQuant),在此表示感谢。

文中代码均可至【研究】运用HMM模型的择时策略 克隆运行。

资源共享,是人类进步的推动力

『分享文章+关注公众号』

回复『大数据书籍』or『量化书籍』领取


相关文章

  • 隐马尔可夫模型及其最新应用与发展
  • 2010 年 第19卷 第 7 期 计 算 机 系 统 应 用 隐马尔可夫模型及其最新应用与发展 ① 朱 明 郭春生 (杭州电子科技大学 通信工程学院 浙江 杭州 310018) 摘 要: 隐马尔可夫模型是序列数据处理和统计学习的一种重要概 ...查看


  • 马尔可夫及隐马尔可夫模型在数据挖掘中的应用
  • 数据库与信息管理本栏目责任编辑: 闻翔军马尔可夫及隐马尔可夫模型在数据挖掘中的应用 侯传宇1,2 (1.合肥工业大学计算机与信息学院,安徽合肥230009:2.宿州学院数学系,安徽宿州234000) 摘要:随着用户对于数据挖掘的精确度与准确 ...查看


  • HMM学习最佳范例
  • HMM学习最佳范例 转自:我爱自然语言处理 ( ) 一.介绍(Introduction) 我们通常都习惯寻找一个事物在一段时间里的变化模式(规律).这些模式发生在很多领域,比如计算机中的指令序列,句子中的词语顺序和口语单词中的音素序列等等, ...查看


  • 隐马尔科夫模型
  • 隐马尔科夫模型 隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价值.平时,经常能接触到涉 ...查看


  • 应用随机过程-马尔可夫过程的发展和应用
  • 马尔可夫链(过程)的发展与应用 1. 随机过程发展简述 在当代科学与社会的广阔天地里,人们都可以看到一种叫作随机过程的数学模型:从银河亮度的起伏到星系空间的物质分布.从分子的布朗运动到原子的蜕变过程,从化学反应动力学到电话通讯理论.从谣言的 ...查看


  • 隐马尔科夫模型HMM自学 (2)
  • 马尔科夫模型也需要改进! 崔晓源 翻译 当一个隐士不能通过直接观察天气状态来预测天气时,但他有一些水藻.民间的传说告诉我们水藻的状态与天气有一定的概率关系.也就是说,水藻的状态与天气时紧密相关的.此时,我们就有两组状态:观察状态(水藻的状态 ...查看


  • 隐马尔可夫模型(HMM)简介
  • 隐马尔可夫模型(HMM)简介 请各位读者深吸一口气--呼--开始-- (一) 阿黄是大家敬爱的警官,他性格开朗,身体强壮,是大家心目中健康的典范. 但是,近一个月来阿黄的身体状况出现异常:情绪失控的状况时有发生.有时候忍不住放声大笑,有时候 ...查看


  • 随机过程--马尔可夫过程的应用
  • 随机过程--马尔可夫过程的应用 年级: 专业:通信工程 姓名:李毓哲 学号: 2013级 3班 1302070131 摘要:随机信号分析与处理是研究随机信号的特点及其处理方法的专业基础,是目标检测.估计.滤波灯信号处理理论的基础,在通信.雷 ...查看


  • 人脸识别技术的研究现状与展望
  • 人脸识别技术的研究现状与展望 董琳 赵怀勋 武警工程学院通信工程系,陕西,710086 [摘 要]本文主要介绍了人脸识别技术(FRT)的常用方法,讨论和分析了人脸检测与定位.人脸特征提取.人脸识别方法等方面的研究成果,总结了人脸识别的未来发 ...查看


热门内容