Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

고양이는 털털해

시계열 : arima, garch 본문

공부/시계열

시계열 : arima, garch

Attagungho 2021. 6. 20. 11:24

예측방법론_발표_8강 (1)

시계열모형을 이용한 예측



1. ARIMA 모형의 진단

  • 추정한 모형이 타당한지를 검토한다.
    • 1) 과대적합진단을 통해 간결원칙으로 정한 간결한 모델보다 복잡한 모형이 더 설명력이 있는지를 판단한다.
    • 2) 잔차분석을 통해 추정한 모델의 예측값에 대한 잔차가 랜덤한지 판단한다.
In [1]:
shhh <- suppressPackageStartupMessages # 불러올 때 연결 패키지 등의 메시지 출력하지 않도록 하기 위해 작성
shush <- suppressWarnings # 불러올 때 경고 메시지 출력하지 않도록 하기 위해 작성
shush(shhh(library(dplyr))) # 파이프 오퍼레이터 쓰려고 불러옴
In [2]:
# 임의 시계열 만들기
options(repr.plot.width=20, repr.plot.height=7)   # 그래프 길이 높이 지정하려고 작성
set.seed(417)
ar1_sim <- ts(arima.sim(list(order=c(1,0,0), ar=0.6), n=201), start=1970, freq=4)   # 1970년부터 2021년 1분기까지의 계수가 0.6인 임의의 AR(1)형태의 시계열을 작성
ar1_sim %>% ts.plot()  # 생성된 임의의 시계열을 시계열 그래프로 표현
In [3]:
# 잠정모형으로 AR(1) 모형 작성하기
ar1_fit <- arima(ar1_sim, order=c(1,0,0))  # AR(1) 모형 작성 ; AR(1) = ARIMA(1,0,0)
ar1_fit
Call:
arima(x = ar1_sim, order = c(1, 0, 0))

Coefficients:
         ar1  intercept
      0.5559     0.0699
s.e.  0.0586     0.1612

sigma^2 estimated as 1.042:  log likelihood = -289.55,  aic = 585.11

  • z-value 와 p-value의 계산
In [4]:
shush(shhh(library(lmtest))) # coeftest 사용하려기 위해 불러옴
coeftest(ar1_fit)
z test of coefficients:

          Estimate Std. Error z value Pr(>|z|)    
ar1       0.555923   0.058645  9.4795   <2e-16 ***
intercept 0.069896   0.161196  0.4336   0.6646    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • z-value 또는 t-value의 계산
    • $\frac{coefficient}{s.e.}$
In [5]:
0.555923/0.058645 # ar1 coefficient estimate z value 계산
9.47946116463467
In [6]:
0.069896/0.161196 # intercept estimate z value 계산
0.433608774411276
  • p value의 계산
In [7]:
2*pnorm(q=0.4336, lower.tail=FALSE) # 표준정규분포에서의 확률
0.664578934775799
In [8]:
shush(shhh(library(ggplot2)))
ggplot(data.frame(x=c(-3,3)), aes(x=x)) +
  geom_area(stat='function', fun=dnorm, xlim=c(qnorm(1-0.332), 3), fill='steelblue') +
  geom_area(stat='function', fun=dnorm, xlim=c(-3, qnorm(.332)), fill='steelblue') +
  stat_function(fun=dnorm)
In [1]:
2*pnorm(q=1.96, lower.tail=FALSE) # 95%의 퀀타일 = 1.96
0.0499957902964409
In [10]:
ggplot(data.frame(x=c(-3,3)), aes(x=x)) +
  geom_area(stat='function', fun=dnorm, xlim=c(qnorm(.975), 3), fill='steelblue') +
  geom_area(stat='function', fun=dnorm, xlim=c(-3, qnorm(0.025)), fill='steelblue') +
  stat_function(fun=dnorm)
  • 또 다른 p 값 계산 법
In [11]:
ar1_fit$coef
ar1
0.555922551391179
intercept
0.0698960590190473
In [12]:
ar1_fit$var.coef
A matrix: 2 × 2 of type dbl
ar1intercept
ar1 0.0034392189-0.0002112488
intercept-0.0002112488 0.0259842246
In [13]:
(1-pnorm(abs(ar1_fit$coef)/sqrt(diag(ar1_fit$var.coef))))*2
ar1
0
intercept
0.664572745549814
  • arima 모형 적합이 최대가능도 방식으로 이루어졌기 때문에 likelihood ratio 계산을 통해 p 값을 계산할 수 있다고도 한다.

1.1 과대적합진단

  • 더 복잡하게 작성한 새로운 모형이 간단하게 작성한 모형보다 더 설명력이 있는지를 판단하고 복잡한 모형이 더 적합하다면 복잡한 모형을 선택한다.
  • 이를 위해서
    • 1) 복잡한 모형의 모수가 유의한지를 확인한다.
    • 2) 복잡한 모형의 모수가 유의하다면 복잡한 모형의 잔차 분산이 간단한 모형의 잔차 분산보다 작은지를 비교한다.
    • 3) 복잡한 모형이 모수도 유의하고 잔차분산도 더 작다면 복잡한 모형을 선택한다.
In [14]:
# 과대적합진단을 위해 한단계 더 복잡한 ARIMA 모형 작성하기
ar2_overfit <- arima(ar1_sim, order=c(2,0,0))     # AR(2) 모형 작성하기
ar1ma1_overfit <- arima(ar1_sim, order=c(1,0,1))  # ARMA(1,1) 모형 작성하기
ar2_overfit
ar1ma1_overfit
Call:
arima(x = ar1_sim, order = c(2, 0, 0))

