"HMM模型的应用"

  "HMM模型的应用"

Posted by Kakarotto on April 10, 2017

cogito ergo sum

基于隐马尔科夫模型的股指期货预测方案

一、隐马尔可夫模型简介

1.1 基本定义

隐马尔可夫过程简称HMM,一般运用于时间序列的模式识别。下面是HMM的基本定义,由于我们观察的数据是连续数据,所以我们讨论的均是连续HMM。

  1. 在概率空间$(\Omega,F,p)$中,有两个时间序列${X_t},{Y_t}$。

  2. $X_t$是不可观测离散的有限状态一阶时齐马尔可夫链。
    1. 不可观测是指我们无法直接知道$X_t$取值。
    2. 离散有限状态指$X_t$取值范围为有限集合。
    3. 一阶时齐是指$\forall t$$$P(q_{t+1}=S_j q_t=S_i,q_{t-1}=S_{m},\dots q_1=S_z)=P(q_{t+1}=S_j q_t=S_i)$$
  3. $Y_t$是可观测的与隐状态相关的连续过程

  4. $A={a_{ij}}$为$X_t$的转移矩阵

  5. $B={b_1(y),b_2(y),\dots b_N(y)}$为反应$X_t$,$Y_t$关系的发射矩阵 $p$是在状态$S_j$时的条件概率密度函数,满足:

  6. 初始时刻的状态概率分布为: N为$X_t$的状态空间的取值个数。

上述模型即是隐马尔可夫模型,简记为$\lambda(A,B,\pi)$。

1.2 基本假设

根据1.1节HMM的定义,我们可以看出HMM的模型有如下两个基本假设,在这里给大家再强调一下。

  1. 状态序列$X_t$具有时齐,一阶马尔可夫性。
隐藏状态的在任意时刻,只依赖于前一时刻,而与之前的状态都无关,且与时间t无关。
  1. 观察序列具有观察独立性
任意时刻的观察序列,只依赖于该时刻的隐状态链,而与其他观察序列无关

1.3 HMM模型涉及的三种问题

按照我们处理具体问题的顺序来讨论HMM模型中会遇到的三个基本问题。

1.3.1 学习问题

假设我们已经知道一条观察序列$O_T=(o_1,o_2\dots o_t)$,如何去确定HMM模型的各项参数?使得$O_T$是该HMM模型下的观察序列。

实际上我们无法准确知道这个观察序列对应的HMM是什么,所以我们一般采用最大似然估计的方法,去寻找HMM的参数,使得在该模型下$P(O_T)$最大。具体算法参见之前的文章(该算法是本质上是一种迭代的使得参数局部最优化的算法,切训练模型的方式是无监督学习)。那么问题来了,如何去计算$P(O_T)$?这就是我们下面要说的第二个问题。

1.3.2 评估问题

现在假设我有一组HMM模型的参数$\lambda(A,B,\pi)$,已知观察序列$O_T=(o_1,o_2\dots o_t)$,我们需要计算在该模型下产生这种观察序列的概率为多少。注意,由于这种概率会很小,在计算机上会下溢出,所以我们一般求取其对数值。(这种算法本质上是一种动态规划)

1.3.3 解码问题

现在假设我有一组HMM模型的参数$\lambda(A,B,\pi)$,已知观察序列$O_T=(o_1,o_2\dots o_t)$,我们需要去解码,找出这组观察序列所对应的隐状态序列是什么,其实也就是找一组隐状态序列,使得在这隐状态序列下产生观察序列$O_T$的概率最大。

1.3.4 注意

  1. 我们讨论是连续的HMM,所以涉及到去评估观察序列到底是服从什么分布的问题。一般有三种解决思路。一是假设观察序列是满足多元正态分布的,对观察序列进行参数估计。二是假设观察序列是一种连续分布,我们使用混合的多元正态分布区逼近他。三是使用BOX-COX变换对观察序列进行处理,是对其满足正态分布。
  2. 在学习问题中,我们讨论的只有一个观察序列的情况,实际上我们可能会出现多个观察序列,然后要求这些观察序列所满足的HMM模型。这里需要注意的是,我们的多条观察序列必须是相互独立的。在后面模型的具体学习中我们还会提到这个问题。

二、应用HMM建立股指期货模型

现在我们使用HMM模型来对沪深300的股指期货进行建模。

