시계열 분석 실전 사례 auto.arima로 주식 데이터분석 대상, nasdaq 100

    auto.arima 검정은 놀랍게도,  실험적으로  발견하는  heuristics 방법을 따르는 박스-젠킨스 방법에 비해, ARIMA 모델을  자동으로 정해 주기 때문에,  분석이 매우 용이하다.   이것은 R에 forecast에 패키지에 있으며,  사용법이 간단 하다.   

  시계열 분석의 중요도가 매우 높은 경우에는  데이터 시각화,  기반지식,  학습 파라에터 추정, 여러 가지 실험을 통해 모델을 평가 하여,  파라메터를 조정 하여야 한다. 

  하지만,  대용량의 데이터를 한꺼번에 분석 하여야 할 때, auto.arima는 매우 중요한 요소로 작동 할 수 있다.   

   초보들에게는 여러번 실험에서  박스-젠킨스 방법 보다는 auto.arima가 사용이나 결정 측면에서 더욱 좋다고 볼 수 있다.

실전 사례

   데이터를 추출하기 편하고,  저작권이 없는 주식 데이터를 비교해 보겠다.    

분석 데이터 종목 선정

 주식은 아래와 같이 2개의 데이터로 실험 할 예정이다.   
  • 대상(001680) :  조미료 미원,  종가집 김치, 청정원  대표 양념류를 만드는 식품 업체이다.식품 이외의 분야에 투자를 하지 않으면, 우리나라가 존재하는 한 망하지 않을 법한 회사이다.
  • Nasdap 100 (133690) :  미국 나스닥 100 이다.  지금 같은 4차 산업시대에 걸맞는 회사들로 모여져 있다.  아마도 계속 상승 추세로 갈 것 같다. 


데이터 추출 함수  

# library loading 
  library(tqk)
  library(dplyr)
  library(forecast)
  library(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)
}

 여기에서 대표적으로 사용하는 패키지는 tqk로 일반적으로  P 사에서 주식 데이터를 크롤링 하기 때문에,  데이터 로딩 속도가 매우 느리다.   사항에 따라서는 DB에서 가져오는 것이 빠를 수 있다.  하지만,  DB는 운영비가 들기 때문에 크롤링을 선택 한 것 같다. 

  tqk_get 함수를 이용하면,   시작 하고자 하는 일자하고,  종목코드를 넣으면, 데이터를 아주 간단하게 추출 할 수 있다.  

 tqk는  dplyr 과 함께 %<% 파이프 연산자를 사용할 수 있다. 

그리고 전일비를 계산 할때,  매우 간단한 방법이 있다.  diff 함수를 사용하여, 첫번째 값은 NA로 만들고,  전일 가격 데이터를 가져오는 것이다.

   필자가 진입할때는 for loop문을 사용해서 처리 하였는데,  속도가 매우 느렸다.   R에서 for loop 문은 속도를 느리게 하는 로직이다. 

   
그리고 아래와 같이 분석할 시간을 선택 하고, 종목 코드를 선택 하고,  함수에 값을 넣어 주면 값을 가져올 수 있다.
 
대상 분석  

# 분석 시작하고 싶은 일자  
  days = as.Date("2020-06-01")
  
# 대상 분석 
  daesang <- data_get_fun(days ,"001680")

일자는 코로나 팬더믹이 어느정도 안정화 되었을 시점 부터 하였다.  코로나 팬더믹을 포함해서 분석 하려면 다른 방식으로 해야 한다.   흔한 일은 아니지만,  주식 투자 하면서 흔들릴 수 있으므로,  어느 정도 대비 하여야 한다. 

 이번에는 대상을 실험해 보았다.  auto.arima 과정을 쓰면,  아주 쉽게  주식 데이터를 예측 할 수 있는지 볼 수 있다.
 
# 대상 분석 
  daesang <- data_get_fun(days ,"001680")
  
  est1 = auto.arima(daesang$adjusted, stepwise = FALSE )
  est1
## Series: daesang$adjusted 
## ARIMA(1,1,0) 
## 
## Coefficients:
##           ar1
##       -0.0161
## s.e.   0.0571
## 
## sigma^2 estimated as 214638:  log likelihood=-2334.7
## AIC=4673.4   AICc=4673.44   BIC=4680.87

ARIMA(1,1,0) 으로 파라미터를 피팅화 하였다.  주기의 순환과,  충격 함수의 영향을 받는 모형이다.  그래프를 보았을 때 순환으로 될 것 이라고 짐작 하였는데,   충격도 같이 보였다. 

아래와 같이 checkresiduals 함수에 모형을 대입 하면, 륭-박스 검정까지 모두 볼 수 있다. 

checkresiduals(est1)
auto.arima 모형 (대상)


## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,1,0)
## Q* = 8.8897, df = 9, p-value = 0.4475
## 
## Model df: 1.   Total lags used: 10

여기에서 중요하게 봐야할 것은  p-value 이다.   이것도 회귀 분석과  마찮가지로,  p-value 0.05 이하 일 경우만  예측을 할 수 있다.   0.05 이상 인 경우는 잔차 데이터 간의 시간적 상관관계가 없다는 귀무가설을 기각할 수 없기 때문에,   예측을 할 수 없다고 봐야 한다. 

est1 %>% forecast(h=100) %>% autoplot()  

대상 시계열 분석

nasdaq100 분석 

이것도 위의  대상과 마찮가지로  시작할 일자와, 주식 종목을 가져와서 추측 할 수 있다. 
 나스탁 100 주식  분석
  nasdaq <-  data_get_fun(days ,"133690")
  est = auto.arima(nasdaq$adjusted, stepwise = FALSE )
  est
## Series: nasdaq$adjusted 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##         drift
##       89.1812
## s.e.  46.6896
## 
## sigma^2 estimated as 675792:  log likelihood=-2511.9
## AIC=5027.8   AICc=5027.84   BIC=5035.27
  checkresiduals(est)
ARIMA(0,1,0)으로 추세와 충격만 반영 하였고, diff (차분)은 미반영 되었다. 
nasdaq 100 시계열 잔차 도표

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,1,0) with drift
## Q* = 20.872, df = 9, p-value = 0.01323
## 
## Model df: 1.   Total lags used: 10
p-value 가 0.05 이하로 나왔다.  이것은 예측을 할 수 있다. 하지만,  모든 것이 숫자의 예측으로만 이루어지지 않는 다는 것은 유의 하여야 한다. 

 est %>% forecast(h=100) %>% autoplot()
nasdaq 100 시계열 예측



댓글 없음:

댓글 쓰기

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

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