Coefficients:
         ar1     ar2  intercept
      0.5278  0.0510     0.0671
s.e.  0.0703  0.0706     0.1696

sigma^2 estimated as 1.04:  log likelihood = -289.29,  aic = 586.58
Call:
arima(x = ar1_sim, order = c(1, 0, 1))

Coefficients:
         ar1      ma1  intercept
      0.6186  -0.0905     0.0669
s.e.  0.0983   0.1236     0.1703

sigma^2 estimated as 1.04:  log likelihood = -289.29,  aic = 586.58
In [15]:
coeftest(ar2_overfit)
z test of coefficients:

          Estimate Std. Error z value  Pr(>|z|)    
ar1       0.527794   0.070310  7.5066 6.067e-14 ***
ar2       0.050996   0.070569  0.7226    0.4699    
intercept 0.067147   0.169578  0.3960    0.6921    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • 추가된 ar2 항 계수의 p value 를 통해 유의성 판단
    • ar2 항 계수가 유의하지 않다.
In [16]:
coeftest(ar1ma1_overfit)
z test of coefficients:

           Estimate Std. Error z value  Pr(>|z|)    
ar1        0.618577   0.098273  6.2944 3.085e-10 ***
ma1       -0.090540   0.123644 -0.7323    0.4640    
intercept  0.066855   0.170312  0.3925    0.6947    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • 추가된 ma1항 계수의 p value를 통해 유의성 판단
    • ma1 항 계수가 유의하지 않다.

1.2 잔차분석

  • 잔차가 백색잡음 형태인지를 검정
    • 1) 잔차 도표를 그려본다.
    • 2) 잔차에 자기상관이 남아있는지 상관도표와 부분상관도표를 그려본다.
    • 3) 포트맨두 검정(융-박스 검정)을 통해 잔차의 이론적 자기상관계수가 0인지를 검정한다. ; $H_0$ : 자기상관계수 = 0
    • 4) 잔차의 스펙트럼을 통해서 잔차가 백색잡음인지를 판단한다.
      • 스펙트럼을 이용해 잔차의 임의성(랜덤성)을 검정하는 방법으로 피셔-카파 검정과 베르틀레 코모고로프-스미르노프 검정이 있다고 한다.
    • 5) 잔차가 정규분포를 따르는지 정규성 검정을 시행하기도 한다.
      • 정규성 검정은 자크베라 검정 또는 샤피로 윌크스 검정을 이용한다.
      • 시계열 표본수가 일정 수 이상이면 중심극한정리에 따라 잔차가 정규분포에 수렴하게 되므로 실제 분석에서 자주 생략한다고 한다.
      • 다만 시계열에 이분산성이 있을 경우 이분산성 모형화 할 때 유용하게 사용할 수 있다고 한다.
  • 보통 1~3까지가 기본검정이며 이를 묶어서 보여주는 r 함수가 많이 있다.
  • 잔차분석 함수 1
In [17]:
shush(shhh(library(forecast)))  # checkresiduals 함수 쓰기 위해 불러옴
options(repr.plot.width=15, repr.plot.height=10)
checkresiduals(ar1_fit)
	Ljung-Box test

data:  Residuals from ARIMA(1,0,0) with non-zero mean
Q* = 1.6172, df = 6, p-value = 0.9513

Model df: 2.   Total lags used: 8

  • 잔차에 특별한 패턴이 없는 것으로 보인다.
  • 대부분의 자기상관계수가 점선 내 존재한다.
  • 잔차의 분포가 정규분포와 유사해 보인다.
  • 모형이 적절한 것으로 보인다.
  • 잔차분석 함수 2
In [18]:
options(repr.plot.width=10, repr.plot.height=10)
tsdiag(ar1_fit)
  • 표준화된 잔차에 트별한 패턴이 없는 것 같다.
  • 거의 모든 자기상관계수가 점선 내에 있다.
  • 융 박스 검정의 모든 시차에서 유의수준 0.05보다 큰 유의확률이 나타난다.
  • 모형이 적절한 것으로 보인다.

+ 목차로

2. ARIMA 모형의 예측

  • 실제 시계열이 추정한 모형에서 생성되었고 별 다른 일이 없으면 이러한 패턴대로 움직일 것이라는 가정 하에 동 모형을 이용해 미래의 시계열을 예측한다.
    • 즉 단기적으로는 예측과 살제 관측값 간 큰 차이가 없으나 장기적으로 충격 등으로 시계열 패턴이 바뀌는 경우 예측값과 실제 관측값 간 차이가 커질 수 있다.
  • 표기법의 이해
    • 관측값이 n개가 있다고 할 때 마지막 관측값을 $Y_n$이라고 미래 $l$ 시차 후 관측하게 될 시계열 값을 $Y_{n+1}$, 모델을 통해 예측하는 값은 $Y_n(l)$이라고 한다.
    • 예측에는 오차가 따르는데 이를 예측오차라 하며 $l$ 시차 후 예측값에 대한 오차를 $\hat{\varepsilon}_n(l)$이라고 한다.
      • $ \hat{\varepsilon}_n(l) = Y_{n+1}-Y_n(l)$ : 예측오차 = 실제 관측값 - 예측값
      • 예측 오차가 크다면 모형 설정이 잘못 되었거나 최근 시계열의 행태가 변했다고 할 수 있다. 예측 오차를 살펴봄으로써 모형을 수정해야하는지를 알 수 있다.
      • 좋은 예측값을 얻기 위해서 예측오차의 제곱의 기댓값을 최소화 하는 과정을 통해서 예측값을 결정하는 경우 이를 통해 얻은 예측값을 최소 MSE 기준 예측값이라고 한다.
  • $Y_{n+l}$의 95% 예측 구간
    • $Y_n(l) \pm 1.96 \sqrt{Var[\hat{\varepsilon_n}(l)]}$
    • $l$이 증가하면 예측오차 $\hat{\varepsilon_n}(l)$가 매우 커지면서 $Var[\hat{\varepsilon_n}(l)]$도 매우 커지면서 예측구간이 의미 없는 경우가 많다고 한다.
    • 시계열 모형에 의한 예측은 주로 단기 예측에 쓰이며 장기 예측에는 적당하지 않다.
  • AR, MA, ARMA 형태의 안정 시계열은 시간이 지남에 따라 예측값들이 수렴한다.

