如何查找做網(wǎng)站的服務(wù)商白山網(wǎng)絡(luò)推廣
基于機(jī)器學(xué)習(xí)方法的股票預(yù)測(cè)系列文章目錄
一、基于強(qiáng)化學(xué)習(xí)DQN的股票預(yù)測(cè)【股票交易】
二、基于CNN的股票預(yù)測(cè)方法【卷積神經(jīng)網(wǎng)絡(luò)】
三、基于隱馬爾可夫模型的股票預(yù)測(cè)【HMM】
文章目錄
- 基于機(jī)器學(xué)習(xí)方法的股票預(yù)測(cè)系列文章目錄
- 一、HMM模型簡(jiǎn)介
- (1)前向后向算法
- (2)概率計(jì)算
- (3)對(duì)數(shù)似然函數(shù)
- (4)Baum-Welch算法
- (5)預(yù)測(cè)下一個(gè)觀測(cè)值
- (6)Kmeans參數(shù)初始化
- 二、Python代碼分析
- (1)高斯分布函數(shù)
- (2)GaussianHMM 類
- 1 初始化
- 2 K-means參數(shù)初始化
- 3 前向算法
- 4 后向算法
- 5 觀測(cè)概率計(jì)算
- 6 Baum-Welch算法
- 7 預(yù)測(cè)
- 8 預(yù)測(cè)更多時(shí)刻
- 9 解碼
- (3)總結(jié)
- 三、實(shí)驗(yàn)分析
- (1)對(duì)股票指數(shù)建模的模型參數(shù)
- (2)不同states下的對(duì)數(shù)似然變化
- (3)不同states下的股票指數(shù)擬合效果
- (4)不同states下的誤差及MSE
- (5)HMM模型單支股票預(yù)測(cè)小結(jié)
- (6)多支股票訓(xùn)練模型
本文探討了利用隱馬爾可夫模型(Hidden Markov Model, HMM)進(jìn)行股票預(yù)測(cè)的建模方法,并詳細(xì)介紹了模型的原理、參數(shù)初始化以及實(shí)驗(yàn)分析。HMM模型通過一個(gè)隱藏的馬爾可夫鏈生成不可觀測(cè)的狀態(tài)序列,并由這些狀態(tài)生成觀測(cè)序列。本文假設(shè)觀測(cè)概率分布為高斯分布,并利用前向后向算法進(jìn)行概率計(jì)算和參數(shù)估計(jì),完整代碼放在GitHub上——Stock-Prediction-Using-Machine-Learing。
一、HMM模型簡(jiǎn)介
隱馬爾可夫模型 (Hidden Markov Model, HMM模型), 是關(guān)于時(shí)序的概率模型, 描述由一個(gè)隱藏的馬爾可夫鏈隨機(jī)生成不可觀測(cè)的狀態(tài)隨機(jī)序列, 再由各個(gè)狀態(tài)生成一個(gè)觀測(cè)而產(chǎn)生觀測(cè)隨機(jī)序列的過程。HMM模型有兩個(gè)基本假設(shè):
- 齊次馬爾可夫性假設(shè): 即假設(shè)隱藏的馬爾可夫鏈在任意時(shí)刻t的狀態(tài)只依賴于其前一時(shí)刻的狀態(tài), 與其他時(shí)刻的狀態(tài)及觀測(cè)無關(guān), 也與時(shí)刻 t無關(guān)。
- 觀測(cè)獨(dú)立性假設(shè): 即假設(shè)任意時(shí)刻的觀測(cè)只依賴于該時(shí)刻的馬爾可夫鏈的狀態(tài),與其他觀測(cè)及狀態(tài)無關(guān)。
隱馬爾可夫模型由初始概率分布 π \pi π 、狀態(tài)轉(zhuǎn)移概率分布 A A A 以及觀測(cè)概率分布 B B B 確定, 故可將隱馬爾可夫模型 λ \lambda λ 用三元符號(hào)表示:
λ = ( A , B , π ) \lambda=(A, B, \pi) λ=(A,B,π)
在本次股票預(yù)測(cè)中, 可假設(shè)觀測(cè)概率分布為:
P ( x ∣ i ) = 1 ( 2 π ) d ∣ Σ i ∣ exp ? ( ? 1 2 ( x ? μ i ) T Σ i ? 1 ( x ? μ i ) ) P(x \mid i)=\frac{1}{\sqrt{(2 \pi)^vxwlu0yf4\left|\Sigma_{i}\right|}} \exp \left(-\frac{1}{2}\left(\boldsymbol{x}-\boldsymbol{\mu}_{i}\right)^{T} \Sigma_{i}^{-1}\left(\boldsymbol{x}-\boldsymbol{\mu}_{i}\right)\right) P(x∣i)=(2π)d∣Σi?∣?1?exp(?21?(x?μi?)TΣi?1?(x?μi?))
由此得到高斯隱馬爾可夫模型。
股票價(jià)格是可以看作連續(xù)值,所以利用隱馬爾可夫模型對(duì)股票進(jìn)行建模時(shí),假設(shè)觀測(cè)概率為高斯分布,然后便可以進(jìn)行HMM模型參數(shù)估計(jì)、相應(yīng)的概率計(jì)算,詳細(xì)原理下面展開敘述。
(1)前向后向算法
前向算法: 給定隱馬爾可夫模型 λ \lambda λ, 定義到時(shí)刻t部分觀測(cè)序列為 x 1 , x 2 , ? ? , x t x_{1}, x_{2}, \cdots \cdots, x_{t} x1?,x2?,??,xt?, 且狀態(tài)為 i的概率為前向概率, 記作:
α t ( i ) = P ( x 1 , x 2 , ? , x t , i t = i ∣ λ ) \alpha_{t}(i)=P\left(x_{1}, x_{2}, \cdots, x_{t}, i_{t}=i \mid \lambda\right) αt?(i)=P(x1?,x2?,?,xt?,it?=i∣λ)
后向算法: 給定隱馬爾可夫模型 λ \lambda λ, 定義到時(shí)刻t部分觀測(cè)序列為 x 1 , x 2 , ? ? , x t \mathrm{x}_{1}, \mathrm{x}_{2}, \cdots \cdots, \mathrm{x}_{t} x1?,x2?,??,xt?, 且狀態(tài)為 i \mathrm{i} i 的概率為后向概率, 記作
β t ( i ) = P ( x t + 1 , x t + 2 , ? , x T ∣ i t = i , λ ) \beta_{t}(i)=P\left(x_{t+1}, x_{t+2}, \cdots, x_{T} \mid i_{t}=i, \lambda\right) βt?(i)=P(xt+1?,xt+2?,?,xT?∣it?=i,λ)
為避免計(jì)算過程中數(shù)值的上溢與下溢, 作如下處理, 令:
S α , t = 1 max ? i α t ( i ) , S β , t = 1 max ? i β t ( i ) α t ( i ) = S α , t α t ( i ) , β t ( i ) = S β , t β t ( i ) \begin{aligned} S_{\alpha, t} &=\frac{1}{\max _{i} \alpha_{t}(i)}, S_{\beta, t}=\frac{1}{\max _{i} \beta_{t}(i)} \\ \alpha_{t}(i) &=S_{\alpha, t} \alpha_{t}(i), \beta_{t}(i)=S_{\beta, t} \beta_{t}(i) \end{aligned} Sα,t?αt?(i)?=maxi?αt?(i)1?,Sβ,t?=maxi?βt?(i)1?=Sα,t?αt?(i),βt?(i)=Sβ,t?βt?(i)?
(2)概率計(jì)算
推導(dǎo)可知, 給定模型 λ \lambda λ 和觀測(cè) O O O, 在時(shí)刻 t t t 處于i的概率記為:
γ t ( i ) = α t ( i ) β t ( i ) ∑ j α t ( j ) β t ( j ) \gamma_{t}(i)=\frac{\alpha_{t}(i) \beta_{t}(i)}{\sum_{j} \alpha_{t}(j) \beta_{t}(j)} γt?(i)=∑j?αt?(j)βt?(j)αt?(i)βt?(i)?
給定模型 λ \lambda λ 和觀測(cè) O O O, 在時(shí)刻 t t t 處于狀態(tài)i且在時(shí)刻 t + 1 \mathrm{t}+1 t+1 處于狀態(tài) j \mathrm{j} j 的概率記為:
γ t , t + 1 ( i , j ) = α t ( i ) P ( j ∣ i ) β t + 1 ( j ) P ( x t + 1 ∣ j ) ∑ k , l α t ( k ) P ( l ∣ k ) β t + 1 ( l ) P ( x t + 1 ∣ l ) \gamma_{t, t+1}(i, j)=\frac{\alpha_{t}(i) P(j \mid i) \beta_{t+1}(j) P\left(\boldsymbol{x}_{t+1} \mid j\right)}{\sum_{k, l} \alpha_{t}(k) P(l \mid k) \beta_{t+1}(l) P\left(\boldsymbol{x}_{t+1} \mid l\right)} γt,t+1?(i,j)=∑k,l?αt?(k)P(l∣k)βt+1?(l)P(xt+1?∣l)αt?(i)P(j∣i)βt+1?(j)P(xt+1?∣j)?
(3)對(duì)數(shù)似然函數(shù)
在利用最大似然對(duì)HMM模型進(jìn)行參數(shù)估計(jì)的時(shí)候,其對(duì)數(shù)似然函數(shù)如下:
L = log ? P ( O ∣ λ ) = log ? ∑ i = 1 N α T ( i ) \begin{aligned} L &=\log P(O \mid \lambda) \\ &=\log \sum_{i=1}^{N} \alpha_{T}(i) \end{aligned} L?=logP(O∣λ)=logi=1∑N?αT?(i)?
因?yàn)槊看芜M(jìn)行了歸一化:
α t ( i ) = S α , t ? α t ( i ) \alpha_{t}(i)=S_{\alpha, t} \cdot \alpha_{t}(i) αt?(i)=Sα,t??αt?(i)
遞推到T時(shí),可得:
α T ( i ) = S α , 1 ? S α , 2 ? S α , T ? α T ( i ) \alpha_{T}(i)=S_{\alpha, 1} \cdot S_{\alpha, 2} \cdots S_{\alpha, T} \cdot \alpha_{T}(i) αT?(i)=Sα,1??Sα,2??Sα,T??αT?(i)
故最終對(duì)數(shù)似然函數(shù)為:
L = log ? P ( O ∣ λ ) = log ? ∑ i = 1 N α T ( i ) = log ? ∑ i = 1 N α T ( i ) Π i = 1 T S α , i = log ? ∑ i = 1 N α T ( i ) ? ∑ i = 1 T log ? S α , i \begin{aligned} L &=\log P(O \mid \lambda) \\ &=\log \sum_{i=1}^{N} \alpha_{T}(i) \\ &=\log \sum_{i=1}^{N} \frac{\alpha_{T}(i)}{\Pi_{i=1}^{T} S_{\alpha, i}} \\ &=\log \sum_{i=1}^{N} \alpha_{T}(i)-\sum_{i=1}^{T} \log S_{\alpha, i} \end{aligned} L?=logP(O∣λ)=logi=1∑N?αT?(i)=logi=1∑N?Πi=1T?Sα,i?αT?(i)?=logi=1∑N?αT?(i)?i=1∑T?logSα,i??
(4)Baum-Welch算法
模型參數(shù)的學(xué)習(xí)問題,即給定觀測(cè)序列 O = { O 1 , O 2 , … , O T } O=\{O_1,O_2,…,O_T\} O={O1?,O2?,…,OT?},估計(jì)模型 λ = ( A , B , π ) λ=(A,B,\pi) λ=(A,B,π)的參數(shù),對(duì)HMM模型參數(shù)的估計(jì)可以由監(jiān)督學(xué)習(xí)和非監(jiān)督學(xué)習(xí)的方法實(shí)現(xiàn),而Baum-Welch算法是監(jiān)督學(xué)習(xí)的方法。Baum-Welch算法是EM算法在隱馬爾可夫模型學(xué)習(xí)中的具體實(shí)現(xiàn), 由BW算法可推知隱馬爾可夫模型的參數(shù)遞推表達(dá)式:
- 初始狀態(tài)概率向量: π ( i ) = ∑ X γ 1 X ( i ) ∑ X 1 \pi(i)=\frac{\sum_{X} \gamma_{1}^{X}(i)}{\sum_{X} 1} π(i)=∑X?1∑X?γ1X?(i)?
- 狀態(tài)轉(zhuǎn)移概率矩陣: P ( j ∣ i ) = ∑ t = 1 T ? 1 γ t , t + 1 ( i , j ) ∑ t = 1 T ? 1 γ t ( i ) P(j \mid i)=\frac{\sum_{t=1}^{T-1} \gamma_{t, t+1}(i, j)}{\sum_{t=1}^{T-1} \gamma_{t}(i)} P(j∣i)=∑t=1T?1?γt?(i)∑t=1T?1?γt,t+1?(i,j)?
- 觀測(cè)概率矩陣:
μ i = ∑ t γ t ( i ) x t ∑ t γ t ( i ) , Σ i = ∑ t γ t ( i ) ( x t ? μ i ) ( x t ? μ i ) T ∑ t γ t ( i ) \boldsymbol{\mu}_{i}=\frac{\sum_{t} \gamma_{t}(i) \boldsymbol{x}_{t}}{\sum_{t} \gamma_{t}(i)}, \Sigma_{i}=\frac{\sum_{t} \gamma_{t}(i)\left(\boldsymbol{x}_{t}-\mu_{i}\right)\left(\boldsymbol{x}_{t}-\mu_{i}\right)^{T}}{\sum_{t} \gamma_{t}(i)} μi?=∑t?γt?(i)∑t?γt?(i)xt??,Σi?=∑t?γt?(i)∑t?γt?(i)(xt??μi?)(xt??μi?)T?
通過前后向算法可以得到相應(yīng)的概率值,然后將相應(yīng)的概率值代入上面的遞推表達(dá)式,進(jìn)行迭代便可以得到HMM模型的參數(shù)。
(5)預(yù)測(cè)下一個(gè)觀測(cè)值
由 α t ( i ) \alpha_{\mathrm{t}}(i) αt?(i) 的定義, 給定觀測(cè)序列 x 1 : t \boldsymbol{x}_{1: t} x1:t?, 狀態(tài)為 i \mathrm{i} i 的概率為:
P ( i ∣ x 1 : t ) = α t ( i ) ∑ j α t ( j ) P\left(i \mid \boldsymbol{x}_{1: t}\right)=\frac{\alpha_{t}(i)}{\sum_{j} \alpha_{t}(j)} P(i∣x1:t?)=∑j?αt?(j)αt?(i)?
則給定觀測(cè)序列 x 1 : t , t + 1 x_{1: t}, t+1 x1:t?,t+1 時(shí)刻伏態(tài)為 j \mathrm{j} j 的概率為: ∑ i P ( i ∣ x 1 : t ) P ( j ∣ i ) \sum_{i} P\left(i \mid \boldsymbol{x}_{1: t}\right) P(j \mid i) ∑i?P(i∣x1:t?)P(j∣i), 從而由全概率公式, t + 1 t+1 t+1 時(shí)刻觀測(cè)值為 x t + 1 \boldsymbol{x}_{\boldsymbol{t}+1} xt+1? 的概率為:
P ( x t + 1 ∣ x 1 : t ) = ∑ j P ( x ∣ j ) ∑ i P ( i ∣ x 1 : t ) P ( j ∣ i ) P\left(\boldsymbol{x}_{t+1} \mid \boldsymbol{x}_{1: t}\right)=\sum_{j} P(\boldsymbol{x} \mid j) \sum_{i} P\left(i \mid \boldsymbol{x}_{1: t}\right) P(j \mid i) P(xt+1?∣x1:t?)=j∑?P(x∣j)i∑?P(i∣x1:t?)P(j∣i)
由最小均方誤差估計(jì)(MMSE), 可得 t + 1 t+1 t+1 時(shí)刻觀測(cè)值 x t + 1 x_{t+1} xt+1? 的估計(jì)值為:
x ^ t + 1 = E [ x t + 1 ∣ x 1 : t ] \hat{\boldsymbol{x}}_{t+1}=E\left[\boldsymbol{x}_{t+1} \mid \boldsymbol{x}_{1: t}\right] x^t+1?=E[xt+1?∣x1:t?]
即:
x ^ t + 1 = ∑ i P ( i ∣ x 1 : t ) ∑ j P ( j ∣ i ) E ( x ∣ j ) \hat{\boldsymbol{x}}_{t+1}=\sum_{i} P\left(i \mid \boldsymbol{x}_{1: t}\right) \sum_{j} P(j \mid i) E(\boldsymbol{x} \mid j) x^t+1?=i∑?P(i∣x1:t?)j∑?P(j∣i)E(x∣j)
(6)Kmeans參數(shù)初始化
在利用HMM可夫模型進(jìn)行建模的過程中,我們發(fā)現(xiàn)模型對(duì)參數(shù)的初始化十分敏感,不同的初始化最后得到的模型效果差異非常的,經(jīng)過不同的方法嘗試,我們發(fā)現(xiàn)利用Kmeans的方法對(duì)模型進(jìn)行初始化,效果非常好。利用Kmeans初始化的步驟如下:
- 選定HMM模型隱狀態(tài)數(shù)n
- 將股票收盤價(jià)數(shù)據(jù)聚為n類
- 令模型參數(shù)中觀測(cè)矩陣的初始均值=聚類中心的值
二、Python代碼分析
Github上的hmm.py
文件實(shí)現(xiàn)了一個(gè)高斯隱馬爾可夫模型(Gaussian Hidden Markov Model, GaussianHMM)用于時(shí)間序列數(shù)據(jù)的建模和預(yù)測(cè)。模型通過EM算法(Baum-Welch算法)進(jìn)行參數(shù)估計(jì),并包含前向后向算法、預(yù)測(cè)和解碼等功能,主要函數(shù)和方法如下。
(1)高斯分布函數(shù)
def gauss2D(x, mean, cov):z = -np.dot(np.dot((x-mean).T,inv(cov)),(x-mean))/2.0temp = pow(sqrt(2.0*pi),len(x))*sqrt(det(cov))return (1.0/temp)*exp(z)
該函數(shù)計(jì)算二元高斯分布的概率密度。輸入為樣本點(diǎn)x
,均值mean
和協(xié)方差矩陣cov
。
(2)GaussianHMM 類
1 初始化
class GaussianHMM:def __init__(self, n_state=1, x_size=1, iter=20, if_kmeans=True):self.n_state = n_stateself.x_size = x_sizeself.start_prob = np.ones(n_state) * (1.0 / n_state)self.transmat_prob = np.ones((n_state, n_state)) * (1.0 / n_state)self.trained = Falseself.n_iter = iterself.observe_mean = np.zeros((n_state, x_size))self.observe_vars = np.zeros((n_state, x_size, x_size))for i in range(n_state): self.observe_vars[i] = np.random.randint(0,10)self.kmeans = if_kmeans
該函數(shù)初始化HMM模型的參數(shù),包括隱狀態(tài)數(shù)n_state
、輸入維度x_size
、EM算法迭代次數(shù)iter
、是否使用KMeans進(jìn)行初始化if_kmeans
等。
2 K-means參數(shù)初始化
def _init(self, X):mean_kmeans = cluster.KMeans(n_clusters=self.n_state)mean_kmeans.fit(X)if self.kmeans:self.observe_mean = mean_kmeans.cluster_centers_print("聚類初始化成功!")else:self.observe_mean = np.random.randn(self.n_state, 1) * 2print("隨機(jī)初始化成功!")for i in range(self.n_state):self.observe_vars[i] = np.cov(X.T) + 0.01 * np.eye(len(X[0]))
通過K-means聚類方法對(duì)觀測(cè)矩陣的均值進(jìn)行初始化,并計(jì)算協(xié)方差矩陣。
3 前向算法
def forward(self, X):X_length = len(X)alpha = np.zeros((X_length, self.n_state))alpha[0] = self.observe_prob(X[0]) * self.start_probS_alpha = np.zeros(X_length)S_alpha[0] = 1 / np.max(alpha[0])alpha[0] = alpha[0] * S_alpha[0]for i in range(X_length):if i == 0:continuealpha[i] = self.observe_prob(X[i]) * np.dot(alpha[i - 1], self.transmat_prob)S_alpha[i] = 1 / np.max(alpha[i])if S_alpha[i] == 0:continuealpha[i] = alpha[i] * S_alpha[i]return alpha, S_alpha
計(jì)算前向概率,并進(jìn)行歸一化處理,防止數(shù)值上溢或下溢。
4 后向算法
def backward(self, X):X_length = len(X)beta = np.zeros((X_length, self.n_state))beta[X_length - 1] = np.ones((self.n_state))S_beta = np.zeros(X_length)S_beta[X_length - 1] = np.max(beta[X_length - 1])beta[X_length - 1] = beta[X_length - 1] / S_beta[X_length - 1]for i in reversed(range(X_length)):if i == X_length - 1:continuebeta[i] = np.dot(beta[i + 1] * self.observe_prob(X[i + 1]), self.transmat_prob.T)S_beta[i] = np.max(beta[i])if S_beta[i] == 0:continuebeta[i] = beta[i] / S_beta[i]return beta
計(jì)算后向概率,并進(jìn)行歸一化處理。
5 觀測(cè)概率計(jì)算
def observe_prob(self, x):prob = np.zeros((self.n_state))for i in range(self.n_state):prob[i] = gauss2D(x, self.observe_mean[i], self.observe_vars[i])return prob
計(jì)算當(dāng)前觀測(cè)值在各個(gè)隱狀態(tài)下的觀測(cè)概率。
6 Baum-Welch算法
def train(self, X):self.trained = TrueX_length = len(X)self._init(X)print("開始訓(xùn)練")start_time = time.time()self.L = []for _ in tqdm(range(self.n_iter)):alpha, S_alpha = self.forward(X)beta = self.backward(X)L = np.log(np.sum(alpha[-1])) - np.sum(np.log(S_alpha))self.L.append(L)post_state = alpha * beta / (np.sum(alpha * beta, axis=1)).reshape(-1, 1)post_adj_state = np.zeros((self.n_state, self.n_state))for i in range(X_length):if i == 0:continuenow_post_adj_state = np.outer(alpha[i - 1], beta[i] * self.observe_prob(X[i])) * self.transmat_probpost_adj_state += now_post_adj_state / np.sum(now_post_adj_state)self.start_prob = post_state[0] / np.sum(post_state[0])for k in range(self.n_state):self.transmat_prob[k] = post_adj_state[k] / np.sum(post_adj_state[k])self.observe_prob_updated(X, post_state)total_time = time.time() - start_timeprint(f"訓(xùn)練完成,耗時(shí):{round(total_time, 2)}sec")
通過Baum-Welch算法進(jìn)行模型參數(shù)的估計(jì)。包括E步驟(計(jì)算前向后向概率和后驗(yàn)概率)和M步驟(更新模型參數(shù))。
7 預(yù)測(cè)
def predict(self, origin_X, t):X = origin_X[:t]alpha, _ = self.forward(X)post_state = alpha / (np.sum(alpha, axis=1)).reshape(-1, 1)now_post_state = post_statex_pre = 0for state in range(self.n_state):p_state = now_post_state[:, state]temp = 0for next_state in range(self.n_state):temp += self.observe_mean[next_state] * self.transmat_prob[state][next_state]x_pre += p_state * tempreturn x_pre
預(yù)測(cè)時(shí)刻t
的觀測(cè)值。
8 預(yù)測(cè)更多時(shí)刻
def predict_more(self, origin_X, t):X = origin_X.copy()X_length = len(X)while X_length < t:alpha, _ = self.forward(X)post_state = alpha / (np.sum(alpha, axis=1)).reshape(-1, 1)now_post_state = post_statex_pre = 0for state in range(self.n_state):p_state = now_post_state[:, state]temp = 0for next_state in range(self.n_state):temp += self.observe_mean[next_state] * self.transmat_prob[state][next_state]x_pre += p_state * tempX = np.concatenate([X, x_pre[-1].reshape(-1, 1)])X_length += 1return X
預(yù)測(cè)更多時(shí)刻的觀測(cè)值。
9 解碼
def decode(self, X):X_length = len(X)state = np.zeros(X_length)pre_state = np.zeros((X_length, self.n_state))max_pro_state = np.zeros((X_length, self.n_state))max_pro_state[0] = self.observe_prob(X[0]) * self.start_probfor i in range(X_length):if i == 0:continuefor k in range(self.n_state):prob_state = self.observe_prob(X[i])[k] * self.transmat_prob[:, k] * max_pro_state[i - 1]max_pro_state[i][k] = np.max(prob_state)pre_state[i][k] = np.argmax(prob_state)state[X_length - 1] = np.argmax(max_pro_state[X_length - 1, :])for i in reversed(range(X_length)):if i == X_length - 1:continuestate[i] = pre_state[i + 1][int(state[i + 1])]return state
利用維特比算法解碼觀測(cè)序列,求其最可能的隱藏狀態(tài)序列。
(3)總結(jié)
該代碼實(shí)現(xiàn)了一個(gè)功能完備的高斯隱馬爾可夫模型(GaussianHMM),包括初始化、前向后向算法、Baum-Welch算法進(jìn)行參數(shù)估計(jì)、預(yù)測(cè)和解碼等功能。通過K-means聚類進(jìn)行初始化可以提高模型的初始參數(shù)設(shè)置,從而提高模型的訓(xùn)練效果。
三、實(shí)驗(yàn)分析
(1)對(duì)股票指數(shù)建模的模型參數(shù)
以DJ指數(shù)的收盤價(jià)為觀測(cè)序列, 隱狀態(tài)數(shù)量states分別設(shè)為 4 , 8 , 16 , 32 4,8,16,32 4,8,16,32, 我們得到了不同情況下的HMM模型, 其中以states = 8 =8 =8 為例, 學(xué)習(xí)得到的參數(shù)為:
初始概率分布: ( 0.000044 0.000000 0.000000 0.000000 0.000000 0.000000 0.999956 ) (\begin{array}{lllllll}0.000044 & 0.000000 & 0.000000 & 0.000000 & 0.000000 & 0.000000 &0.999956\end{array}) (0.000044?0.000000?0.000000?0.000000?0.000000?0.000000?0.999956?)
狀態(tài)轉(zhuǎn)移概率矩陣: ( 0.9498 0 0 0 0 0 0.0317 0.0185 0 0.9729 0 0 0.0158 0.0113 0 0 0 0 0.9433 0 0 0.0205 0.0362 0 0 0 0 0.9923 0.0077 0 0 0 0 0.0338 0 0.0178 0.9484 0 0 0 0 0.0091 0.0136 0 0 0.9773 0 0 0.0242 0 0.0296 0 0 0 0.9462 0 0.0238 0 0 0 0 0 0 0.9762 ) \left(\begin{array}{rrrrrrrr}0.9498 & 0 & 0 & 0 & 0 & 0 & 0.0317 & 0.0185 \\ 0 & 0.9729 & 0 & 0 & 0.0158 & 0.0113 & 0 & 0 \\ 0 & 0 & 0.9433 & 0 & 0 & 0.0205 & 0.0362 & 0 \\ 0 & 0 & 0 & 0.9923 & 0.0077 & 0 & 0 & 0 \\ 0 & 0.0338 & 0 & 0.0178 & 0.9484 & 0 & 0 & 0 \\ 0 & 0.0091 & 0.0136 & 0 & 0 & 0.9773 & 0 & 0 \\ 0.0242 & 0 & 0.0296 & 0 & 0 & 0 & 0.9462 & 0 \\ 0.0238 & 0 & 0 & 0 & 0 & 0 & 0 & 0.9762\end{array}\right) ?0.9498000000.02420.0238?00.9729000.03380.009100?000.9433000.01360.02960?0000.99230.0178000?00.015800.00770.9484000?00.01130.0205000.977300?0.031700.03620000.94620?0.01850000000.9762? ?
觀測(cè)概率分布:
-
均值: ( 12519.93 9640.24 10388.37 13541.56 13009.42 12052.83 8276.14 11241.26 ) (\begin{array}{llllllll}12519.93 & 9640.24 & 10388.37 & 13541.56 & 13009.42 & 12052.83 & 8276.14 & 11241.26\end{array}) (12519.93?9640.24?10388.37?13541.56?13009.42?12052.83?8276.14?11241.26?)
-
協(xié)方差: ( 23834.89 71700.85 45532.26 57449.12 26262.64 28852.07 338454.89 68110.31 ) (23834.89 \quad 71700.85 \quad 45532.26 \quad 57449 .12 \quad 26262.64 \quad 28852.07 \quad 338454.89 \quad 68110 .31) (23834.8971700.8545532.2657449.1226262.6428852.07338454.8968110.31)
我們可以看到模型最終參數(shù)中觀測(cè)概率分布中的均值和一開始聚類初始化的均值十分接近,這也是為什么Kmeans均值初始化效果非常好的原因。
(2)不同states下的對(duì)數(shù)似然變化
不同states下的對(duì)數(shù)似然變化情況如下圖所示:

