데이터 셋과 모형에 대한 기초적인 지식만 있어도 실제로 모델 돌리는 것은 어렵지 않다. 하지만, 이것을 해석 하는 문제는 다른 문제이다. 아래 페이지에 이것을 해석하는 것과 그 동안의 소스 코드를 모아 놓았다.
https://rdmkyg.blogspot.com/2021/09/hmm-4.html
HMM 한개에 여러개 이미지 그리기 |
위의 그림을 보면 녹색 저점이 구입하는 지점이고, 녹색 고점이 판매하는 지점이다. 앞에서 소스 코드를 모두 확보 하였다면, 어느 정도 시뮬레이션이 가능 하다.
우리가 관심 있어 하는 부분은 언제 매수해서 매도 하는 것이 가장 큰 수익을 얻을 수 있는지, 그리고 월/년간 수익률이 얼마나 되는지 알고 싶은 것이다.
위의 그래프를 보면 수익이 나는 시점은 정형적으로 나타나지 않는다. 직관적으로 보았을때, 수익은 3~6개월에 한번 씩 나타난다.
따라서 위의 그래프를 해석된 내용은 파악 하기 위해서는 state별 데이터 값의 계수를 가지고 와서 분석 해야 한다.
※ state 값 해석 시 주의 사항
HMM 모델은 시장 상황에 따라 동적으로 변화하는 시스템 이므로, state의 값은 조회 시마다 바뀐다. 만약에 위의 종목이 어느 정도의 사이클을 가지고 있지 않으면 HMM 모형의 진단은 매우 어렵다.
여기에서 계수(coefficients)란 무엇인가? 계수는 아래 그림과 같이 1차 방정식에 계수가 설명 되어 있다.
진단 하기 전에, 이것을 데이터 프레임으로 만들어 데이터를 볼 수 있다, 하지만 data.frame에서 for 문을 돌리게 되면, 코드도 복잡해지고, 속도도 느리다.
따라서 R에서 데이터 모델 결과를 전처리 함에 있어서, sapply 개념을 조금 알고 있어야 한다. R에서 apply의 개념은 for 문을 대체 하는 기술이다. 아래와 같이 apply Family 계열은 사용하는 이유가 그것에 대한 개념을 잘 알면, for문보다 코드를 간단 하게 짤 수 있다는 것과, 행렬 연산을 하여 속도가 매우 빠르다는 것이다.
나는 매우 복잡하고 큰 프로젝트만 하였으므로, 복잡하고 큰 프로젝트 위주로 코드를 짤 예정 이다.
아래의 코드는 앞에서 사용하였던 파라미터의 모델 결과를 데이터 프레임으로 표현하는 코드이다.
모형의 결과는 아래와 같다.
# 모델 결과 보기
attr(model.fit, "response")
## [[1]]
## [[1]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients:
## (Intercept)
## 24365.78
## sd 310.3668
##
##
## [[2]]
## [[2]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients:
## (Intercept)
## 25385.41
## sd 145.9502
##
##
## [[3]]
## [[3]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients:
## (Intercept)
## 24983.22
## sd 148.0989
##
##
## [[4]]
## [[4]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients:
## (Intercept)
## 26319.1
## sd 386.9052
##
##
## [[5]]
## [[5]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients:
## (Intercept)
## 27936.08
## sd 808.3532
모형의 state 1~5까지 나열 되어 있는데, 이것에 대한 Coefficients (계수) 및 sd(표준편차)를 데이터 프레임으로 만들어야 한다.
데이터 프레임으로 만들기 위해 모델 결과를 list 포멧의 파일로 만든다.
# 모델의 결과 list 포멧 구하기
restult_list <- attr(model.fit, "response")
# 리스트의 갯수를 구하고
length(restult_list)
## [1] 5
위에서 리스트의 갯수를 구하는 것은 state 의 숫자를 구하는 것이다.
아래와 같이 파라메터를 구하기 위해서 함수를 만든다. 파라메터를 찾기 위해서는 R studio에서 리스트 구조를 봐야 한다.
# 파라미터 구하기 (coefficients) 계수 구하기
state_fun <- function(i){
state <- i
coeff <-as.double(restult_list[[i]][[1]]@parameters[["coefficients"]])
sd <- as.double(restult_list[[i]][[1]]@parameters[["sd"]])
df1 <- data.frame(
state, coeff, sd
)
return(df1)
}
state 값 만큼 함수를 돌릴 것이기 때문에 1:5까지의 vector를 만든다.
i <- 1:length(restult_list)
sapply를 돌리면 아래와 같이 행렬 값이 나온다.
# 행렬값이 나왔다.
sapply(i, state_fun)
## [,1] [,2] [,3] [,4] [,5]
## state 1 2 3 4 5
## coeff 24365.78 25385.41 24983.22 26319.1 27936.08
## sd 310.3668 145.9502 148.0989 386.9052 808.3532
위와 같은 행렬값(matrix)이 나오면, data.frame으로 바꾸었을때, 데이터 관리 하기가 어렵다. 따라서, 이러한 결과가 나오면, 행렬값(matrix) 값을 바꾸는 Transpose 작업을 해주어야 한다.
# sapply 결과를 행렬 Transpose를 한다.
t(sapply(i,state_fun))
## state coeff sd
## [1,] 1 24365.78 310.3668
## [2,] 2 25385.41 145.9502
## [3,] 3 24983.22 148.0989
## [4,] 4 26319.1 386.9052
## [5,] 5 27936.08 808.3532
Transpose 값을 이용하여 데이터 프레임을 아래와 같이 만든다.
# sapply 함수를 t를 이용해서, 행렬 Transpose를 하여, 데이터 프레임을 만든다.
state_df <- as.data.frame(t(sapply(i,state_fun)))
위의 소스 코드를 전부 돌리면, data.frame으로 된 파라메터 값을 받을 수 있다. state의 갯수가 문제가 되었다는 것을 모델을 돌리고 나서 알게 되게 된다. 그러니까 실제로 어느시점에서 매입 할것인지 결정하는 과정에서 문제가 생겼는데, 즉 앞에서 분석이 Miss가 나거나, 아니면 다른 시점에서 분석 하였을 가능 성이 크다. 아래를 클릭 해보자.
즉 앞에서 분석 할때는 매입에는 별로 신경을 쓰지 않은 그래픽 분석 이였다.
위의 state별 결과 값을 보면, 1번 state에서 매입을 하여야 할지, 3번 state에서 매입을 할지 알 수가 없다. 아래 그림을 보면 1~3번의 state은 분포에서 매수 타이밍을 노릴 수 있는데, 이건은 다음 화에서, state 갯수를 어떻게 최적화 시킬지에 대한 알고리즘을 정리할 예정 이다.
댓글 없음:
댓글 쓰기