2.1 AR 모형의 예측

  • AR(1) 모형 : $Y_t = \mu+ \phi Y_{t-1} + \varepsilon_t$
  • $Y_n(l)$의 계산 : 최소 MSE 기준에 의해 도출할 경우
    • $Y_n(1) = \hat{\mu} + \hat{\phi}Y_n$
    • $Y_n(2) = \hat{\mu} + \hat{\phi}Y_n(1) = \hat{\mu} + \hat{\phi}(\hat{\mu} + \hat{\phi}Y_n) = \hat{\mu} + \hat{\phi}\hat{\mu} + \hat{\phi}^2Y_n = (1+\hat{\phi})\hat{\mu} + \hat{\phi}^2Y_n$
    • $Y_n(l) = (1+\hat{\phi}+\hat{\phi}^2 + \cdots + \hat{\phi}^{l-1}) \hat{\mu}+ \hat{\phi}^lY_n$
    • 시계열이 단위근이 없는 안정 시계열 모형이면 $|\hat{\phi}| <1$ 이므로 공비의 절대값이 1보다 작고 초항이 1인 등비수열의 합이 $\hat{\mu}$에 곱해지게 되며 $Y_n$에 곱해지는 값 $\hat{\phi}$는 $l$이 커질 수록 0에 가까워진다.

2.2 MA 모형의 예측

  • MA(1) 모형 : $Y_t = \mu + \theta \varepsilon_{t-1} + \varepsilon_t$
  • $Y_n(l)$의 계산 : 최소 MSE 기준에 의해 도출할 경우
    • $Y_n(1) = \hat{\mu} + \hat{\theta}\cdot\hat{\varepsilon_n}$
    • $l>2$인 경우 MA(1) 구조식은 예측에 도움이 되지 않고 $Y_n(l) = \hat{\mu}$로 예측된다.

2.3 ARMA 모형의 예측

  • ARMA(1,1) 모형 : $Y_t = \mu + \phi Y_{t-1} + \theta \varepsilon_{t-1} + \varepsilon_t$
  • $Y_n(l)$의 계산
    • $Y_n(1) = \hat{\mu} + \hat{\phi}Y_n + \hat{\theta}\hat{\varepsilon_n}$
    • $l>2$인 경우 MA항은 사라지며 AR 형태만 남는다. 즉 AR모형의 $Y_n(l)$의 예측값과 동일한 형태가 된다.
  • ARMA(p,q) 모형의 형태와 예측값?

2.4 ARIMA 모형의 예측

  • 불안정시계열 $Y_t$를 1차 차분한 시계열이 ARMA(p,q)를 따르면 $Y_t$는 ARIMA(p,1,q) 모형을 따른다고 할 수 있다.
  • ARIMA(1,1,0) 모형
    • $W_t = Y_t - Y_{t-1}$
    • $W_t = \mu + \phi W_{t-1}+\varepsilon_t$
    • $\begin {aligned} (Y_t - Y_{t-1}) &= \mu + \phi(Y_{t-1} - Y_{t-2})+\varepsilon_t \\ Y_t &= \mu + Y_{t-1} + \phi Y_{t-1} - \phi Y_{t-2} + \varepsilon_t \\ Y_t &= \mu + (1+\phi) Y_{t-1} -\phi Y_{t-2} + \varepsilon_t \end {aligned}$
    • AR(2) 모형과 유사한 형태가 된다.
  • $d \geq 2$ 인 경우에도 ARIMA(p,d,q) 의 예측은 ARMA(p+d, q)의 예측과 동일하다.
    • $d=2$인 경우
      • $W_t = (Y_t - Y_{t-1}) - (Y_{t-1} - Y_{t-2})$
      • 위의 식으로 ARIMA(1,2,0) 모형을 풀어보면 AR(3) 모형과 유사한 형태가 되는 것을 확인할 수 있다.
In [19]:
shush(shhh(library(quantmod)))   # getSymbols 사용하려고 불러옴
ks <- getSymbols(Symbols='^KS11', from='2016-01-01', to='2021-04-14', auto.assign=FALSE)
head(ks)
'getSymbols' currently uses auto.assign=TRUE by default, but will
use auto.assign=FALSE in 0.5-0. You will still be able to use
'loadSymbols' to automatically load data. getOption("getSymbols.env")
and getOption("getSymbols.auto.assign") will still be checked for
alternate defaults.

This message is shown once per session and may be disabled by setting 
options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.


