먼저 R Studio를 실행하여 과제를 저장할 파일부터 만듭니다.
새 스크립트를 열고
과제를 제출할 이름으로 저장합니다.
저장버튼 누르고 -> 폴더경로 지정해주고(영문으로만)-> 과제명.R로 정해서 save 버튼을 누르면 됩니다.
작성은 Script 창에서 합니다. Console 창에서 하면 저장할 수 없습니다.
이제 문제를 풀어봅니다.
1. Holt-Winters 계절지수평활법을 이용한 예측
(1) quantmod package의 getSymbols 함수를 이용하여 FRED에서 다음의 data를 download 받는다.
quantmod 패키지의 getsymbols 함수를 이용한다고 하였으므로 라이브러리 명령어를 사용하여
퀀트모드를 불러옵니다.
> library("quantmod")
FRED에서 TLOFCON의 데이터를 가져옵니다.
> getSymbols("TLOFCON",src="FRED")
(2)이렇게 받은 data 중 2013년 1월부터 2017년 12월까지의 data를 tcs라는 변수에 저장한다.
> tcs<-TLOFCON["2013/2017"]
(3) tcs를 ts함수를 써서 ts class 변수로 변환하여 tcs.ts라는 변수에 저장한다.
> tcs.ts<-ts(tcs,frequency=12,start=c(2013,1))
(4) tcs.ts에 ets함수를 사용하여 Holt-Winters 계절지수평활법을 적용하고 결과를 tcs.fit에 저장한다. ets함수 적용시 다음에 유의한다.
Holt-Winters 계절지수평활법 적용
수평성(Level) 평활지수는 0.5로 고정
모형을 추정하는데 있어 MSE(mean square error)를 최소화하는 방법으로 실행
모형선택에 있어 BIC 선정기준 채택
이건 ets 함수를 사용할 줄 알아야 합니다. 정석은 ?ets 실행해서 보는 것이고..
강의 노트의 4장에 자세히 기록되어 있으나 문제풀이에 필요한 부분위주로 살펴보자면
자, ets 함수에 들어가는 다양한 변수 중에 여기서 우리에게 주어진 조건을 빨간색으로 칠했습니다.
그리고 강의자료 예제로 사용한 ets 함수를 보면
ets(
+ 넣을 변수/여기서는 tcs.ts
+ 모델/Holt-Winters 계절지수평활법 적용이니 위의 설명대로 "AAA",
+ 수평성 평활지수 0.5는 뭔말이죠. 평활상수를 말씀하시는 거 같은데...
평활지수는 처음 들었어요. 평활상수 alpha=0.5
+ 그리고 bic를 입력해야 하니 ic=c(bic")
+)
여기까지를 코드로 입력하면
> ?ets
> tcs.fit<-ets(tcs.ts,model="AAA",alpha=0.5,ic=("bic"))
(5) summary함수를 이용하여 tcs.fit 내용을 출력한다.
> summary(tcs.fit)
실행화면은 다음과 같이 도출됩니다.
(6)원시계열자료인 tcs.ts는 검은색 실선으로 ets함수로 적합한 값들은 붉은색 점선 및 o표식으로
나타내어 다음의 그래프를 그린다.
강의자료의 4장 평활법을 보면, 유사한 문제가 나옵니다.
이를 참조해서 코드를 입력하면(문제에서 요구하지 않았으므로 legend는 넣을 필요 없습니다)
> plot(tcs.fit$x)
> lines(tcs.fit$fitted,col="red",type="o",lty=2)
(7) forecast함수를 사용하여 2018년 1월부터 4월까지 예측하고 그 결과를 tcs_f에 저장한다. 그리
고, tcs_f 출력하고 plot(tcs_f) 출력한다.
먼저 forecast함수를 사용하여 2018년 1월부터 4월까지 예측합니다.
역시 강의자료에서 다음의 내용을 참조할 수 있습니다.
> forecast(tcs.fit,h=4)
> tcs_f<-forecast(tcs.fit,h=4)
> tcs_f
> plot(tcs_f)
(8) 모형의 잔차(tcs.fit의 잔차)의 ACF와 PACF를 조사한다. 아울러 해당 잔차의 Ljung-Box test를
lag=12로 검정한다.
역시 강의자료4장에서 다음의 자료를 참조할 수 있습니다.
> plot(tcs.fit$residuals)
> acf(tcs.fit$residuals)
> pacf(tcs.fit$residuals)
> Box.test(tcs.fit$residuals,lag=12,type="Ljung-Box")
유의수준 5%에서 p-value가 너무 낮으므로 귀무가설을 기각합니다. 즉 whitenoise가 아닙니다.
(9) 처음 시작시에 받은 “Total Construction Spending: Office”의 2018년 1월부터 4월의 실제값과
tcs.fit에서 예측한 동일기간 값들을 다음과 같은 그래프로 나타낸다. 검은색 실선은 실제값이고
붉은색 점선 및 o표식은 예측값이다. y축 값들의 범위를 5300에서 6200으로 지정한다. 이는 plot함
수의 ylim 옵션을 이용하여 지정할 수 있다.
먼저 2018년 1월부터 4월의 실제값
> ts(TLOFCON["2018-01/2018-04"],frequency=12,start=c(2018,1))
tcs.fit에서 예측한 동일기간 값
> tcs_f$mean
실행하면
이 둘을
한 화면에 그래프로 나타내려면
> plot(ts(TLOFCON["2018-01/2018-04"],frequency=12,start=c(2018,1)),ylim=range(5300:6200))
> lines(tcs_f$mean,ylim=range(5300:6200),col="red",type="b",lty=2)
(참고로 type="o" 인 경우는 o표식 안에 선이 간섭되고, type="b"인 경우는 o표식에 선이 간섭되지 않음
1번의 Code 정리
1.
(1)
library("quantmod")
getSymbols("TLOFCON",src="FRED")
(2)
tcs<-TLOFCON["2013/2017"]
(3)
tcs.ts<-ts(tcs,frequency=12,start=c(2013,1))
(4)
library("forecast")
?ets
tcs.fit<-ets(tcs.ts,model="AAA",alpha=0.5,ic=("bic"))
(5)
summary(tcs.fit)
(6)
plot(tcs.fit$x)
lines(tcs.fit$fitted,col="red",type="o",lty=2)
(7)
forecast(tcs.fit,h=4)
tcs_f<-forecast(tcs.fit,h=4)
tcs_f
plot(tcs_f)
(8)
plot(tcs.fit$residuals)
acf(tcs.fit$residuals)
pacf(tcs.fit$residuals)
Box.test(tcs.fit$residuals,lag=12,type="Ljung-Box")
(9)
ts(TLOFCON["2018-01/2018-04"],frequency=12,start=c(2018,1))
tcs_f$mean
plot(ts(TLOFCON["2018-01/2018-04"],frequency=12,start=c(2018,1)),ylim=range(5300:6200))
lines(tcs_f$mean,ylim=range(5300:6200),col="red",type="b",lty=2)
2.요소분해법을 이용한 DJIA 분석
(1) quantmod package의 getSymbols 함수를 이용하여 Yahoo! Finance에서 Dow Jones Industrial
Average 지수를 내려받는다. 내려받은 OHLC data 중 2008년부터 2017년까지의 data를 dji_s에 저
장한다.
(2) dji_s를 월별 data로 변환하여 dji_mth에 저장하고 dji_mth 중 수정종가만을 dji_p에 저장한다.
그리고 head(dji_p)를 출력한다.
(3) ts함수를 이용하여 dji_p를 ts class 변수로 변환하여 dji.ts에 저장하고 dji.ts를 출력한다.
(4) decompose함수를 이용하여 가법모형의 요소분해법을 dji.ts에 적용하고 그 결과를 dji.d에 저
장한다. 또한, summary함수를 이용하여 dji.d의 summary를 출력한다.
(5) par(mfrow=c(2,1))을 이용하여 dji.d의 원시계열과 추세를 한 그래프에 그린다.
(6) par(mfrow=c(2,1))을 이용하여 dji.d의 계절변동과 잔차를 한 그래프에 그린다.
3. ARMA 모델링
(1) quantmod package의 getSymbols 함수를 이용하여 FRED에서 다음의 data를 download 받는다.
(2) 이렇게 받은 data 중 1999년 1월부터 2017년 12월까지의 data를 ts함수를 이용하여 ts class
변수로 변환한 다음 usdeur라는 변수에 저장한다. 또한, 2018년 1월부터 2018년 6월까지 data는
역시 ts class 변수로 변환한 후 usdeur.os라는 변수에 저장한다.
(3) 앞서 저장한 usdeur에 대하여 auto.arima함수를이용하여 ARMA모형 추정을 하여 usdeur.fit에
결과를 저장한다. 다음에 유의한다.
stationary 옵션을 이용하여 usdeur data를 차분하지 않고 (즉, d=0) ARMA 모형을 추정한
다.
seasonal 옵션을 이용하여 ARMA모형 추정에 있어 계절변동을 고려하지 않는다.
(4) summary함수를 이용하여 usdeur.fit의 summary를 출력한다
(5) 2017년의 usdeur와 추정된 ARMA 모형의 적합값을 다음과 같은 그래프로 그린다.
(window함수를 이용하면 2017년 해당값들만 추려낼 수 있다. 4장 강의슬라이드 참조)
(6) forecast함수를 이용하여 usdeur의 2018년 1월-6월 예측을 하고 그 결과를 usdeur_f에 저장한
다. 아울러 usdeur_f를 출력한다
(7) usdeur.os (2018년 1월-6월 실제값)과 (6)에서 예측한 값을 다음과 같은 그래프로 나타낸다. 검
은색 실선이 실제값이고 붉은색 점선과 o표식이 예측값을 나타낸다.
틀린 점1가지 발견 + 보완사항 1가지 발견
틀린점
x.remove(1)에서 괄호()안의 값은 value 입니다.
그래서 x에서 1번을 제거하면?은 틀렸습니다.
'x에서 원소1을 제거하면?'으로 해석해야 합니다.
보완사항
min(x)/max(x) 에서 int와 str가 함께 있으므로 최저값, 최대값을 구할 수 없습니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit