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

     주식에서 일정 주기로 시세가 변동 하는 주식은  박스를 그려서 분석 할 수 있다.  하지만,  박스를 그려서 분석 할 수 있는 주식이 그다지  많지 않다.  

시작에서 충격(Ex 코로나 팬더믹) 받지 않은 이상은 박스를 그려서 분석 할 수 있는 주식이 있는데,  "대상"이라는 주식이  내가 찾은 유일한 주식인 것 같다. 

히든 마르코프는 그리프 구간별로  state(상태) 값을 구분 지을 수 있는데,   이것에 대한 도메인 지식을 확실 하게 알면,  상태 값과,   상태의 구간 별 숫자를 알 수 있다.

  히든 마르코프는  목적을 어디냐 에 따라 다른데,  주식이라면  수익이 목적일 것이다.  

그러면,  어느 구간 때 구입 할 것이고, 팔 것 인지,  본인이 정하면 된다.   물론 여기에서는 가격과 주기가 있는데,   가격도 봐야 하고 주기도 봐야 한다. 

지금 포스트에서는 가격적인 측면만 보고 다음 포스트에서는  주기를 보고 시뮬레이션 하는 방법에 대해 살펴 보겠다.    

  본 포스트는  통계 패키지 R에서 제공하는 "depmixS4" 위주로 설명할 것이기 때문에,  별도의 이론적인 지식을 보려면 아래 페이지를 클릭 하여야 한다. 

https://rdmkyg.blogspot.com/2021/08/blog-post_25.html


 앞에서와 같이 주식을 불러온다.   주식을 불러올때는 "tqk" 패키지에서 불러온다.  "tqk"는 한국주식을 가져오는 패키지로서  주로 팍스넷을 크롤링 하기 때문에 속도가 늦다. 

# 패키지 불러오기 
  set.seed(1004)
  require(depmixS4)
  require(ggplot2)
  require(dplyr)
  require(tqk)
  require(forecast)
  require(stats)
# 주식 가져오는 함수 
  data_get_fun <- function(days, stock_code){  
    
    # Data get from tqk 
    stock <- tqk_get(stock_code, from= days)  
    stock$종목코드 <- stock_code
    
    # R은 데이터를 가져와 전저리 할때 단순함      
    stock <-   stock %>% 
      arrange(date) %>% 
      mutate(전일비 = c(NA,  diff(adjusted))) %>% 
      filter(!is.na(전일비)) %>% 
      mutate(전일시세 = adjusted - 전일비) %>% 
      mutate(등락율 =  round((adjusted - 전일시세)/전일시세 * 100, 2))
    
    return(stock)
  }
  
  
# 분석 시작하고 싶은 일자  
  days = as.Date("2020-06-01")
  
# 대상 분석 
  daesang <- data_get_fun(days ,"001680")
 위와 같이  미리 R에서 정의 한  함수를 이용하여, 주식 시세 데이터를 가지고 온다.   

데이터를 가져왔으면,  아래와 같이 "대상(001680)" 주식의 그래프 패턴을 본다. 

대상 주식 패턴


그러면 아래와 같이  HMM 모형을 돌리고 모델 결과를 보자. 
# HMM 상태 코드 찾기  
  hmm.model <- depmix(adjusted ~1, family = gaussian(),
                      nstates = 5, data = daesang
                      )
  model.fit <- fit(hmm.model)
  post_probs <- posterior(model.fit)
HMM 모델을 잡고 fitting 화 한 다음에  posterior probability (사후확률)을 구하는 것이  posterior() 함수 이다. 

아래는 모델결과를 보는 명령어이다.  특정 구간의 state(상태) 값을 볼 수 있다.  물론 이것에 대한 결정은  도메인 날리지(domain knowledge)가 풍부한 사람이 경험적인  휴리스틱 (heuristic) 방법론에 의해 결정 해야 하는 것이 매우 현실적이다. 

# 모델 결과 보기  
  attr(model.fit, "response")    
## [[1]]
## [[1]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients: 
## (Intercept) 
##    26214.43 
## sd  341.936 
## 
## 
## [[2]]
## [[2]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients: 
## (Intercept) 
##    25369.94 
## sd  133.1958 
## 
## 
## [[3]]
## [[3]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients: 
## (Intercept) 
##    24861.77 
## sd  308.4827 
## 
## 
## [[4]]
## [[4]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients: 
## (Intercept) 
##    27376.15 
## sd  462.7684 
## 
## 
## [[5]]
## [[5]][[1]]
## Model of type gaussian (identity), formula: adjusted ~ 1
## Coefficients: 
## (Intercept) 
##     28768.2 
## sd  659.8739

  위에 노란 색 음영부분의 상태(state)는 매수 구간이고,  갈색 음영 상태(state)는 매도 구간이다.   어느 구간을 결정 할 것 인지에 대한 결정은 사람의 몫이다.    즉 4~6 개월 마다 10%의 이익을 취해서,   년간  20%의 이익을 취할 수 있는 모형이 나온다.    년간 2번~3번 거래 정도이다.  엄청난 이익률이다.  

 물론 아래와 같이 state의 색을 바꾸어서 그래프를 그려서 볼 수 있다. 

# group 그리프를 그리기 위한 데이터 프레임 작업
  df <-   data.frame( date =  daesang$date, 
                adjusted = daesang$adjusted,
                state = post_probs$state)
  
# 그래프 모양 보기  
  df %>% 
    ggplot(aes(x = date, y = adjusted, color = state)) +
    geom_line()
대상  은닉 마르코프 그래프 (HMM)

state가 5일 때 팔고,   중간색인 state가 3일 때 팔고,     1%의 세금과 수수료를 떼고,  11% 이상되는 수준에서,  매도 포지션을 취하는 것이 제일 좋다고 생각된다.  

물론 이것은  가우시안  즉 정규분포를 따지는 것이기 때문에,  박스권을 유지할   유의확률 95%은  항상 존재 하니,   유의 하여야 한다.  








댓글 없음:

댓글 쓰기

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

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