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)
##
## 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()
댓글 없음:
댓글 쓰기