R語言馬爾可夫體制轉換模型Markov regime switching

原文鏈接:http://tecdat.cn/?p=12280


 

總覽

本文簡要介紹了一種簡單的狀態切換模型,該模型構成了隱馬爾可夫模型(HMM)的特例。這些模型適應時間序列數據中的非平穩性。從應用的角度來看,這些模型在評估經濟/市場狀態時非常有用。這裏的討論主要圍繞使用這些模型的科學性。

基本案例

HMM的主要挑戰是預測隱藏部分。我們如何識別“不可觀察”的事物?HMM的想法是從可觀察的事物來預測潛在的事物。

模擬數據

爲了演示,我們準備一些數據並嘗試進行反向推測。通過構造,我強加了一些假設來創建我們的數據。每個狀態都具有不同的均值和波動率。

library(knitr)
library(kableExtra)
library(dplyr)
theta_v <- data.frame(t(c(2.00,-2.00,1.00,2.00,0.95,0.85)))
names(theta_v) <- c("$\\mu_1$","$\\mu_2$","$\\sigma_1$","$\\sigma_2$","$p_{11}$","$p_{22}$")
kable(theta_v, "html", booktabs = F,escape = F) %>% 
        kable_styling(position = "center")
\(\ mu_1 \) \(\ mu_2 \) \(\ sigma_1 \) \(\ sigma_2 \) \(p_ {11} \) \(p_ {22} \)
2 -2 1個 2 0.95 0.85

如上表所示,狀態\(s = 2 \)變成“壞”狀態,其中過程\(x_t \)表現出較高的變化性。 因此,停留在狀態2的可能比停留在狀態1的可能性小。

馬爾可夫過程

爲了模擬過程\(x_t \),我們從模擬馬爾可夫過程\(s_t \)開始。爲了模擬\(T \)期間的過程,首先,我們需要構建給定\(p_ {11} \)和\(p_ {22} \)的轉換矩陣。其次,我們需要從給定狀態\(s_1 = 1 \)開始。從\(s_1 = 1 \)開始,我們知道有95%的概率停留在狀態1,有5%的概率進入狀態2。

p11 <- theta_v[1,5] 
p22 <- theta_v[1,6]
P <- matrix(c(p11,1-p22,1-p11,p22),2,2)
P[1,]
## [1] 0.95 0.05

模擬\(s_t \)是遞歸的,因爲它先前先前的狀態。因此,我們需要構造一個循環:

set.seed(13)
T_end <- 10^2

s0 <- 1 
st <- function(i) sample(1:2,1,prob = P[i,])

s <- st(s0)
for(t in 2:T_end) {
  s <- c(s,st(s[t-1]))
}
plot(s, pch = 20,cex = 0.5)

上圖說明了過程\(s_t \)的持久性。在大多數情況下,狀態1的“實現”多於狀態2。實際上,這可以由固定概率確定,該固定概率由下式表示:

P_stat[1,]
## [1] 0.75 0.25

因此,經歷時間的流逝,有15%的概率處於1狀態,而有25%的概率處於狀態2。這應該反映在模擬過程中  s,從而

mean(s==1)
## [1] 0.69

由於我們使用的是100個週期的小樣本,因此我們觀察到穩定概率爲69%,接近但不完全等於75%。

結果

給定模擬的馬爾可夫過程,結果過程的模擬非常簡單。一個簡單的技巧是模擬\(x_t \ mid s_t = 1 \)的\(T \)週期和\ (x_t \ mid s_t = 2 \)的\(T \)週期。然後,給定\(s_t \)的模擬,我們針對每個狀態創建結果變量\(x_t \)。

plot(x~t_index, pch = 20)
points(x[s == 2]~t_index[s==2],col = 2)

雖然總體而言時間序列看起來是平穩的,但我們觀察到一些週期(以紅色突出顯示)顯示出較高的波動。有人可能會建議說,數據存在結構性中斷,或者體制發生了變化,過程\(x_t \)變得越來越大,帶有更多的負值。雖然如此,事後解釋總是比較容易的。主要的挑戰是識別這種情況。

估計參數

在本節中,我將使用R軟件手動(從頭開始)和非手動進行統計分解。在前者中,我將演示如何構造似然函數,然後使用約束優化問題來估計參數。我將說明如何在不經歷解析推導的情況下進行復制。

