Ricequant團(tuán)隊出品,如需轉(zhuǎn)發(fā)請注明且請私信聯(lián)系,否則必究。
原文:https://www.ricequant.com/community/topic/788/
今天我們來介紹一下HMM(隱馬爾科夫模型)在股票上的簡單應(yīng)用。
隱馬爾科夫模型强缘,乍一聽起來好高端,完全不知道是什么鬼不傅,那么就讓我們退一步旅掂,先看看馬爾科夫鏈。
馬爾可夫鏈访娶,因安德烈·馬爾可夫(A.A.Markov商虐,1856-1922)得名(就是下面這家伙)肯适,是指數(shù)學(xué)中具有馬爾可夫性質(zhì)的離散事件隨機(jī)過程缀壤。在給定當(dāng)前知識或信息的情況下,過去(即當(dāng)前以前的歷史狀態(tài))對于預(yù)測將來(即當(dāng)前以后的未來狀態(tài))是無關(guān)的桅锄。
該過程中劫哼,每個狀態(tài)的轉(zhuǎn)移只依賴于之前的n個狀態(tài)叮趴,這個過程被稱為1個n階的模型,其中n是影響轉(zhuǎn)移狀態(tài)的數(shù)目权烧。最簡單的馬爾科夫過程就是一階過程眯亦,每一個狀態(tài)的轉(zhuǎn)移只依賴于其之前的那一個狀態(tài)伤溉。
用數(shù)學(xué)表達(dá)式表示就是下面的樣子:
舉一個日常生活中的例子,我們希望根據(jù)當(dāng)前天氣的情況來預(yù)測未來天氣情況妻率。一種辦法就是假設(shè)這個模型的每個狀態(tài)都只依賴于前一個的狀態(tài)乱顾,即馬爾科夫假設(shè),這個假設(shè)可以極大簡化這個問題舌涨。當(dāng)然糯耍,這個例子也是有些不合實際的扔字。但是囊嘉,這樣一個簡化的系統(tǒng)可以有利于我們的分析,所以我們通常接受這樣的假設(shè)革为,因為我們知道這樣的系統(tǒng)能讓我們獲得一些有用的信息扭粱,盡管不是十分準(zhǔn)確的。上面的圖顯示了天氣進(jìn)行轉(zhuǎn)移的模型震檩。
注意一個含有N個狀態(tài)的一階過程有N2個狀態(tài)轉(zhuǎn)移琢蛤。每一個轉(zhuǎn)移的概率叫做狀態(tài)轉(zhuǎn)移概率,就是從一個狀態(tài)轉(zhuǎn)移到另一個狀態(tài)的概率抛虏。這所有的N2個概率可以用一個狀態(tài)轉(zhuǎn)移矩陣來表示博其,上面天氣例子的狀態(tài)轉(zhuǎn)移矩陣如下:這個矩陣表示,如果昨天是陰天迂猴,那么今天有25%的可能是晴天慕淡,12.5%的概率是陰天,62.5%的概率會下雨沸毁,很明顯峰髓,矩陣中每一行的和都是1。
為了初始化這樣一個系統(tǒng)息尺,我們需要一個初始的概率向量:
這個向量表示第一天是晴天携兵。到這里,我們就為上面的一階馬爾科夫過程定義了以下三個部分:
狀態(tài):晴天搂誉、陰天和下雨徐紧。
初始向量:定義系統(tǒng)在時間為0的時候的狀態(tài)的概率。
狀態(tài)轉(zhuǎn)移矩陣:每種天氣轉(zhuǎn)換的概率炭懊。所有的能被這樣描述的系統(tǒng)都是一個馬爾科夫過程并级。
然而,當(dāng)馬爾科夫過程不夠強(qiáng)大的時候凛虽,我們又該怎么辦呢死遭?在某些情況下,馬爾科夫過程不足以描述我們希望發(fā)現(xiàn)的模式凯旋。
比如我們的股市呀潭,如果只是觀測市場钉迷,我們只能知道當(dāng)天的價格、成交量等信息钠署,但是并不知道當(dāng)前股市處于什么樣的狀態(tài)(牛市糠聪、熊市、震蕩谐鼎、反彈等等)舰蟆,在這種情況下我們有兩個狀態(tài)集合,一個可以觀察到的狀態(tài)集合(股市價格成交量狀態(tài)等)和一個隱藏的狀態(tài)集合(股市狀況)狸棍。我們希望能找到一個算法可以根據(jù)股市價格成交量狀況和馬爾科夫假設(shè)來預(yù)測股市的狀況身害。
在上面的這些情況下,可以觀察到的狀態(tài)序列和隱藏的狀態(tài)序列是概率相關(guān)的草戈。于是我們可以將這種類型的過程建模為有一個隱藏的馬爾科夫過程和一個與這個隱藏馬爾科夫過程概率相關(guān)的并且可以觀察到的狀態(tài)集合塌鸯,就是隱馬爾可夫模型。
隱馬爾可夫模型(Hidden Markov Model) 是一種統(tǒng)計模型唐片,用來描述一個含有隱含未知參數(shù)的馬爾可夫過程丙猬。其難點是從可觀察的參數(shù)中確定該過程的隱含參數(shù),然后利用這些參數(shù)來作進(jìn)一步的分析费韭。下圖是一個三個狀態(tài)的隱馬爾可夫模型狀態(tài)轉(zhuǎn)移圖茧球,其中x表示隱含狀態(tài),y表示可觀察的輸出星持,a表示狀態(tài)轉(zhuǎn)換概率抢埋,b表示輸出概率。用一個擲篩子的例子闡述一下:假設(shè)我手里有三個不同的骰子钉汗。第一個骰子是我們平常見的骰子(稱這個骰子為D6)羹令,6個面,每個面(1损痰,2福侈,3,4卢未,5肪凛,6)出現(xiàn)的概率是1/6。第二個骰子是個四面體(稱這個骰子為D4)辽社,每個面(1伟墙,2,3滴铅,4)出現(xiàn)的概率是1/4戳葵。第三個骰子有八個面(稱這個骰子為D8),每個面(1汉匙,2拱烁,3生蚁,4,5戏自,6邦投,7,8)出現(xiàn)的概率是1/8擅笔。
假設(shè)我們開始擲骰子志衣,我們先從三個骰子里挑一個,挑到每一個骰子的概率都是1/3猛们。然后我們擲骰子念脯,得到一個數(shù)字,1阅懦,2和二,3,4耳胎,5,6惕它,7怕午,8中的一個。不停的重復(fù)上述過程淹魄,我們會得到一串?dāng)?shù)字郁惜,每個數(shù)字都是1,2甲锡,3兆蕉,4,5缤沦,6虎韵,7,8中的一個缸废。例如我們可能得到這么一串?dāng)?shù)字(擲骰子10次):1 6 3 5 2 7 3 5 2 4
這串?dāng)?shù)字叫做可見狀態(tài)鏈包蓝。但是在隱馬爾可夫模型中,我們不僅僅有這么一串可見狀態(tài)鏈企量,還有一串隱含狀態(tài)鏈测萎。在這個例子里,這串隱含狀態(tài)鏈就是你用的骰子的序列届巩。比如硅瞧,隱含狀態(tài)鏈有可能是:D4 D6 D8 D6 D4 D8 D6 D6 D6 D4。
一般來說恕汇,HMM中說到的馬爾可夫鏈其實是指隱含狀態(tài)鏈腕唧,因為隱含狀態(tài)(骰子)之間存在轉(zhuǎn)換概率冒嫡。在我們這個例子里,D6的下一個狀態(tài)是D4四苇,D6孝凌,D8的概率都是1/3。D4月腋,D8的下一個狀態(tài)是D4蟀架,D6,D8的轉(zhuǎn)換概率也都一樣是1/3榆骚。這樣設(shè)定是為了最開始容易說清楚片拍,但是我們其實是可以隨意設(shè)定轉(zhuǎn)換概率的。比如妓肢,我們可以這樣定義捌省,D6后面不能接D4,D6后面是D6的概率是0.9碉钠,是D8的概率是0.1纲缓。這樣就是一個新的HMM。
同樣的喊废,盡管可見狀態(tài)之間沒有轉(zhuǎn)換概率祝高,但是隱含狀態(tài)和可見狀態(tài)之間有一個概率叫做輸出概率。就我們的例子來說污筷,六面骰子(D6)產(chǎn)生1的輸出概率是1/6工闺。產(chǎn)生2,3瓣蛀,4陆蟆,5,6的概率也都是1/6惋增。我們同樣可以對輸出概率進(jìn)行其他定義叠殷。比如,我有一個被賭場動過手腳的六面骰子器腋,擲出來是1的概率更大溪猿,是1/2,擲出來是2纫塌,3诊县,4,5措左,6的概率是1/10依痊。
其實對于HMM來說,如果提前知道所有隱含狀態(tài)之間的轉(zhuǎn)換概率和所有隱含狀態(tài)到所有可見狀態(tài)之間的輸出概率,做模擬是相當(dāng)容易的胸嘁。但是應(yīng)用HMM模型時候呢瓶摆,往往是缺失了一部分信息的,有時候你知道骰子有幾種性宏,每種骰子是什么群井,但是不知道擲出來的骰子序列;有時候你只是看到了很多次擲骰子的結(jié)果毫胜,剩下的什么都不知道书斜。如果應(yīng)用算法去估計這些缺失的信息,就成了一個很重要的問題酵使。
和HMM模型相關(guān)的算法主要分為三類荐吉,分別解決三種問題:
知道骰子有幾種(隱含狀態(tài)數(shù)量),每種骰子是什么(轉(zhuǎn)換概率)口渔,根據(jù)擲骰子擲出的結(jié)果(可見狀態(tài)鏈)样屠,我想知道每次擲出來的都是哪種骰子(隱含狀態(tài)鏈)。
還是知道骰子有幾種(隱含狀態(tài)數(shù)量)缺脉,每種骰子是什么(轉(zhuǎn)換概率)痪欲,根據(jù)擲骰子擲出的結(jié)果(可見狀態(tài)鏈),我想知道擲出這個結(jié)果的概率枪向。
知道骰子有幾種(隱含狀態(tài)數(shù)量)勤揩,不知道每種骰子是什么(轉(zhuǎn)換概率),觀測到很多次擲骰子的結(jié)果(可見狀態(tài)鏈)秘蛔,我想反推出每種骰子是什么(轉(zhuǎn)換概率)。
如果要解決上面股市中的問題傍衡,我們就需要解決問題1和問題3深员,下面我們就看看如何實現(xiàn)。
原文及實現(xiàn):HMM在股票上的簡單應(yīng)用