본문 바로가기
시계열모델링

ARIMA 모형의 분석절차(확률적 모형분석)

by 다빈치스탁 2020. 10. 19.
728x90
반응형

시계열 자료는 추세, 계절, 백색잡음 등 다양한 요인이 중첩되어 결정된다. 이 때 각 요인들이 결합되어 고정적인 패턴을 나타내는 확정적 모형과 그렇지 않고 불규칙적인 패턴을 보이는 확률적 모형이 있다. 대표적인 확률적 시계열 패턴이 주가변동이다. 자 그렇다면 이렇게 확률적 모형을 분석하는 절차는 어떤 과정을 거치는가에 대해 알아보자.

 

1. 시계열자료의 안정성을 검정

2. 불안정 시계열일 경우 적절한 변환을 통해 안정적 시계열로 변환

3. 개연성 있는 예비모형을 산정해야 하는데 이때 acf, pacf cv 지표 혹은 auto.arima 프로그램을 이용할 수 있다.

4. 선정된 모형을 통해 추정 및 평가과정을 거친 다음 최종모형을 선정한다.

5. 예측에 대한 성능평가를 통해 최대한 현실에 가까운 모형을 도출한다.

 

#작업경로를 지정하는 명령어
setwd("")

mydatat<-read.csv("jisu.csv",
                  header=TRUE, na.strings = "")

#---1.시계열자료의 안정성을 검정.----
o=mydatat$코스피지수

#유의수준안에 들어오는게 하나도 없다.
acf(o)
#진동하는 스파이크 형태를 보이고 있다.
pacf(o)

#단위근 검정(대립가설)
#자료에 단위근이 존재한다. 
PP.test(o)

#로그차분을 수행.
do<-diff(log(o))

#단위근 검정(대립가설)
#자료에 단위근이 존재하지 않는다.
PP.test(do)


#---2. 불안정 시계열일 경우 적절한 변환을 통해 안정적 시계열로 변환.-----
#귀무가설 기각, 정상성을 만족하지 못함.
#null : 시계열 자료가 정상성을 가진다.
#p-value 가 0.013.. 으로 귀무가설을 기각한다.
#즉 시계열자료가 안정적이지 못하다.
tseries::kpss.test(o)

#추세를 가지고 있다고 가정하더라도 귀무가설을 기각한다.
tseries::kpss.test(o,"Trend")

#로그차분으로 정상성이 만족된 것으로 분석.
tseries::kpss.test(do)

#------3. 개연성 있는 예비모형을 산정.----
#acf의 경우 진동감소의 패턴을 보이고 있고 lag3에서 절단점을 가지고 있다.
#따라서 적적한 MA 차수는 2차로 추정할 수 있다.
acf(do)

#pacf의 경우 주기감소의 패턴을 보이고 있고 lag2에서 절단점을 가지고 있다.
#따라서 적적한 AR 차수는 1차로 추정할 수 있다.
#20을 넘어서 나오는 절단점은 무시하기로 하자.
pacf(do)

#tsdis로 추정한 acf, pacf 절단값은 2이므로 적절한 후보는 ARMA(1,1) 모델이다.
forecast::tsdisplay(do)

#위의 결과를 통해서 추정가능한 가장 개연성있는 모델의 후보군은 ARMA(1,1),ARMA(1,2) 모델이다.
#그러면 패키지 timsac 에서 제공하는 오토핏을 이용해서 최적의 ARMA차수를 알아보자.
#autofit은 ARMA(3,1)이 최소 AIC값을 제공하여 해당 모델을 최적의 모델로 정의했다.
timsac::autoarmafit(do)

#----4. 선정된 모형을 통해 추정 및 평가과정.-----
#지금까지 arma 하다가 뜬금없이 "arima"라고 해서 당황하지 말자. arima(p,d,q)는 d차 차분한 자료를 의미.
#이미 시계열의 정상성 검증을 다 거쳤지 때문에 0차 차분으로 변형하면 arima(n,0,m)모델과 같다.
z1<-forecast::Arima(do,order=c(1,0,1))
zf1<-forecast::forecast(z1,h=4)
forecast::accuracy(zf1)

