본문 바로가기

Project

[PJ01-02] VAR 모델링을 통한 예측과 실젯값과의 비교

https://hjsong2.tistory.com/9

 

[PJ01-01] 정상성 검정과 인과관계 검정 with R

동아리에서 열심히 겨울 프로젝트를 진행중이다. 우리 조가 선택한 주제는 'VAR 모델을 이용한 포트폴리오의 수익률 예측과 Value at Risk 측정'이다. 이를 위해 우리 조가 이번주 2월 3일까지 해야할

hjsong2.tistory.com


지난번 포스팅에선 종목과 변수간의 인과관계 검정을 통해 변수를 재선택하였다.

 

그 결과 변수2,6,9가 선택한 종목에 영향을 끼치는 것을 알 수 있었다.

 

이번 포스트에서는 선택된 변수를 통해 VAR 모델을 설정한 후 VAR 모델로 6개월 간의 값을 예측하고 실젯값의 흐름의 차이를 알아보려고 한다.

 

우선 2021년 데이터부터 plot하기 위해 다음과 같이 설정한 후 그래프를 출력한다.

 

> new_return <- window(return, start = c(2021,1))
> plot(new_return, xlab="", ylab="", lwd=2)
> grid()

 

이제 종목의 수익률 데이터와 변수2,6,9의 데이터를 하나로 묶은 시계열 데이터를 생성하고

 

VAR 모델을 만들기 전에 lag 선택을 위한 VARselect 과정을 다음과 같이 거친다.

 

> v_final <- cbind(return, var2, var6, var9)
> v_final_1 <- window(v_final, end=c(2022,6))
> VARselect(v_final_1, lag.max = 12, type='const')
$\$$selection
AIC(n)  HQ(n)  SC(n) FPE(n) 
    11      2      1     11 

$\$$criteria
               1         2        3         4         5         6        7         8         9
AIC(n) 0.8637275 0.6520983 0.491964 0.4144301 0.3808696 0.4778275 0.286148 0.3263751 0.1501643
HQ(n)  1.0721473 1.0272539 1.033856 1.1230574 1.2562327 1.5199265 1.494983 1.7019458 1.6924708
SC(n)  1.3784281 1.5785592 1.830185 2.1644120 2.5426119 3.0513303 3.271411 3.7233988 3.9589484
FPE(n) 2.3727321 1.9231005 1.644669 1.5326307 1.4989300 1.6796238 1.419905 1.5262488 1.3344913
               10         11         12
AIC(n) -0.0705741 -0.2813349 -0.2619227
HQ(n)   1.6384683  1.5944433  1.7805913
SC(n)   4.1499704  4.3509701  4.7821427
FPE(n)  1.1293279  0.9790022  1.0864242

첫 번째 VAR 모델은 이전 그랜저-인과관계 검정을 실시했을 때처럼 BIC를 이용해보도록 하겠다.

 

> VAR_model_1 <- VAR(v_final_1, p = 1, type='const')
> forecast <- predict(VAR_model_1, n.ahead=6)
> var1_fcst <- ts(forecast$\$$fcst$\$$return[,1], start = c(2022,7), frequency = 12)
> lines(var1_fcst, lty=2, col='blue', lwd=3)
> legend('bottomleft', legend = c('Observations', 'VAR_Forecasts(lag=1)'),
+        lty = c(1, 2),
+        col = c('black', 'blue'))

실제 값과 많은 차이를 보인다는 것을 알수 있다.

 

이번에는 BIC가 아닌 AIC를 이용하여 lag를 선택해 VAR 모델을 생성해보도록 한다.

 

> VAR_model_2 <- VAR(v_final_1, p = 11, type='const')
> forecast <- predict(VAR_model_2, n.ahead=6)
> var2_fcst <- ts(forecast$\$$fcst$\$$return[,1], start = c(2022,7), frequency = 12)
> lines(var2_fcst, lty=2, col='red', lwd=3)
> legend('bottomleft', legend = c('Observations', 'VAR_Forecasts(lag=1)', 'VAR_Forecasts(lag=11)'),
+        lty = c(1, 2, 2),
+        col = c('black', 'blue', 'red'))

AIC 값인 11을 이용해 VAR 모델을 생성한 결과 마찬가지로 실제값과 유사하지는 않지만

 

BIC 값을 이용했을 때보다 실젯값과 좀 더 비슷한 추세를 보인다.

 

마지막으로 HQ 값을 이용한 VAR 모델을 살펴보자

 

> VAR_model_3 <- VAR(v_final_1, p = 2, type='const')
> forecast <- predict(VAR_model_3, n.ahead=6)
> var3_fcst <- ts(forecast$\$$fcst$\$$return[,1], start = c(2022,7), frequency = 12)
> lines(var3_fcst, lty=2, col='green', lwd=3)
> legend('bottomleft', legend = c('Observations', 'VAR_Forecasts(lag=1)', 'VAR_Forecasts(lag=11)', 'VAR_Forecasts(lag=2)'),
+        lty = c(1, 2, 2, 2),
+        col = c('black', 'blue', 'red', 'green'))

 

HQ 값을 이용한 VAR 모델도 실젯값과 많은 차이를 보인다.

 

마지막으로 VAR 모델이 아닌 단일 시계열 모델을 이용한 AR 모델을 살펴보자

 

AR 모델을 이용하기 위해선 lag 값을 결정하는 PACF를 다음과 같이 확인한다.

 

> rtn <- window(return, end=c(2022,6))
> pacf(rtn, lag=12, main="")

9번째의 PACF 값이 가장 크기 때문에 lag는 9로 설정하고 예측을 실시한다.

 

> AR_model <- arima(rtn, order = c(9,0,0), method="CSS")
> AR_fcst <- predict(AR_model, 6)$\$$pred
> lines(AR_fcst, lty=2, col='purple', lwd=3)
> legend('bottomleft', legend = c('Observations', 'VAR_Forecasts(lag=1)', 'VAR_Forecasts(lag=11)', 'VAR_Forecasts(lag=2)', 'AR_Forecasts'),
+        lty = c(1, 2, 2, 2, 2),
+        col = c('black', 'blue', 'red', 'green', 'purple'))

AR 모델도 마찬가지로 실제값과는 많은 차이를 보인다.

 

.

 

위 사실을 종합해보면 선택된 종목에 대한 예측에 가장 적합한 모델은 VAR(lag=11) 모델이라는 것을 알 수 있었고,

 

정확한 값보다는 추세 예측에 도움이 된다는 것을 알 수 있었다.

 

다음 포스팅에서는 조원들이 선택한 종목의 데이터로 Value at Risk를 계산하고 포트폴리오의 종목별 가중치를 설정할 예정이다.

 

오늘은 여기까지.