시계열 분석 실전 사례 은닉 마르코프 HMM 모형 주식 분석 5편

   데이터 셋과  모형에 대한 기초적인 지식만 있어도  실제로 모델 돌리는 것은  어렵지 않다.  하지만, 이것을 해석 하는 문제는 다른 문제이다.  아래 페이지에 이것을 해석하는 것과  그 동안의 소스 코드를 모아 놓았다.    

https://rdmkyg.blogspot.com/2021/09/hmm-4.html

HMM 한개에 여러개 이미지 그리기


  위의 그림을 보면 녹색 저점이 구입하는 지점이고,  녹색 고점이 판매하는 지점이다.  앞에서 소스 코드를 모두 확보 하였다면,   어느 정도 시뮬레이션이 가능 하다. 

  우리가 관심 있어 하는 부분은  언제 매수해서 매도 하는 것이 가장 큰 수익을 얻을 수 있는지, 그리고 월/년간 수익률이 얼마나 되는지 알고 싶은 것이다. 

  위의 그래프를 보면 수익이 나는 시점은 정형적으로 나타나지 않는다.   직관적으로 보았을때,  수익은  3~6개월에 한번 씩 나타난다. 
 

따라서 위의 그래프를 해석된 내용은 파악 하기 위해서는 state별 데이터 값의  계수를 가지고 와서 분석 해야 한다. 

※ state 값 해석 시 주의 사항 
    HMM 모델은 시장 상황에 따라 동적으로 변화하는 시스템 이므로,  state의 값은 조회 시마다  바뀐다.   만약에  위의 종목이 어느 정도의 사이클을 가지고 있지 않으면 HMM 모형의 진단은 매우 어렵다.

  여기에서 계수(coefficients)란 무엇인가?   계수는 아래 그림과 같이 1차 방정식에 계수가 설명 되어 있다.   

계수 설명

HMM에서 각 State 별로  계수하고,  표준편차를 찾을 수 있다.   이것을 진단을 잘하면,  어느 포인트에서 매수 해서,  어느 포인트에서 매도 해야 할지 알 수 있다. 

  진단 하기 전에,  이것을 데이터 프레임으로 만들어 데이터를 볼 수 있다,  하지만 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 갯수를 어떻게 최적화 시킬지에 대한 알고리즘을 정리할 예정 이다. 
state 1~3번 분포가 헤깔린다. 




  



댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...