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

시계열자료의 평활법 - 지수 평활법

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

이동평균은 가중치가 없는 산술평균으로 평활하는데 비해 지수 평활은 가중치를 부여한 가중평균을 산정하는 방법이다. 이전 포스트에서(2020/10/15 - [머신러닝 with R/시계열모델링 with R] - 시계열 자료의 평활법 - 이동평균 평활법) 다루었던 가중이동평균 평활법과 별반 차이가 없다. 그러나 가중치를 연구자가 임의로 설정하지 않고 최소 SSE(sum sqared error)를 나타내는 알파값을 추정하는 방법을 적용한다면 홀트-윈터 방법을 이용할 수 있다. #홀트-윈터 방법의 자세한 수리적 유도과정에 대해 좀 더 상세한 내용을 알고자하는 사람은 관련서적을 참고하자. 아래의 추천도서는 개별 모델들의 수리적 유도과정 뿐만 아니라 적절한 샘플 예제도 구현하기 용이하도록 제공하고 있어 상당한 도움이 된다.

 

R프로그램에 기반한 시계열 자료 분석
국내도서
저자 : 이재길
출판 : 황소걸음 아카데미 2017.05.22
상세보기

 

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

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

o=mydatat$코스피지수
plot(o)

#-----------------단순이동평균.-------------------
#5일 이동평균
f5=filter(mydatat$코스피지수, filter=rep(1/5,5), side=1)
plot(f5)

#이중이동평균
df5=filter(f5, filter=rep(1/5,5), side=1)
plot(df5)

#독립성 검증(자기상관은 없는 것으로 관측)
res = o[10:100] - f5[10:100]
Box.test((res))

#독립성 검증(자기상관이 있는 것으로 관측)
res = o[10:100] - df5[10:100]
Box.test((res))

#-----------------가중이동평균.-------------------
w=c(0.5,0.4,0.3,0.2,0.1)
fw=filter(mydatat$코스피지수, filter=w)

#독립성 검증(자기상관이 있는 것으로 관측)
res = o[10:100] - fw[10:100]
Box.test((res))

#-----------------예측.-------------------
library(forecast)
fore1=forecast(o[10:100],h=1)
fore2=forecast(f5[10:100],h=1) 
fore3=forecast(df5[10:100],h=1)
fore4=forecast(fw[10:100],h=1)


#-----------------검증.-------------------
#ME : 예측오차의 산술평균
#RMSE : ME의 제곱의 평균
#MAE : 예측오차의 절대값의 평균
#MPE : 예측오차의 상대적인 크기를 반영(비율)한 평균
#MAPE : 예측오차의 절대값의 상대적 크기를 반영한 평균
#MASE : 예측오차의 절대값에 대한 평균으로 크기를 나타내는 지표
accuracy(fore1)
accuracy(fore2) 
accuracy(fore3) #이중이동평균의 성능이 가장 우수(오차들이 작다)
accuracy(fore4)


#-----------------HoltWinters Method.-------------------
#단순히 가중치를 0.1로 지정할 경우.
h=HoltWinters(o,alpha = 0.1, beta=F,gamma=F)
plot(h$fitted)
fh=forecast(h,h=1)
#테스트 결과 자기상관이 존재하는 것으로 나타남.
Box.test(fh$residuals)

#가중치를 추론하고자 할 경우
hi=HoltWinters(o,beta=F,gamma=F)
plot(hi$fitted)
fi=forecast(hi,h=1)
#테스트 결과 자기상관이 없는 것으로 나타남.<-그렇게 되도록 추정했으므로
Box.test(fi$residuals)

accuracy(fore3) #이중이동평균의 성능이 가장 우수(오차들이 작다)
accuracy(fi) #홀트-윈터 방법으로 추정한 결과 일부 지표에서는 이중이동평균보다 낫지만 드라마틱하지는 않다.

#추세가 있는 시계열의 가중치를 추론하고자 할 경우
#추세가 있다고 가정할 경우 alpha 값이 1이 되어 가중평균은 성립되지 않는 것으로 나타남.
#gamma도 무시하지 않고 고려하면 계절성이 있는 자료일 때 사용하는 방법이지만 코스피 지수는 계절을 타지 않음.
#굳이 계절성이 있다고 고려해본다면 산타랠리?? 정도 이지만 그것도 결산실적이 좋을 것으로 예측될 경우 가능한 이야기라 불규칙적임
hit=HoltWinters(o,gamma=F) 

#-----------------단수 지수평활법.-------------------
s=ses(o)
#simple exponential smooth 기법으로 추정한 alpha=0.99 로 1에 매우 근사한 값으로 나왔다.
summary(s)
sf=forecast(s,h=1)
accuracy(sf) #홀트-윈터 방법으로 추정한 결과와 별다른 차이점을 발견할 수 없다.

#-----------------ets-------------------
e=ets(o)
summary(e)
ef=forecast(e,h=1)
#테스트 결과 자기상관이 없는 것으로 나타남.
Box.test(ef$residuals)

accuracy(ef) #홀트-윈터 방법보다는 다소 개선된 성능지표를 관측할 수 있다.

위 코드를 토대로 분석한 결과 아래의 그림처럼 자료에 대한 이해가 없는 상태에서 가중치를 임의로 조정하면 자기상관성을 없애지도 못할 뿐더러 지나친 혹은 부족한 평활화로 인해 모델의 예측 성능을 저해하는 경우도 발생할 수 있다. 

가중치를 임의로 설정한 홀트-윈터 그래프
가중치를 추정한 홀트-윈터 그래프

 

728x90
반응형

댓글