似然函數-數值部分

首先,我們需要創建一個以\(\ Theta \)向量爲主要輸入的函數。其次,我們需要設置一個返回MLE的優化問題。

在優化似然函數之前。讓我們看一下工作原理。假設我們知道參數\(\ Theta \)的向量,並且我們有興趣使用\(x_t \)上的數據評估隱藏狀態隨時間的變化。

\(t \) \(\ xi_ {t \ mid t,1} \) \(\ xi_ {t \ mid t,2} \)
1 0.878 0.122
2 0.982 0.018
3 0.887 0.113
4 0.875 0.125
5 0.318 0.682
6 0.000 1.000

顯然,這兩種狀態的每次過濾器的總和應爲1。看起來,我們可以處於狀態1或狀態2。

all(round(apply(Filter[,-1],1,sum),9) == 1)
## [1] TRUE

由於我們設計了此數據,因此我們知道狀態2的時期。

plot(Filter[,3]~t_index, type = "l", ylab = expression(xi[2]))
points(Filter[s==2,3]~t_index[s==2],pch = 20, col = 2)

 

過濾器背後的優點是僅使用\(x_t \)上的信息來識別潛在狀態。我們觀察到,狀態2的過濾器主要在狀態2發生時增加。這可以通過發出紅點的概率增加來證明,紅點表示狀態2發生的時間段。儘管如此,上述還是存在一些重大問題。首先,它假定我們知道參數\(\ Theta \),而實際上我們需要對此進行估計,然後在此基礎上進行推斷。其次,所有這些都是在樣本中構造的。從實際的角度來看,決策者對預測的概率及其對未來投資的影響感興趣。

手動估算

爲了優化上面定義的  HMM_Lik 功能,我將需要執行兩個附加步驟。首先是建立一個初始估計值,作爲搜索算法的起點。其次,我們需要設置約束條件以驗證估計的參數是否一致,即非負波動性和介於0和1之間的概率值。

第一步,我使用樣本創建初始參數向量\(\ Theta_0 \)

在第二步中,我爲估算制定了約束

請注意,參數的初始向量應滿足約束條件

all(A%*%theta0 >= B)
## [1] TRUE

最後,回想一下,通過構建大多數優化算法都可以搜索最小點。因此,我們需要將似然函數的輸出更改爲負值。

## $par
## [1]  1.7119528 -1.9981224  0.8345350  2.2183230  0.9365507  0.8487511
## 
## $value
## [1] 174.7445
## 
## $counts
## function gradient 
##     1002       NA 
## 
## $convergence
## [1] 0
## 
## $message
## NULL
## 
## $outer.iterations
## [1] 3
## 
## $barrier.value
## [1] 6.538295e-05

爲了檢查MLE值是否與真實參數一致,我們繪製估計值與真實值的關係圖:

plot(opt$par ~ theta_known,pch = 20,cex=2,ylab="MLE",xlab = "True")
abline(a=0,b=1,lty=2)

 

 

總體而言,我們觀察到估計值非常一致,由於MLE的一致性屬性,這不足爲奇。

估算 

我將在下面演示如何使用r軟件複製人工估算的結果  。

如果我們要忽略過程中的任何體制轉換,我們可以簡單地將參數\(\ mu \)和\(\ sigma \)估計爲

kable(mod_est, "html", booktabs = F,escape = F) %>% 
        kable_styling(position = "center")
\(\ hat {\ mu} \) \(\ hat {\ sigma} \)
0.6244574 2.198929

平均而言,我們應該期望過程平均值約爲1,即\(0.75 \ times 2 + 0.25 \ times(-1)= 1 \)。這是由總期望屬性定律得出的,其中我們知道\ [\ begin {equation} \ mathbb {E} [x] = \ sum _ {\ forall s} \ mathbb {E} \ left [x \ mid s \右] \ mathbb {P}(s)= \ sum _ {\ forall s} \ mu_ {s} \ pi_ {s} \ end {equation} \]

這樣

EX <- 0.75*2 + 0.25*-2
EX
## [1] 1

對於波動率,適用相同的邏輯。

EX2 <- (2^2 + 1^2)*0.75 + ((-2)^2 + 2^2)*0.25
VX <- EX2 - EX^2
sqrt(VX)
## [1] 2.179449

