시계열 분석 실전 사례 은닉 마르코프 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%은  항상 존재 하니,   유의 하여야 한다.  








댓글 없음:

댓글 쓰기

[주식 클로드 자동매매 프로젝트] 제2편. 데이터 인프라 구축 — 모델보다 데이터가 먼저다

 머신러닝 모델을 이야기하기 전에, 그 모델이 먹는 데이터가 어디서 어떻게 왔는지부터 정직하게 밝혀야 한다. 이 프로젝트에서 가장 많은 시간이 들어간 부분은 화려한 모델 튜닝이 아니라, "내가 정말 그 데이터를 갖고 있는가"를 확인하...