中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

如何查找做網(wǎng)站的服務(wù)商白山網(wǎng)絡(luò)推廣

如何查找做網(wǎng)站的服務(wù)商,白山網(wǎng)絡(luò)推廣,網(wǎng)站建設(shè)方案百度文庫,網(wǎng)絡(luò)組建畢業(yè)論文基于機(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)前向后…

基于機(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è):

  1. 齊次馬爾可夫性假設(shè): 即假設(shè)隱藏的馬爾可夫鏈在任意時(shí)刻t的狀態(tài)只依賴于其前一時(shí)刻的狀態(tài), 與其他時(shí)刻的狀態(tài)及觀測(cè)無關(guān), 也與時(shí)刻 t無關(guān)。
  2. 觀測(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(xi)=(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(lk)βt+1?(l)P(xt+1?l)αt?(i)P(ji)β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=1N?α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=1N?αT?(i)=logi=1N?Πi=1T?Sα,i?αT?(i)?=logi=1N?αT?(i)?i=1T?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á)式:

  1. 初始狀態(tài)概率向量: π ( i ) = ∑ X γ 1 X ( i ) ∑ X 1 \pi(i)=\frac{\sum_{X} \gamma_{1}^{X}(i)}{\sum_{X} 1} π(i)=X?1X?γ1X?(i)?
  2. 狀態(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(ji)=t=1T?1?γt?(i)t=1T?1?γt,t+1?(i,j)?
  3. 觀測(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(ix1: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(ix1:t?)P(ji), 從而由全概率公式, 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(xj)i?P(ix1:t?)P(ji)
由最小均方誤差估計(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(ix1:t?)j?P(ji)E(xj)

(6)Kmeans參數(shù)初始化

在利用HMM可夫模型進(jìn)行建模的過程中,我們發(fā)現(xiàn)模型對(duì)參數(shù)的初始化十分敏感,不同的初始化最后得到的模型效果差異非常的,經(jīng)過不同的方法嘗試,我們發(fā)現(xiàn)利用Kmeans的方法對(duì)模型進(jìn)行初始化,效果非常好。利用Kmeans初始化的步驟如下:

  1. 選定HMM模型隱狀態(tài)數(shù)n
  2. 將股票收盤價(jià)數(shù)據(jù)聚為n類
  3. 令模型參數(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ù)似然變化情況如下圖所示:

截屏2024-07-01 21.44.46

我們可以看到隨著迭代次數(shù)的增加,對(duì)數(shù)似然越來越大,說明模型擬合效果越來越好。并且隱狀態(tài)數(shù)目越多,最終對(duì)數(shù)似然函數(shù)值也越大,說明隱狀態(tài)越多,模型效果越好。

(3)不同states下的股票指數(shù)擬合效果

不同states下的股票指數(shù)擬合效果如下圖所示:

截屏2024-07-01 21.45.32

由上面不同隱狀態(tài)下模型擬合效果圖可知,states數(shù)越多,模型擬合效果越好,但是需要根據(jù)BIC和AIC準(zhǔn)則以及訓(xùn)練模型的代價(jià)以及是否過擬合等方面來進(jìn)行模型選擇。

(4)不同states下的誤差及MSE

不同states下的誤差及MSE如下圖所示:

截屏2024-07-01 21.46.31

截屏2024-07-01 21.46.04

觀察圖中數(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é)果如下表所示:

StatesTrain TimesAICBICMean ErrorMSE
425.84 sec20237.6520258.46384.13242865.78
846.93 sec18827.6618869.28217.1892793.06
1678.43 sec17752.7717836.00145.2440568.63
32147.48 sec17074.8417241.30114.5125777.90

我們可以看到隨著隱狀態(tài)數(shù)的增加:

  1. 模型的擬合誤差不斷減小
  2. AIC和BIC指數(shù)不斷上升
  3. 對(duì)數(shù)似然也越來越大
  4. 但是模型訓(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é)果:

截屏2024-07-01 21.56.32

可以看到單只股票建模相對(duì)誤差率為3.1%,我們以AAPL與BAC、AAPL與C為例訓(xùn)練模型,得到的預(yù)測(cè)效果如下圖所示:

截屏2024-07-01 21.56.58

觀察上兩圖知,多支股票數(shù)據(jù)訓(xùn)練出來的模型效果不如單支股票的效果,且由相關(guān)性分析知,相關(guān)性越大的兩支股票組成的數(shù)據(jù)訓(xùn)練出的模型有更好的預(yù)測(cè)效果。不過這里面的原因可能比較復(fù)雜,有可能有負(fù)遷移的影響,不相關(guān)的股票數(shù)據(jù)導(dǎo)致共同建模效果反而不好。

http://www.risenshineclean.com/news/58186.html

相關(guān)文章:

  • 做網(wǎng)站跟app的區(qū)別營(yíng)銷策劃公司排行榜
  • 自己做的網(wǎng)站怎么設(shè)置文件下載國(guó)外免費(fèi)網(wǎng)站服務(wù)器
  • 怎樣做企業(yè)手機(jī)網(wǎng)站seo二級(jí)目錄
  • 網(wǎng)站點(diǎn)擊量怎么看關(guān)鍵詞排名批量查詢
  • 云客服系統(tǒng)合肥百度搜索優(yōu)化
  • 6黃頁網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣公司主要做什么
  • 站點(diǎn)建錯(cuò)了網(wǎng)頁能打開嗎seo還有用嗎
  • 網(wǎng)站html地圖怎么做百度廣告競(jìng)價(jià)
  • 全椒做網(wǎng)站seo專業(yè)培訓(xùn)
  • 網(wǎng)站建設(shè)內(nèi)容和功能的介紹做百度推廣銷售怎么找客戶
  • 中山比好的做網(wǎng)站的公司企業(yè)官網(wǎng)
  • 自己買主機(jī)可以做網(wǎng)站嗎濟(jì)南seo小黑seo
  • 建設(shè)網(wǎng)站公司價(jià)格2024年將爆發(fā)新瘟疫
  • 做網(wǎng)站的榮譽(yù)證書推廣運(yùn)營(yíng)公司哪家好
  • 專門做詳情頁的網(wǎng)站google海外版
  • 男女做那種的視頻網(wǎng)站百度平臺(tái)客服聯(lián)系方式
  • 馬鞍山建設(shè)機(jī)械網(wǎng)站seo優(yōu)化網(wǎng)站的注意事項(xiàng)
  • 手機(jī)免費(fèi)制作ppt的軟件下載谷歌seo一個(gè)月費(fèi)用需要2萬嗎
  • 佳木斯城鄉(xiāng)建設(shè)局官方網(wǎng)站seo排名專業(yè)公司
  • wordpress建站專家網(wǎng)絡(luò)營(yíng)銷需要學(xué)什么
  • 建設(shè)網(wǎng)站的策劃書最強(qiáng)大的搜索引擎
  • 網(wǎng)站設(shè)計(jì)的原則有哪些互聯(lián)網(wǎng)營(yíng)銷的方法
  • 軟件和網(wǎng)站開發(fā)seo專家是什么意思
  • 做網(wǎng)站ie緩存重慶seo團(tuán)隊(duì)
  • 工廠做網(wǎng)站有用嗎廊坊seo外包
  • 定州網(wǎng)站制作營(yíng)銷網(wǎng)站建設(shè)網(wǎng)站開發(fā)
  • dedecms 網(wǎng)站搬遷 模板路徑錯(cuò)誤杭州網(wǎng)站推廣公司
  • 什么是平臺(tái)內(nèi)部營(yíng)銷論壇seo設(shè)置
  • 功能分類模塊類型網(wǎng)站做整站優(yōu)化
  • 墻繪做網(wǎng)站靠譜不xp優(yōu)化大師