摘自:http://blog.csdn.net/baskbeast/article/details/51218777
可以看 《統計學習方法》裡的介紹
這個向量表示第一天是晴天。到這裡,我們就為上面的一階馬爾科夫過程定義了以下三個部分:
狀态:晴天、陰天和下雨。
初始向量:定義系統在時間為0的時候的狀态的機率。
狀态轉移矩陣:每種天氣轉換的機率。所有的能被這樣描述的系統都是一個馬爾科夫過程。
然而,當馬爾科夫過程不夠強大的時候,我們又該怎麼辦呢?在某些情況下,馬爾科夫過程不足以描述我們希望發現的模式。
比如我們的股市,如果隻是觀測市場,我們隻能知道當天的價格、成交量等資訊,但是并不知道目前股市處于什麼樣的狀态(牛市、低迷的市場、震蕩、反彈等等),在這種情況下我們有兩個狀态集合,一個可以觀察到的狀态集合(股市價格成交量狀态等)和一個隐藏的狀态集合(股市狀況)。我們希望能找到一個算法可以根據股市價格成交量狀況和馬爾科夫假設來預測股市的狀況。
在上面的這些情況下,可以觀察到的狀态序列和隐藏的狀态序列是機率相關的。于是我們可以将這種類型的過程模組化為有一個隐藏的馬爾科夫過程和一個與這個隐藏馬爾科夫過程機率相關的并且可以觀察到的狀态集合,就是隐馬爾可夫模型。
假設我們開始擲骰子,我們先從三個骰子裡挑一個,挑到每一個骰子的機率都是1/3。然後我們擲骰子,得到一個數字,1,2,3,4,5,6,7,8中的一個。不停的重複上述過程,我們會得到一串數字,每個數字都是1,2,3,4,5,6,7,8中的一個。例如我們可能得到這麼一串數字(擲骰子10次):1 6 3 5 2 7 3 5 2 4
這串數字叫做可見狀态鍊。但是在隐馬爾可夫模型中,我們不僅僅有這麼一串可見狀态鍊,還有一串隐含狀态鍊。在這個例子裡,這串隐含狀态鍊就是你用的骰子的序列。比如,隐含狀态鍊有可能是:D4 D6 D8 D6 D4 D8 D6 D6 D6 D4。
一般來說,HMM中說到的馬爾可夫鍊其實是指隐含狀态鍊,因為隐含狀态(骰子)之間存在轉換機率。在我們這個例子裡,D6的下一個狀态是D4,D6,D8的機率都是1/3。D4,D8的下一個狀态是D4,D6,D8的轉換機率也都一樣是1/3。這樣設定是為了最開始容易說清楚,但是我們其實是可以随意設定轉換機率的。比如,我們可以這樣定義,D6後面不能接D4,D6後面是D6的機率是0.9,是D8的機率是0.1。這樣就是一個新的HMM。
其實對于HMM來說,如果提前知道所有隐含狀态之間的轉換機率和所有隐含狀态到所有可見狀态之間的輸出機率,做模拟是相當容易的。但是應用HMM模型時候呢,往往是缺失了一部分資訊的,有時候你知道骰子有幾種,每種骰子是什麼,但是不知道擲出來的骰子序列;有時候你隻是看到了很多次擲骰子的結果,剩下的什麼都不知道。如果應用算法去估計這些缺失的資訊,就成了一個很重要的問題。
和HMM模型相關的算法主要分為三類,分别解決三種問題:
知道骰子有幾種(隐含狀态數量),每種骰子是什麼(轉換機率),根據擲骰子擲出的結果(可見狀态鍊),我想知道每次擲出來的都是哪種骰子(隐含狀态鍊)。
還是知道骰子有幾種(隐含狀态數量),每種骰子是什麼(轉換機率),根據擲骰子擲出的結果(可見狀态鍊),我想知道擲出這個結果的機率。
知道骰子有幾種(隐含狀态數量),不知道每種骰子是什麼(轉換機率),觀測到很多次擲骰子的結果(可見狀态鍊),我想反推出每種骰子是什麼(轉換機率)。
如果要解決上面股市中的問題,我們就需要解決問題1和問題3,下面我們就看看如何實作。
我們假設隐藏狀态數量是6,即假設股市的狀态有6種,雖然我們并不知道每種狀态到底是什麼,但是通過後面的圖我們可以看出那種狀态下市場是上漲的,哪種是震蕩的,哪種是下跌的。可觀測的特征狀态我們選擇了3個名額進行标示,進行預測的時候假設假設所有的特征向量的狀态服從高斯分布,這樣就可以使用 hmmlearn 這個包中的 GaussianHMM 進行預測了。下面我會逐漸解釋。
首先導入必要的包:
In [1]:
測試時間從2005年1月1日到2015年12月31日,拿到每日滬深300的各種交易資料。
In [2]:
Out[2]:
ClosingPx
HighPx
LowPx
NextTradingDate
OpeningPx
TotalTurnover
TotalVolumeTraded
MDEntryDate
2005-01-04
982.79
994.77
980.66
20050105
4431976960
7412869
2005-01-05
992.56
997.32
979.88
20050106
981.58
4529207808
7119109
2005-01-06
983.17
993.79
980.33
20050107
993.33
3921015040
6288028
2005-01-07
983.96
995.71
979.81
20050110
983.05
4737468928
7298694
2005-01-10
993.88
993.96
979.79
20050111
983.76
3762931968
5791697
2005-01-11
997.14
999.55
991.09
20050112
994.19
3704076032
5849079
2005-01-12
996.75
996.98
989.26
20050113
996.65
3093298944
5014525
2005-01-13
996.88
999.47
992.70
20050114
996.08
3842172928
6044065
2005-01-14
988.31
1006.46
987.23
20050117
996.62
4162920960
7297842
拿到每日成交量和收盤價的資料。
In [3]:
計算每日最高最低價格的對數內插補點,作為特征狀态的一個名額。
In [4]:
計算每5日的指數對數收益差,作為特征狀态的一個名額。
In [5]:
Out[5]:
計算每5日的指數成交量的對數差,作為特征狀态的一個名額。
In [6]:
由于計算中出現了以5天為機關的計算,是以要調整特征名額的長度。
In [7]:
把我們的特征狀态合并在一起。
In [8]:
下面運用 hmmlearn 這個包中的 GaussianHMM 進行預測。
In [9]:
關于 covariance_type 的參數有下面四種:
spherical:是指在每個馬爾可夫隐含狀态下,可觀察态向量的所有特性分量使用相同的方內插補點。對應協方差矩陣的非對角為0,對角值相等,即球面特性。這是最簡單的高斯分布PDF。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmLi91YiljZlRmM4QmNyQ2MhVTOmdzMxgTOkZDM3QmNxAzYk9CXt92YucWbphmeuEzYpB3Lc9CX6MHc0RHaiojIsJye.jpg)
diag:是指在每個馬爾可夫隐含狀态下,可觀察态向量使用對角協方差矩陣。對應協方差矩陣非對角為0,對角值不相等。diag是hmmlearn裡面的預設類型。
full:是指在每個馬爾可夫隐含狀态下,可觀察态向量使用完全協方差矩陣。對應的協方差矩陣裡面的元素都是不為零。
tied:是指所有的馬爾可夫隐含狀态使用相同的完全協方差矩陣。
這四種PDF類型裡面,spherical, diag和full代表三種不同的高斯分布機率密度函數,而tied則可以看作是GaussianHMM和GMMHMM的特有實作。其中,full是最強大的,但是需要足夠多的資料來做合理的參數估計;spherical是最簡單的,通常用在資料不足或者硬體平台性能有限的情況之下;而diag則是這兩者一個折中。在使用的時候,需要根據可觀察态向量不同特性的相關性來選擇合适的類型。
轉自知乎使用者Aubrey Li
我們把每個預測的狀态用不同顔色标注在指數曲線上看一下結果。
In [10]:
從圖中可以比較明顯的看出綠色的隐藏狀态代表指數大幅上漲,淺藍色和黃色的隐藏狀态代表指數下跌。
為了更直覺的表現不同的隐藏狀态分别對應了什麼,我們采取獲得隐藏狀态結果後第二天進行買入的操作,這樣可以看出每種隐藏狀态代表了什麼。
In [11]:
可以看到,隐藏狀态1是一個明顯的大牛市階段,隐藏狀态0是一個緩慢上漲的階段(可能對應反彈),隐藏狀态3和5可以分别對應震蕩下跌的大幅下跌。其他的兩個隐藏狀态并不是很明确。由于股指期貨可以做空,我們可以進行如下操作:當處于狀态0和1時第二天做多,當處于狀态3和5第二天做空,其餘狀态則不持有。
In [12]:
收益曲線圖如下:
In [13]:
可以看到效果還是很不錯的。但事實上該結果是有些問題的。真實操作時,我們并沒有未來的資訊來訓練模型。不過可以考慮用曆史資料進行訓練,再對之後的資料進行預測。
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/bonelee/p/7873453.html,如需轉載請自行聯系原作者