z2<-forecast::Arima(do,order=c(1,0,2))
zf2<-forecast::forecast(z2,h=4)
forecast::accuracy(zf2)

#---5. 예측에 대한 성능평가를 통해 최대한 현실에 가까운 모형을 도출한다.-----
#아주 근소한 차이가 있지만 그래도 모델3 : ARMA(3,1)이 가장 우수한 예측성능을 보이고 있음.
z3<-forecast::Arima(do,order=c(3,0,1))
zf3<-forecast::forecast(z3,h=4)
forecast::accuracy(zf3)

plot(zf3)

#----6. 기타 : auto.arima----
#차분없는 원계열을 사용할 경우 최소 1차 차분하라고 분석된 결과가 나온다.
forecast::auto.arima(o)

#로그차분을 한 데이터의 경우 d차 차분 적절값은 0으로 나온다.
forecast::auto.arima(do)

z4<-forecast::Arima(do,order=c(0,0,2))
zf4<-forecast::forecast(z4,h=4)
forecast::accuracy(zf4)

#arima(3,0,1) vs arima(0,0,2) 의 분석결과가 유의마한 차이를 보이는가?
#귀무가설 기각 불가->유의미한 차이를 발견할 수 없다.
forecast::dm.test(zf3$residuals,zf4$residuals)

#잔차의 정규성 검정
#전부 귀무가설을 기각하여 잔차는 정규분포하지 않는다.
#이건 아마도 arch, garch를 이용하여 잔차의 변동성에 관한 모델링을 수행하면 없어진다고 추론.
tseries::jarque.bera.test(zf3$residuals)
tseries::jarque.bera.test(zf4$residuals)

#독립성 검정
#잔차는 서로 독립임.
Box.test(zf3$residuals)
Box.test(zf4$residuals)

#정상성 검정
#잔차는 정상성을 만족한다.
tseries::kpss.test(zf3$residuals)
tseries::kpss.test(zf4$residuals)

#단위근 검정(대립가설)
#귀무가설을 기각하고 대립 가설을 채택.
#단위근이 존재하지 않는다는 결론.
tseries::pp.test(zf3$residuals)
tseries::adf.test(zf3$residuals)

#iid 검정.
#검정결과 모든 구간에서 잔차는 iid를 만족하지 않는다. 즉 잔차는 시리얼리 코릴레이트 되어 있다고 추정.
#이건 garch를 통해서 arima(1,0,1) + garch(1,1) 이런식으로 모델링 하면 만족할 것으로 추정.
tseries::bds.test(zf3$residuals)
tseries::bds.test(zf4$residuals)

#install.packages("UsingR")
#자크베라테스트와 마찬가지로 잔차는 정규분포하지 않음.
library(UsingR)
shapiro.test(zf3$residuals)
shapiro.test(zf4$residuals)
#히스토그램을 그려보면 첨도가 높게 나옴.
hist(zf3$residuals)
hist(zf4$residuals)

 

 

로그차분 시계열의 acf, pacf 그래프
arima(3,0,1)을 통해서 나온 잔차의 히스토그램

 

위의 분석절차대로 arima 분석을 수행해보면 일반적인 절단점으로 분석한 모델과 autoarmafit, auto.arima 를 이용한 추정모델은 각 각 다르게 나왔다. 우선 일반적인 절단점을 이용해 분석한 모델보다는 autoarmafit, auto.arima 으로 추정한 모델의 예측성능이 더 우수한 것으로 나왔지만 fit, arima 둘 사이의 유의미한 차이점은 발견할 수 없었다.

 

한 가지 유의할 점은 잔차의 정규성은 검증이 기각되었다는 것이다. 금융시계열의 특성상 arch, garch 모델을 통해서 급격한 변동성으로 인한 잔차의 이분산성을 반영한 뒤 다시 한번 검증이 필요할 것으로 판단된다. 잔차의 이분산성이란 급격한 이코노믹 쇼크로 인해서 커진 변동성은 단기적으로는 직전의 변동성에 영향을 받고 장기적으로 평균분산에 근접한다는 이론인데 이건 다음번 포스트에서 다루어보자.

728x90
반응형

댓글