Warning message:
"^KS11 contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them."
           KS11.Open KS11.High KS11.Low KS11.Close KS11.Volume KS11.Adjusted
2016-01-04   1954.47   1954.52  1918.76    1918.76      359000       1918.76
2016-01-05   1911.93   1937.57  1911.93    1930.53      446500       1930.53
2016-01-06   1934.25   1934.25  1911.61    1925.43      594600       1925.43
2016-01-07   1915.71   1926.41  1901.24    1904.33      393000       1904.33
2016-01-08   1889.42   1918.25  1883.82    1917.62      430200       1917.62
2016-01-11   1897.18   1907.43  1892.69    1894.84      328800       1894.84
In [20]:
summary(ks)
     Index              KS11.Open      KS11.High       KS11.Low   
 Min.   :2016-01-04   Min.   :1474   Min.   :1517   Min.   :1439  
 1st Qu.:2017-04-24   1st Qu.:2042   1st Qu.:2048   1st Qu.:2032  
 Median :2018-08-27   Median :2167   Median :2178   Median :2156  
 Mean   :2018-08-25   Mean   :2237   Mean   :2248   Mean   :2224  
 3rd Qu.:2019-12-19   3rd Qu.:2384   3rd Qu.:2392   3rd Qu.:2375  
 Max.   :2021-04-14   Max.   :3204   Max.   :3266   Max.   :3162  
                      NA's   :5      NA's   :5      NA's   :5     
   KS11.Close    KS11.Volume      KS11.Adjusted 
 Min.   :1458   Min.   : 184200   Min.   :1458  
 1st Qu.:2040   1st Qu.: 332600   1st Qu.:2040  
 Median :2166   Median : 422650   Median :2166  
 Mean   :2237   Mean   : 547095   Mean   :2237  
 3rd Qu.:2386   3rd Qu.: 648400   3rd Qu.:2386  
 Max.   :3209   Max.   :3455500   Max.   :3209  
 NA's   :5      NA's   :5         NA's   :5     
In [21]:
colSums(is.na(ks))
KS11.Open
5
KS11.High
5
KS11.Low
5
KS11.Close
5
KS11.Volume
5
KS11.Adjusted
5
In [22]:
na_list <- which(is.na(ks$KS11.Close))
for (i in na_list) {
    print(ks[i,])
}
           KS11.Open KS11.High KS11.Low KS11.Close KS11.Volume KS11.Adjusted
2017-11-16        NA        NA       NA         NA          NA            NA
           KS11.Open KS11.High KS11.Low KS11.Close KS11.Volume KS11.Adjusted
2017-11-23        NA        NA       NA         NA          NA            NA
           KS11.Open KS11.High KS11.Low KS11.Close KS11.Volume KS11.Adjusted
2018-01-02        NA        NA       NA         NA          NA            NA
           KS11.Open KS11.High KS11.Low KS11.Close KS11.Volume KS11.Adjusted
2018-11-15        NA        NA       NA         NA          NA            NA
           KS11.Open KS11.High KS11.Low KS11.Close KS11.Volume KS11.Adjusted
2019-11-14        NA        NA       NA         NA          NA            NA
  • 야후 파이낸스에서 해당 값들이 결측치로 들어 있어서 이런 결측치가 존재한다.
    • 네이버 금융은 2019년 11월 14일 kospi 값이 있는 것을 보니 야후 파이낸스의 문제인 모양이다.
    • 결측치를 제거하고 진행하기로 한다.
In [23]:
kospi_close <- na.omit(ks$KS11.Close)   # kospi 데이터 중 종가만 결측치 제거하고 가져옴 
options(repr.plot.width=20, repr.plot.height=10)
ggplot(data=kospi_close, aes(x=index(kospi_close), y=KS11.Close)) + 
  geom_line(size=1.2, color='red', alpha=0.5)
In [24]:
acf(log(kospi_close))
  • 로그를 취하고 자기상관도표를 그려보면 자기상관계수가 시간이 지남에 따라 서서히 감소하는 추세가 있는 시계열임을 확인할 수 있다.
    • 추제 제거를 위해 차분을 한다.
In [25]:
kospi_close %>% log() %>% diff() %>% na.omit() %>% acf()
  • 2차에서 유의하게 큰 값이 있는 것으로 보인다.
    • ma2 모형으로 식별하고 모형 적합을 진행해 보기로 한다.
In [26]:
kospi_close %>% log() %>% diff() %>% na.omit() %>% pacf()
  • 부분자기상관도표를 그려보면 2기에서 유의하게 큰 값이 있는 것처럼 보인다.
    • ar2 모형으로 식별해 모형을 적합해 보기로 한다.
In [27]:
plot(diff(log(kospi_close)))
  • 대체적으로 안정적으로 보이나 변동성이 커졌다 작아지는 구간이 있다.
In [28]:
ggplot(kospi_close, aes(x=diff(log(kospi_close)))) + 
 geom_histogram(aes(y=..density..), colour="black", fill="white", bins= 25)+
 geom_density(alpha=.2, fill="pink")
Don't know how to automatically pick scale for object of type xts/zoo. Defaulting to continuous.

Warning message:
"Removed 1 rows containing non-finite values (stat_bin)."
Warning message:
"Removed 1 rows containing non-finite values (stat_density)."
  • 꼬리가 길고 뾰족한 분포를 갖는 것으로 보인다.