2.1 基本假设

  1. 股指期货模型具有两条满足HMM模型的马尔可夫链。其中观察链为我们在长度为t的时间内所观察到的开盘价、收盘价、成交量等基础指标,以及在其基础上计算出的一些技术指标。
  2. 观察序列满足连续多元正态分布。
  3. 股指期货市场具有历史相似性。假定两条相似的时间序列的后续走势相同。

2.2 算法目标

已知当前时刻以及之前的观察序列。预测之后t分钟内,平、小涨、大涨、小跌、大跌的频率。以及其满足的状态转移矩阵。 如:我预测2017年4月14日上午10点,之后5分钟的频率为(0.4,0.2,0.2,0.1,0.1),即5分钟中有40%的是平,20%小涨,20%大涨,10%小跌,10%大跌。

2.2 算法流程

2.2.1 模型分类

由于分钟数据的时间序列非常多,一般股指期货的状态转移矩阵并不是时齐的,所以我们按照合约交易周期将2016年一年的训练数据分为12个周期,假设在每个周期内的状态转移矩阵是时齐的。定义12个HMM模型。

2.2.2 模型训练

根据前面1.3.4中的说法,我们将一个周期中的每天的时间序列看成一个观察序列,则假设这个周期中每天的观察序列是相互独立的。使用学习问题算法,对模型参数进行训练得到训练后的12个HMM模型。

2.2.3 预测算法

选择待预测时刻以及之前时刻的一段时间序列,记为$ts$。

  1. 使用评估问题计算每个模型下的似然值,得到似然值最大的模型$\lambda_i$。
  2. 在模型$\lambda_i$所对应的合约时间内,寻找似然值最接近的d个历史时间序列。
  3. 为上述d个历史时间序列分配权重,并统计上述d个历史时间序列t分钟内的涨幅情况。
  4. 根据权重计算出预测。

三、回测实验

3.1 基本参数

#交易阀值
a=0.0005
#隐状态数量
n_state=3
#选择时间序列的长度
T=30
#当下时间之后的t分钟内,小涨,大涨的概率
t=10
#采用15次平均的方法
d=15

3.2 实际实验中的一些处理

  1. 除了使用最基本的指标以外,还是用了一些技术指标,在选择技术指标的时候,排除了明显不符合正态分布的指标,最后选择的技术指标如下:

     #EMA,RSI指标
     #BOLL-BAND指标
     #MACD指标
     #ATR指标
     #BOV指标
     #SAR指标
     #DEMA指标
     #MOM指标
    
  2. 在数据中为对数据进行归一化处理。但是为了更好的评判时间序列的变化率,将部分指标换为上时刻相对于这个时刻的变化率

  3. 在交易阀值a的选择,是本着值关注大的变化,小的变化不去关注的原则。因为我们在后面实际交易中,交易次数不能过多。并且当a的取值比较大时,该预测的才较为靠谱,否则过于小的a值会导致预测率很低。

3.2 实验结果

3.2.1 频率预测

我们选择IF1601-IF1612数据为训练集。按照前面的基本参数为模型参数。回测2017年1月23日全天的交易数据,其中前29分钟不进行预测,收集数据。之后开始预测后面10分钟内,五种状态出现的频率。

*红色表示实际出现的频率

绿色x表示预测出现的频率**

图一:平状态10分钟内出现的频率 1

图二:小涨状态10分钟内出现的频率 2

图三:大涨状态10分钟内出现的频率 3

图四:小跌状态10分钟内出现的频率

4

图五:大跌状态10分钟内出现的频率 5

在上面的图像中,我们真正关心的是涨跌状态出现频率的值。因为在交易中我们只对涨跌状态的出现才会给予操作。

目前这种方案的实验结果也并不是太好。目前正在尝试更多的参数,并对其他日期进行回测实验。

3.2.2 状态转移矩阵输出

由于我们是定义的12种HMM,所以当下的状态转移矩阵对应的就是12种HMM所对应的状态转移矩阵。

根据实验结果,其中2017年1月23日状态转移矩阵只有两个。 2017-01-23 10:00 至2017-01-23 13:57

array([[ 0.73789552,  0.23069883,  0.03140565],
       [ 0.12218488,  0.87499329,  0.00282183],
       [ 0.26019538,  0.01048605,  0.72931857]])

2017-01-23 13:58 至2017-01-23 15:00

array([[ 0.89324664,  0.00616745,  0.10058591],
       [ 0.0175966 ,  0.68576753,  0.29663587],
       [ 0.14574175,  0.03096615,  0.82329211]])