은닉 마르코프 모델 HMM의 적합 과정은 매우 복잡하다. 그러나 R 에는 이를 구현할 여러가지 패키지가 존재 한다. 여기서는 depmixS4 패키지로 작업 하겠다. 다음 코드를 사용해 적절한 시계열을 만든다.
## 시드값을 설정 했음 유의. 동일 시드값을 설정하면
## 항상 같은 난수가 발생 하므로 같은 결과를 얻을 수 있다.
set.seed(123)
## 표현하려는 시장 상태 네 개에 대한 분포 파라메터 설정
bull_mu <- 0.1
bull_sd <- 0.1
neutral_mu <- 0.02
neutral_sd <- 0.08
bear_mu <- -0.03
bear_sd <- 0.2
panic_mu <- -0.1
panic_sd <- 0.3
## 쉬운 색인을 위해 상기 파라미터를 벡터에 담아 둔다.
mus <- c(bull_mu, neutral_mu, bear_mu, panic_mu)
sds <- c(bull_sd, neutral_sd, bear_sd, panic_sd)
## 시계열이 생성할 내용에 대한 일부 상수를 설정 한다.
NUM.PERIODS <- 10
SMALLEST.PERIOD <- 20
LONGEST.PERIOD <- 40
## 확률적으로 일련의 일수 (day count)를 결정 한다.
## 이때 각 일수는 한번의 '실행' 또는 시장의 한상태를 나타낸다.
days <- sample(SMALLEST.PERIOD:LONGEST.PERIOD, NUM.PERIODS, replace =TRUE)
## days 벡터의 각 일수에 대해 특정 시장 상태를 가진
## 시계열을 생성하고 이를 전체 시계열에 추가한다.
returns <- numeric()
true.mean <- numeric()
for(d in days){
idx = sample(1:4, 1, prob = c(0.2, 0.6, 0.18, 0.02))
returns <- c(returns, rnorm(d, mean= mus[idx], sd =sds[idx]))
true.mean <- c(true.mean, rep(mus[idx], d))
}
샘플이 포괄하는 날 중 몇 일이 상태 추적에 사용하는 변수인 true.mean에 해당하는지 확인해 생성된 시계열의 모양과 각 상태의 빈도를 파악 할 수 있다.
## R
table(true.mean)
## true.mean
## -0.03 0.02 0.1
## 66 142 111
이런! 시뮬레이션된 계열에 네 개의 상태를 포함하려고 했던 의도와는 다르게 세 개만 포함 되었다. 이는 네 번째 상태 포함 가능성(0.2)이 매우 낮아서 일 수 있다. 가장 가능성이 낮은 상태는 계열에 포함될 선택조차 받지 못한 것이다. 주어진 시계열에서 실제로 모든 상태가 포함될 선택조차 받지 못한 것이다. 주어진 시계열에서 실제로 모든 상태가 포함될지를 항상 알 수 있는 것은 아니다. 이는 HMM의 적합이 어려울 수 있으며 알고리즘이 다소 공정치 못할 수 있는 이유이기도 하다. 그렇지만 우리는 네 개의 그룹을 지정 한 채 분석을 진행하여 무엇을 얻을 수 있는지 확인해 보겠다.
여전히 HMM을 적합시키는 과정이 남았다. HMM의 결과는 원하는 만큼 많은 상태 중 각 상태에 대한 사후 확률의 시계열을 제공한다. 이는 앞서 설명한 EM 알고리즘과 일관성을 가진다. 즉 추정상태의 수만 지정해 주고, 나머지는 반복과정을 통해 점진적으로 결정한다.
종종 그렇듯이 적절한 패키지의 사용은 작성해야 하는 코드의 양적인 측면에서 분석의 어려운 부분을 꽤 쉽게 만들어 줍니다.
그리고 여기에서는 R의 depmisS4 패키지를 사용합니다. 모델은 두 단계로 적합된다. 우선 예상 분포, 상태 개수, 적합에 사용될 입력 데이터 등이 depmix()함수로 지정된다. 그런 다음 fit 함수를 통해 모델이 적합 된다. 이 때 fit 함수를 통해 모델이 적합된다. 이때 fit 함수에는 모델 사용에 대한 내용이 전달되어야 한다.
마지막으로 posterior() 함수를 사용하여 적합된 모델로 부터 상태 레이블에 대한 사후 분포를 생성한다. 이 시점에서 모델 자체는 이미 적합된 것이라서 상태 분포 및 전환 확률을 묘사하는 파라미터는 추정되었기 때문에 데이터 레이블링 하는 별도의 작업이다.
## R
require(depmixS4)
hmm.model <- depmix(returns ~ 1, family = gaussian(),
nstates = 4, data = data.frame(returns = returns)) model.fit <- fit(hmm.model)
post_probs <- posterior(model.fit)
상기 코드에서는 관측 데이터로 returns벡터를 제공하여 hmm.model을 생성한다. 또한 상태의 개수(4)를 지정하고, family 파라미터를 통해 방출 확률이 가우스 분포를 따른다는 것을 지정한다. 그 다음 fit() 함수로 모델을 적합시켰으며, posterior() 함수로 사후 확률을 계산 했다. 사후 확률은 적합 과정에서 결정된 모델의 파라미터에서 특정 시간에서의 특정 상태에 대한 확률을 제공한다.
그러면 이제 다음과 같이 측정된 값으로 상태를 시각화 할 수 있다.
## R
plot(returns, type = "l", lwd = 3, col =1,
yaxt = "n", xaxt ="n", xlab = "", ylab = "", ylim = c(-0.6, 0.6))
x <- 0 : length(returns)-1
lapply(x, function(i){
## 특정 시간 단계 동안의 상태를 나타내며
## 적절한 생상의 사각형을 배경에 추가 한다.
rect(i, -0.6,(i+1), 0.6,
col = rgb(0.0, 0.0, 0.0,
alpha = (0.2 * post_probs$state[i +1])), border = NA)
})
이 도표의 배경은 개별 상태를 나타내고, 검은색 실선은 실제값을 나타낸다. 흰색의 수직선은 네 상태 중 가장 희귀한 것으로 추정된 시간을 나타내는 매우 좁은 조각이다. HMM 분석 |
속성을 통해 모델이 결정한 가정 분포의 파라미터에 대한 정보를 접근할 수 있다. 원본 데이터를 생성한 다음의 파라미터를 염두에 두고 해당 정보를 확인 해 보자.
## 표현하려는 시장 상태 네 개에 대한 분포 파라메터 설정
bull_mu <- 0.1
bull_sd <- 0.1
neutral_mu <- 0.02
neutral_sd <- 0.08
bear_mu <- -0.03
bear_sd <- 0.2
panic_mu <- -0.1
panic_sd <- 0.3
데이터에 실제로 존재하는 상태들과 비교해보면 (패닉 체제는 적합된 데이터에 포함되지 않았음을 기억하세요.) 다음의 그룹들이 상관관계를 갖는다는 것을 확인 할 수 있다.
attr(model.fit, "response")
## [[1]]
## [[1]][[1]] ## 우현히 패닉 체계와 가까운 평균을 가진다.
## 그러나 사실 패닉 체제는 적합된 샘플의 데이터를 생성하지 않았다.
## Model of type gaussian (identity), formula: returns ~ 1
## Coefficients:
## (Intercept)
## 0.09774445
## sd 0.1040073
##
##
## [[2]]
## [[2]][[1]] ## 시장의 약세 체계와 일관성을 가진다.
## Model of type gaussian (identity), formula: returns ~ 1
## Coefficients:
## (Intercept)
## -0.0610505
## sd 0.2018184
##
##
## [[3]]
## [[3]][[1]] ## 시장의 매수세 체제와 일관성을 가진다.
## Model of type gaussian (identity), formula: returns ~ 1
## Coefficients:
## (Intercept)
## 0.1412881
## sd 0.03796197
##
##
## [[4]]
## [[4]][[1]] ## 시장의 중립체제와 어느 정도 일관성을 가진다.
## Model of type gaussian (identity), formula: returns ~ 1
## Coefficients:
## (Intercept)
## 0.001911518
## sd 0.05601123
적합된 결과가 기존 은닉 상태와 잘 맞지 않는 이유는 적절한 전환 행렬을 사용하지 않았기 때문이다. 상태 간 전환은 적절한 마르코프 과정이 아니라 적합에 영향을 줄 수 있다. 또한 상태 간 전환이 적고, 상대적으로 짧은 시계열에 대해 적합을 수행 했다. 그러나 HMM은 더 많은 상태 간 전환을 관찰 하거나 추론할 수 있는 긴 시계열에서 성능이 더 좋다.
이 기술을 사용하여 실제 데이터에 적합시킬 준비를 한다면 현실적인 합성 데이터로 제안된 HMM을 시도해보는 것이 좋다. 대부분의 실제 데이터에서 상태를 관측 불가능한 것으로 상정하므로 프로젝트를 야심차게 준비하기 전에 통제된 설정(합성 데이터의 사용)에서 모델 성능 한계에 대해 고민해 봐야 한다.
HMM은 다양한 종류의 데이터를 분석하는데 적합하다. 현재 금융시장이 성장기인지, 불황기인지를 모델링하고 세포 내의 단백질 폴딩이 어느 단계에 있는지 결정하며 (딥러닝이 도래 하기 전) 사람의 움직임을 설명하는데 사용했다. 이러한 모델은 예측하기보다 시스템의 역동성을 이해하는 데 더 자주 유용하게 사용된다. 또한 HMM은 단순한 포인트 추정이나 예측 이상을 제공한다. 마지막으로 HMM을 적합시키는 데 상태의 개수를 지정하는 등 시스템에 대한 사전 지식을 모델로 주입할 수 있다. 이러한 방식을 통계학적 방법의 이점을 얻을 수 있을 뿐만 아니라 시스템에 대한 사전 지식을 파라미터화 할 수 있는 파라미터도 갖게 된다.
HMM에 적용된 수학과 계산은 꽤 흥미롭고 접근성이 좋다. HMM이 데이터에 적합되는 가장 일반적인 방식으로 다양한 프로그래밍 기법과 수치 최적화 알고리즘 numerical optimization algorithms을 쉽게 배울 수 있다. 또한 데이터 과학자나 소프트웨어 엔지니어 모두에게 유용한 동적 프로그래밍 기법도 배울 수 있다.
칼만 필터와 마찬가지로 HMM은 다양한 작업에 사용된다. 사실 HMM 시스템과 관련된 다양한 추론 문제는 각자 방출 확률을 가진 개별 상태의 증가하는 복잡성 때문에 훨씬 더 복잡하다. HMM을 사용할 때 다음과 같은 몇 가지 추론 작업에 직면 할 수 있다.
- 관측의 계열을 생성하는 상태들의 가장 가능성 있는 설명을 결정 한다. 한 상태가 다른 상태로 이어질 가능성을 설명하는 전환 행렬 뿐만 아니라 각 상태에 대한 방출 확률을 추정하는 것과 연관되어 있다. 여기에서는 전환확률을 명확하게 설명하지는 않지만, 우리가 수행한 작업에 포함 된다.
- 관측의 계열, 상태에 대한 설명, 각 상태의 방출과 전환 확률을 통해 가장 가능성이 높은 상태의 연속적인 순서를 결정한다. 또한 직전에 수행한 작업 일부에 포함된다. '가장 가능성이 높은 설명'이라고도 하며 비터비 알고리즘으로 계산 한다.
- 필터링과 평활화이다. 필터링은 가장 최근의 관측이 주어졌을 때 가장 최근의 시간 단계에서의 은닉 상태를 추정하는 것에 해당 한다. 그리고 평활화는 특정 시간 단계의 이전 , 현재, 이후에 대한 관측을 토대로 해당 시간 단계의 은닉 상태에 대한 가장 가능성 있는 분포를 경정하는 것에 해당 한다.
# 참고 서적 : 실적 시계열 분석 - 한빛 미디어
Hello! greeting from korea
답글삭제thank you
삭제