In [29]:
spectrum(na.omit(diff(log(kospi_close))), spans=c(2,2), main="kospi_close", col="black")
  • 스펙트럼 그림을 그려 봤을 때 특별히 값이 큰 주파수는 없는 것 같다.
    • 추세나 계절성이 있는 것으로 판단하기는 어려울 것 같다.
    • arima(2,1,2) 모형으로 적합해 본 후 과대적합진단을 진행해 보기로 하자.

  • arima (2, 1, 2)로 적합
In [30]:
kospi_fit1 <- arima(log(kospi_close), order=c(2,1,2))
coeftest(kospi_fit1)
print('')
print('--------------------------------------------------------------------')
print('')
summary(kospi_fit1)
z test of coefficients:

    Estimate Std. Error z value Pr(>|z|)   
ar1  0.53868    0.21884  2.4615 0.013835 * 
ar2 -0.31541    0.21660 -1.4562 0.145335   
ma1 -0.56529    0.20719 -2.7284 0.006364 **
ma2  0.46286    0.19921  2.3234 0.020156 * 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
[1] ""
[1] "--------------------------------------------------------------------"
[1] ""

Call:
arima(x = log(kospi_close), order = c(2, 1, 2))

Coefficients:
         ar1      ar2      ma1     ma2
      0.5387  -0.3154  -0.5653  0.4629
s.e.  0.2188   0.2166   0.2072  0.1992

sigma^2 estimated as 0.0001143:  log likelihood = 4020.83,  aic = -8031.66

Training set error measures:
                       ME       RMSE         MAE        MPE       MAPE
Training set 0.0003471467 0.01068946 0.007207588 0.00436397 0.09371235
                  MASE         ACF1
Training set 0.9978169 -0.007376248
  • ar2항이 유의하지 않다.
  • arima(2, 1, 3) 적합
In [31]:
kospi_fit2 <- arima(log(kospi_close), order=c(2,1,3))
coeftest(kospi_fit2)
print('')
print('--------------------------------------------------------------------')
print('')
summary(kospi_fit2)
z test of coefficients:

     Estimate Std. Error z value  Pr(>|z|)    
ar1  0.896968   0.210078  4.2697 1.957e-05 ***
ar2 -0.477917   0.167724 -2.8494   0.00438 ** 
ma1 -0.929147   0.210906 -4.4055 1.055e-05 ***
ma2  0.643475   0.158616  4.0568 4.975e-05 ***
ma3 -0.072809   0.048838 -1.4908   0.13600    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
[1] ""
[1] "--------------------------------------------------------------------"
[1] ""

Call:
arima(x = log(kospi_close), order = c(2, 1, 3))

Coefficients:
         ar1      ar2      ma1     ma2      ma3
      0.8970  -0.4779  -0.9291  0.6435  -0.0728
s.e.  0.2101   0.1677   0.2109  0.1586   0.0488

sigma^2 estimated as 0.0001142:  log likelihood = 4021.6,  aic = -8031.19

Training set error measures:
                       ME       RMSE         MAE         MPE       MAPE
Training set 0.0003626068 0.01068305 0.007205645 0.004557114 0.09368895
                  MASE         ACF1
Training set 0.9975478 -0.001809722
  • ma 3항이 유의하지 않다.
In [32]:
kospi_fit3 <- arima(log(kospi_close), order=c(3,1,2))
coeftest(kospi_fit3)
print('')
print('--------------------------------------------------------------------')
print('')
summary(kospi_fit3)
z test of coefficients:

     Estimate Std. Error z value  Pr(>|z|)    
ar1  0.786045   0.182003  4.3189 1.568e-05 ***
ar2 -0.398735   0.168371 -2.3682 0.0178751 *  
ar3 -0.062546   0.041102 -1.5217 0.1280724    
ma1 -0.820069   0.180719 -4.5378 5.684e-06 ***
ma2  0.565114   0.156267  3.6163 0.0002988 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
[1] ""
[1] "--------------------------------------------------------------------"
[1] ""

Call:
arima(x = log(kospi_close), order = c(3, 1, 2))

Coefficients:
        ar1      ar2      ar3      ma1     ma2
      0.786  -0.3987  -0.0625  -0.8201  0.5651
s.e.  0.182   0.1684   0.0411   0.1807  0.1563

sigma^2 estimated as 0.0001141:  log likelihood = 4021.76,  aic = -8031.53

Training set error measures:
                       ME       RMSE         MAE         MPE       MAPE
Training set 0.0003629053 0.01068167 0.007206302 0.004560875 0.09369771
                  MASE         ACF1
Training set 0.9976388 0.0001225492
  • ar3 항이 유의하지 않다.
  • arima (1, 1, 2) 적합
In [33]:
kospi_fit5 <- arima(log(kospi_close), order=c(1,1,2))
coeftest(kospi_fit5)
print('')
print('--------------------------------------------------------------------')
print('')
summary(kospi_fit5)
z test of coefficients:

     Estimate Std. Error z value  Pr(>|z|)    
ar1  0.288547   0.134684  2.1424   0.03216 *  
ma1 -0.321167   0.132975 -2.4152   0.01572 *  
ma2  0.159647   0.028352  5.6310 1.792e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
[1] ""
[1] "--------------------------------------------------------------------"
[1] ""

Call:
arima(x = log(kospi_close), order = c(1, 1, 2))

Coefficients:
         ar1      ma1     ma2
      0.2885  -0.3212  0.1596
s.e.  0.1347   0.1330  0.0284

sigma^2 estimated as 0.0001145:  log likelihood = 4019.94,  aic = -8031.89