我們可以看到隨著迭代次數(shù)的增加,對(duì)數(shù)似然越來越大,說明模型擬合效果越來越好。并且隱狀態(tài)數(shù)目越多,最終對(duì)數(shù)似然函數(shù)值也越大,說明隱狀態(tài)越多,模型效果越好。
(3)不同states下的股票指數(shù)擬合效果
不同states下的股票指數(shù)擬合效果如下圖所示:
由上面不同隱狀態(tài)下模型擬合效果圖可知,states數(shù)越多,模型擬合效果越好,但是需要根據(jù)BIC和AIC準(zhǔn)則以及訓(xùn)練模型的代價(jià)以及是否過擬合等方面來進(jìn)行模型選擇。
(4)不同states下的誤差及MSE
不同states下的誤差及MSE如下圖所示:
觀察圖中數(shù)據(jù)可知,states數(shù)越多,絕對(duì)誤差與MSE越小,說明擬合效果越好。
(5)HMM模型單支股票預(yù)測(cè)小結(jié)
以DJI指數(shù)的收盤價(jià)為觀測(cè)序列,隱狀態(tài)數(shù)量states分別設(shè)為4,8,16,32,我們得到了不同情況下的HMM模型,并比較了訓(xùn)練所消耗時(shí)間,訓(xùn)練結(jié)果的AIC、BIC預(yù)測(cè)結(jié)果的平均誤差、均方誤差,結(jié)果如下表所示:
States | Train Times | AIC | BIC | Mean Error | MSE |
---|---|---|---|---|---|
4 | 25.84 sec | 20237.65 | 20258.46 | 384.13 | 242865.78 |
8 | 46.93 sec | 18827.66 | 18869.28 | 217.18 | 92793.06 |
16 | 78.43 sec | 17752.77 | 17836.00 | 145.24 | 40568.63 |
32 | 147.48 sec | 17074.84 | 17241.30 | 114.51 | 25777.90 |
我們可以看到隨著隱狀態(tài)數(shù)的增加:
- 模型的擬合誤差不斷減小
- AIC和BIC指數(shù)不斷上升
- 對(duì)數(shù)似然也越來越大
- 但是模型訓(xùn)練時(shí)間也成倍上升
所以在實(shí)際應(yīng)用的過程中,我們需要考慮模型越復(fù)雜帶來提升的效果和代價(jià),并且在兩者之間找到一個(gè)權(quán)衡,而在后面的對(duì)比分析中,我們便采用的是隱狀態(tài)數(shù)=16。(關(guān)于AIC和BIC的介紹可以看我這篇文章——時(shí)間序列分析入門:概念、模型與應(yīng)用【ARMA、ARIMA模型】。
(6)多支股票訓(xùn)練模型
在前面的分析中,我們是對(duì)單只股票或者股票指數(shù)進(jìn)行HMM建模,但事實(shí)上可以利用HMM對(duì)多只股票進(jìn)行建模,這時(shí)多只股票共用同一個(gè)HMM參數(shù)和隱狀態(tài)序列,我們以AAPL單支股票訓(xùn)練HMM模型得到如下結(jié)果:
可以看到單只股票建模相對(duì)誤差率為3.1%,我們以AAPL與BAC、AAPL與C為例訓(xùn)練模型,得到的預(yù)測(cè)效果如下圖所示:
觀察上兩圖知,多支股票數(shù)據(jù)訓(xùn)練出來的模型效果不如單支股票的效果,且由相關(guān)性分析知,相關(guān)性越大的兩支股票組成的數(shù)據(jù)訓(xùn)練出的模型有更好的預(yù)測(cè)效果。不過這里面的原因可能比較復(fù)雜,有可能有負(fù)遷移的影響,不相關(guān)的股票數(shù)據(jù)導(dǎo)致共同建模效果反而不好。