我們注意到,迴歸估計值與波動率的一致性高於均值。這主要是由於估算第一時刻與第二時刻的工作比較繁瑣。

上面的觀點是,估計值並未涵蓋數據的真實性質。如果我們假設數據是固定的,那麼我們錯誤地估計過程的平均值爲62%。但是,與此同時,我們通過構造知道該過程表現出兩個平均結果-一個正面和一個負面。波動性也是如此。

爲了揭示這些模式,我們在下面演示如何使用上面的線性模型部署狀態切換模型:

主要輸入是擬合模型,  mod我們將其歸納爲適應切換狀態。第二個  k是制度的數量。由於我們知道我們要處理兩個狀態,因此將其設置爲2。但是,實際上,需要參考一種信息標準來確定最佳狀態數。根據定義,我們有兩個參數,均值\(\ mu_s \)和波動率\(\ sigma_s \)。因此,我們添加一個true / false向量來指示正在切換的參數。在上面的命令中,我們允許兩個參數都切換。最後,我們可以指定估計過程是否正在使用並行計算進行。

要了解模型的輸出,讓我們看一下

## Markov Switching Model
## 
## 
##        AIC     BIC    logLik
##   352.2843 366.705 -174.1422
## 
## Coefficients:
##         (Intercept)(S)    Std(S)
## Model 1       1.711693 0.8346013
## Model 2      -2.004137 2.2155742
## 
## Transition probabilities:
##            Regime 1  Regime 2
## Regime 1 0.93767719 0.1510052
## Regime 2 0.06232281 0.8489948

上面的輸出主要報告我們嘗試手動估算的六個估算參數。首先,係數表報告了每個狀態的均值和波幅。模型1的平均值爲1.71,波動率接近1。模型2的平均值爲-2,波動率約爲2。顯然,該模型針對數據確定了兩種具有不同均值和波動率的不同狀態。其次,在輸出的底部,擬合的模型報告過渡概率。

plot(opt$par ~ theta_known,pch = 20,cex=2,ylab="MLE",xlab = "True")
points(theta_mswm~theta_known,pch = 1,col = 2, cex = 2,lwd = 2)
abline(a=0,b=1,lty=2)
legend("topleft",c("Manual","MSwM"), pch = c(20,1), col = 1:2)

有趣的是,就每種狀態的過濾器而言,我們將從包中檢索到的狀態與手動提取的狀態進行比較。根據定義,可以使用mod.mswm 對象上的圖函數  來了解平滑概率以及確定的方案。

par(mar = 2*c(1,1,1,1),mfrow = c(2,1))
plotProb(mod.mswm,2)

 

 

頂部的圖表示隨時間變化的過程\(x_t \),其中灰色陰影區域表示\(\ hat {\ xi} _ {T \ mid t,1}> 0.5 \)的時間段。換句話說,灰色區域表示狀態1佔優勢的時間段。

plot(x~t_index,type ="l",col = 0,xlim=c(1,100))
rect(xx-1,-10,xx,10,col = "lightgray",lty = 0)
lines(x~t_index)
points(x[s==2] ~ t_index[s==2],col = 1,pch = 20)

 

 

過濾器會在一個週期內檢測到第二種狀態。發生這種情況是因爲  plotProb 在這種情況下,返回的是平滑概率,即在實現整個樣本\(T \)後處於每種狀態的概率,即\(\ hat {\ xi} _ {t \ mid T,1} \ )。另一方面,來自手動估計的一個對應於推斷概率\(\ hat {\ xi} _ {t \ mid t,1} \)。

無論如何,由於我們知道狀態的真實值,因此可以確定我們是否處於真實狀態。我們在上面的圖中使用黑點突出顯示狀態2。總的來說,我們觀察到模型在檢測數據狀態方面表現非常出色。唯一的例外是第60天,其中推斷概率大於50%。要查看推理概率多長時間正確一次,我們運行以下命令

mean(Filter$Regime_1 == (s==1)*1)
## [1] 0.96

結束語

此過程似乎運行良好。然而,在實際數據實現方面仍然存在許多挑戰。首先,我們不具備有關數據生成過程的知識。其次,狀態不一定實現。因此,這兩個問題可能會破壞狀態切換模式的可靠性。在應用方面,通常部署此類模型以評估經濟或市場狀況。從決策上來說,這也可以爲策略分配提供有趣的應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章