Training set error measures:
                      ME       RMSE         MAE         MPE       MAPE
Training set 0.000340708 0.01069684 0.007207463 0.004283616 0.09370736
                  MASE         ACF1
Training set 0.9977995 0.0006652404
  • ar2항이 유의하지 않았으므로 arima(1,1,2)로 적합해 보니 모든 항이 유의한 것으로 나타났다.
  • auto arima 적합
In [34]:
kospi_fit_auto <- auto.arima(log(kospi_close))
kospi_fit_auto
coeftest(kospi_fit_auto)
Series: log(kospi_close) 
ARIMA(0,1,3) 

Coefficients:
          ma1     ma2     ma3
      -0.0323  0.1450  0.0567
s.e.   0.0277  0.0271  0.0292

sigma^2 estimated as 0.0001147:  log likelihood=4020.17
AIC=-8032.34   AICc=-8032.31   BIC=-8011.69
z test of coefficients:

     Estimate Std. Error z value  Pr(>|z|)    
ma1 -0.032329   0.027731 -1.1658   0.24370    
ma2  0.145034   0.027093  5.3531 8.646e-08 ***
ma3  0.056682   0.029242  1.9384   0.05258 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • 모든 항이 유의하진 않지만 aic 값이 제일 작다.
    • auto-arima로 적합된 모델로 추후 분석을 진행해 보기로 한다.
In [35]:
checkresiduals(kospi_fit_auto)
	Ljung-Box test

data:  Residuals from ARIMA(0,1,3)
Q* = 4.7256, df = 7, p-value = 0.6934

Model df: 3.   Total lags used: 10

In [36]:
tsdiag(kospi_fit_auto)
In [37]:
plot(forecast(kospi_fit_auto, h= 60))
  • ma 모형이기 때문에 점 추정은 일정한 값으로 유지
    • 기간이 지남에 따라 오차가 급격히 증가한다.
    • 안정시계열 모형만으로 kospi 시계열을 예측하기는 어려울 수도 있겠다.

+ 목차로

3. 변동성 모형 작성 및 예측 ; ARCH, GARCH 모형

  • 참고영상1, 참고영상2, 참고영상3, 참고영상4
  • 시간에 따라 분산이 변하는 경우 변동성이 있다고 하며 금융시장 데이터는 이슈에 따라 크게 변화하고 변동성이 생겼다가 사라질 때까지 시간이 걸리는 특성이 있다.
    • 즉 어제의 변동성이 컸으면 오늘의 변동성도 크다.
      • 따라서 이전의 오차항이 현재의 분산에 영향을 갖는 조건부 분산을 연구하는 모델이 나타났다.
    • 이처럼 변동성이 큰 상황이 뭉쳐서 발생하여 수익률의 분포가 정규분포보다 꼬리가 두터운 경우 ; 극단적 상황이 정규분포보다 자주 관측 되는 경우, 이를 설명하는 모델로 ARCH, GARCH 모형이 있다.
    • ARIMA 모델로 추정 후 잔차를 변동성 모형으로 설명하기도 한다.
  • 표현의 정리 : 수익률 $r_t$
    • $p_t, p_{t+1}$을 각각 현재의 자산가격, 1기 후의 자산가격이라고 할 때 $r_t = \frac{p_{t+1}-p_t}{p_t}$
      • 수익률은 자산가격을 로그 차분한 값과 같다고 한다.
    • 수익률 식을 $p_{t+1}$에 대해 정리하면 $p_{t+1} = p_t(1+r)$
    • 자산가격을 로그 차분하면 $\log{p_{t+1}} - \log{p_t}$
      • 이 식에 $p_t$에 대해 정리한 수익률 식을 대입하면 $ \log{p_t(1+r)} - \log{p_t} = \log{\frac{p_t(1+r)}{p_t}} = \log{(1+r)} \approx r, \quad if\; r<1$
        • $log(1+r) \approx r$ 이해 못함 링크

3.1 ARCH 모형

  • 변동성 모형 또는 조건부 분산 모형이라고도 한다.
  • $r_t$ 가 자산 수익률이라고 할 때.
    • $E(r_t|r_{t-1}, r_{t-2}, \dots)=0$ 가정 하에 조건부 분산은 $Var(r_t|r_{t-1},r_{t-2}, \dots) = E(r_t^2|r_{t-1}, r_{t-2}, \dots)$ 를 만족한다고 한다.
  • ARCH(1) 모형:
    • $r_t = \sigma_{t|t-1}\varepsilon_t$
      • 현재 수익률은 이번기 오차와 이번기 조건부 분산에 의해 결정 ; 동기 오차에 의해 예측할 수 없게 변화한다는 의미이지 않을까.
    • $\sigma_{t|t-1}^2 = \alpha_0 + \alpha_1 r_{t-1}^2$
      • 현재 조건부 분산은 전기 오차로 결정된 수익률의 제곱에 의해 결정. 이전 오차의 제곱이 동기 조건부 분산에 영향을 준다. 이전의 충격으로 수익률이 커지거나 작아지면 다음기 분산이 커지거나 작아진다.
  • ARCH(p) 모형:
    • $\sigma_{t|t-1}^2 = \alpha_0 + \sum_{i=1}^p \alpha_i r_{t-i}^2$
  • $r_t$ 기대값이 0이고 시점간 공분산 값이 0이다. 조건부 기댓값은 $r_t$는 예측이 불가능하지만 조건부 분산 $r_t^2$는 예측이 가능하다.
  • 검정법 ARCH-LM 검정
    • 현재의 분산이 과거의 오차항의 제곱에 의해 표현이 될 때 과거 오차항의 계수가 모두 0인지를 귀무가설로 두고 검정
    • 검정 통계량 : (총 관측치 - ARCH 항 수 p) 모형의 결정계수 R^2 ~ 카이제곱 분포(자유도 ARCH 항 수 p)
    • ARCH 모델은 조건부 분산에 영향을 미치는 것이 전기의 수익률이기 때문에 변동성이 한동안 유지되는 것을 잘 예측하지 못한다고 한다.

3.2 GARCH 모형

  • ARCH 모형을 일반화 한 모형이 GARCH(p,q)이다.
    • AR(1) 에서 ARMA(1,1)로 확장되는 것과 유사한 방식으로 ARCH(1) 에서 GARCH(1,1)으로 확장된다.
    • GARCH(1,1) 모형:
      • $r_t = \sigma_{t|t-1}\varepsilon_t$
        • 이 식은 동일
      • $\sigma_{t|t-1}^2 = w + \alpha r_{t-1}^2 + \beta \sigma_{t-1|t-2}^2$
    • GARCH(p,q) 모형:
      • $r_t = \sigma_{t|t-1}\varepsilon_t$
      • $\sigma_{t|t-1}^2 = w + \sum_{i=1}^p{\alpha_i r_{t-i}^2} + \sum_{j=1}^q{\beta_j \sigma_{t-j|t-j-1}^2}$
    • GARCH 모형의 작성 절차
      • 1) 자크-베라 검정 같은 정규성 검정을 통해 시계열이 정규분포를 따르는지 검정 : GARCH 모형 시계열은 정규분포보다 꼬리가 두껍다고 한다.
      • 2) 륭-박스 검정 또는 ARCH-LM 검정으로 시계열의 제곱에 대해 자기상관이 존재하는지 검정
      • 3) 2)번 검정 결과 조건부 이분산성이 존재하지 않는다는 귀무가설을 기각하면 ARCH 형태의 이분산성이 존재한다고 판단한다.
      • 4) GARCH 모형 작성 후 모형이 제대로 작성되었는지는 잔차 제곱의 상관도표 또는 잔차제곱에 대한 륭-박스 검정을 통해 잔차에 이분산성이 없고 독립적이라고 판단할 수 있는지를 살펴본다.
    • ARMA 모형과 GARCH 모형의 조합
      • 상기 GRACH(p,q) 의 평균함수는 $r_t$가 백색잡음인 $\varepsilon$에 대한 곱으로 되어 있어 평균이 0인 함수를 뜻한다.
      • GARCH 모형에 ARMA 모형을 결합해 $r_t$를 구하는 평균함수를 0이 아닌 ARMA 형태로 구성할 수 있다.
        • $r_t = \mu + \phi r_{t-1} + \theta \nu_{t-1} + \nu_t$
          • ARMA 모형 형태
        • $\nu_t = \sigma_{t|t-1} \varepsilon_t$
        • $\sigma_{t|t-1}^2 = w+ \alpha \nu_{t-1}^2 + \beta \sigma_{t-1|t-2}^2$
In [42]:
gar_kospi <- kospi_close %>% log() %>% diff() %>% na.omit()
hist(gar_kospi, breaks=100, freq=FALSE, main='dlog Kospi')
In [52]:
shush(shhh(library(tseries))) # 자크베라 검정 사용하기 위해 불러옴
jarque.bera.test(gar_kospi)
	Jarque Bera Test

data:  gar_kospi
X-squared = 5475.4, df = 2, p-value < 2.2e-16
  • 정규분포가 아니다.
In [53]:
options(repr.plot.width=10, repr.plot.height=5)
acf(gar_kospi)
In [54]:
pacf(gar_kospi)
In [55]:
acf(gar_kospi^2)
In [56]:
pacf(gar_kospi^2)
  • 정규성검정을 통과하지 못했다.
  • 제곱은 임계치 밖에 있다. 백색잡음으로 보기 어렵다.
  • 이분산성을 가진 시계열일 수 있다. garch나 arch모형으로 적합해 보는 것이 좋겠다.
In [57]:
shush(shhh(library(fGarch)))
gg <- garchFit(~garch(1,1), gar_kospi)
summary(gg)
Series Initialization:
 ARMA Model:                arma
 Formula Mean:              ~ arma(0, 0)
 GARCH Model:               garch
 Formula Variance:          ~ garch(1, 1)
 ARMA Order:                0 0
 Max ARMA Order:            0
 GARCH Order:               1 1
 Max GARCH Order:           1
 Maximum Order:             1
 Conditional Dist:          norm
 h.start:                   2
 llh.start:                 1
 Length of Series:          1289
 Recursion Init:            mci
 Series Scale:              0.01082492

Parameter Initialization:
 Initial Parameters:          $params
 Limits of Transformations:   $U, $V
 Which Parameters are Fixed?  $includes
 Parameter Matrix:
                     U           V     params includes
    mu     -0.36260183   0.3626018 0.03626018     TRUE
    omega   0.00000100 100.0000000 0.10000000     TRUE
    alpha1  0.00000001   1.0000000 0.10000000     TRUE
    gamma1 -0.99999999   1.0000000 0.10000000    FALSE
    beta1   0.00000001   1.0000000 0.80000000     TRUE
    delta   0.00000000   2.0000000 2.00000000    FALSE
    skew    0.10000000  10.0000000 1.00000000    FALSE
    shape   1.00000000  10.0000000 4.00000000    FALSE
 Index List of Parameters to be Optimized:
    mu  omega alpha1  beta1 
     1      2      3      5 
 Persistence:                  0.9 


--- START OF TRACE ---
Selected Algorithm: nlminb 

R coded nlminb Solver: 

  0:     1618.0838: 0.0362602 0.100000 0.100000 0.800000
  1:     1602.7069: 0.0362609 0.0757707 0.0961616 0.784687
  2:     1597.2984: 0.0362629 0.0723146 0.123199 0.794347
  3:     1594.6287: 0.0362637 0.0577979 0.121612 0.787773
  4:     1591.6475: 0.0362668 0.0555249 0.134389 0.797156
  5:     1591.3033: 0.0362722 0.0416968 0.139360 0.803522
  6:     1590.7149: 0.0362880 0.0406134 0.140722 0.819436
  7:     1590.2830: 0.0363629 0.0338969 0.131417 0.830413
  8:     1590.2143: 0.0364138 0.0371672 0.129932 0.827046
  9:     1590.2123: 0.0364140 0.0369982 0.129892 0.826973
 10:     1590.2119: 0.0364154 0.0369201 0.130024 0.827075
 11:     1590.2119: 0.0364156 0.0368818 0.130026 0.827071
 12:     1590.2118: 0.0364161 0.0368826 0.130051 0.827099
 13:     1590.2117: 0.0364185 0.0368410 0.130047 0.827113
 14:     1590.2077: 0.0368182 0.0361946 0.128258 0.829550
 15:     1590.1542: 0.0434585 0.0372566 0.130969 0.826448
 16:     1590.1504: 0.0440896 0.0371823 0.130241 0.826224
 17:     1590.1491: 0.0437888 0.0369465 0.130535 0.826636
 18:     1590.1490: 0.0437811 0.0370494 0.130443 0.826569
 19:     1590.1490: 0.0437936 0.0370224 0.130453 0.826586
 20:     1590.1490: 0.0437929 0.0370221 0.130453 0.826587

Final Estimate of the Negative LLH:
 LLH:  -4243.741    norm LLH:  -3.292274 
          mu        omega       alpha1        beta1 
4.740549e-04 4.338212e-06 1.304534e-01 8.265873e-01 

R-optimhess Difference Approximated Hessian Matrix:
                  mu         omega        alpha1         beta1
mu     -1.980265e+07  2.701756e+08  5.421924e+03  4.962002e+01
omega   2.701756e+08 -5.602309e+12 -2.261886e+08 -3.508714e+08
alpha1  5.421924e+03 -2.261886e+08 -1.638162e+04 -1.892804e+04
beta1   4.962002e+01 -3.508714e+08 -1.892804e+04 -2.622168e+04
attr(,"time")
Time difference of 0.02299881 secs

--- END OF TRACE ---


Time to Estimate Parameters:
 Time difference of 0.09500194 secs
Warning message:
"Using formula(x) is deprecated when x is a character vector of length > 1.
  Consider formula(paste(x, collapse = " ")) instead."
Title:
 GARCH Modelling 

Call:
 garchFit(formula = ~garch(1, 1), data = gar_kospi) 

Mean and Variance Equation:
 data ~ garch(1, 1)
<environment: 0x0000000005a2b9f8>
 [data = gar_kospi]

Conditional Distribution:
 norm 

Coefficient(s):
        mu       omega      alpha1       beta1  
4.7405e-04  4.3382e-06  1.3045e-01  8.2659e-01  

Std. Errors:
 based on Hessian 

Error Analysis:
        Estimate  Std. Error  t value Pr(>|t|)    
mu     4.741e-04   2.257e-04    2.100 0.035708 *  
omega  4.338e-06   1.258e-06    3.449 0.000562 ***
alpha1 1.305e-01   2.294e-02    5.687 1.29e-08 ***
beta1  8.266e-01   3.002e-02   27.537  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Log Likelihood:
 4243.741    normalized:  3.292274 

Description:
 Fri Apr 16 21:09:05 2021 by user: Attagungho 


Standardised Residuals Tests:
                                Statistic p-Value     
 Jarque-Bera Test   R    Chi^2  263.1522  0           
 Shapiro-Wilk Test  R    W      0.971247  2.472808e-15
 Ljung-Box Test     R    Q(10)  10.57183  0.3918336   
 Ljung-Box Test     R    Q(15)  13.77133  0.5429376   
 Ljung-Box Test     R    Q(20)  17.37112  0.6287606   
 Ljung-Box Test     R^2  Q(10)  7.682689  0.6597999   
 Ljung-Box Test     R^2  Q(15)  10.38938  0.7945587   
 Ljung-Box Test     R^2  Q(20)  14.86918  0.7838437   
 LM Arch Test       R    TR^2   7.994363  0.7855708   

Information Criterion Statistics:
      AIC       BIC       SIC      HQIC 
-6.578342 -6.562324 -6.578361 -6.572330 

  • 계수들은 5% 유의수준에서 대체로 유의하다.
  • 잔차(r)와 잔차 제곱(r^2)의 융박스 검정은 유의하지 않아 변동성이 남아있지 않는 것으로 보여 모형이 적절하게 작성된 것 같다.
  • 잔차에 대한 arch lm 검정 결과 이분산성이 존재하지 않는 것으로 보인다.

'공부 > 시계열' 카테고리의 다른 글

시계열 #1  (0) 2021.06.16