GARCH(1,1) ile Tarihsel Volatilite Modelleme

Bu yazımızda tarihsel şartlı volatilite modellemesini inceleyeceğiz. Bunun için S&P500 indeksinin tarihsel günlük logaritmik getirileri bulunacak ve GARCH(1,1) modellemesi yapılacaktır ve model sınamaları kontrol edilecektir.

Tanımlamalar

Öncelikle sistemimizde gerekli kütüphaneler eksik ise kurulumu yapılmalıdır.

install.packages(c("quantmod","PerformanceAnalytics","FinTS","magrittr","zoo","rugarch"))

Ana kütüphaneleri aktif hale getirelim.

library(PerformanceAnalytics)
library(magrittr)
library(rugarch)

Yahoo Finance, finansal enstrümanlara ait genellikle açılış (Open), en yüksek (High), en düşük (Low), kapanış (Close), hacim (Volume) ve düzeltilmiş kapanış (Adjusted) değişkenlerini saklar. GARCH(1,1) modellemesini düzeltilmiş kapanış fiyatlarını kullanarak yapacağız.

price değişkeni xts tipindedir. Bu zaman serisi değişkeni içerisinden düzeltilmiş kapanış fiyatlarını alalım ve seri içerisinde olası bir NA değeri olmasına karşı na.exclude fonksiyonu ile temizleyelim. PerformanceAnalytics kütüphanesi içerisinde, xts tipindeki yapılar için kullanışlı Return.calculate fonksiyonu ile logaritmik getirileri bulalım. Öte yandan xts tipindeki getiri serisinden x adında bir sayısal (numeric) vektör oluşturalım.

price <- quantmod::getSymbols(Symbols = "^GSPC", 
                              src = "yahoo",  
                              from = "2012-01-01", 
                              to= "2017-12-31",
                              auto.assign = FALSE)

close <- price[,"GSPC.Adjusted"] %>% na.exclude

return <- Return.calculate(close, method="log") * 100 

x <- return %>% na.exclude %>% as.data.frame %>% .$GSPC.Adjusted

S&P500 kapanış fiyatları ve logaritmik getiri grafikleri PerformanceAnalytics kütüphanesi içindeki xts yapılarına için kullanılabilen chart.TimeSeries fonksiyonu ile oluşturulmuştur.

par(mfrow=c(1,2))
chart.TimeSeries(close, 
                 col="red",
                 main="S&P500 Kapanış Fiyatı", 
                 date.format="%m-%Y")
chart.TimeSeries(return, 
                 col="blue",
                 main="S&P500 Log-Getiri", 
                 date.format="%m-%Y")

ARCH Etkisi Analizi

Modellemeye geçmeden önce, S&P500 getirilerinin ARCH etkisi gösterip göstermediklerini inceleyelim. Bunun için FinTS kütüphanesi içerisindeki ArchTest fonksiyonu kullanılacaktır. Test sonucuna göre 95% güven seviyesinde S&P500 getirileri ARCH etkisi (volatility clustering) göstermektedir.

FinTS::ArchTest(x)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  x
## Chi-squared = 204.28, df = 12, p-value < 2.2e-16

Ayrıca bu ARCH etkisini otokorelasyon (acf) grafikleri yardımıyla da inceleyebiliriz. Getiri serisinin kendisinde otokorelasyon yok ancak getirilerin karelerinde otokorelasyon var ise getiri serisi ARCH etkisi gösteriyordur. Aşağıdaki otokorelasyon grafikleri ArchTest sonuçlarımızı doğrulamaktadır.

par(mfrow=c(1,2))
acf(x)
acf(x^2)

GARCH(1,1) Modelleme

R ile GARCH modellemeleri için kullanılabilecek en detaylı kütüphanelerin başında rugarch gelmektedir. Fit sonuçlarına göre tüm parametreler istatistiksel olarak anlamlıdır. Standart hatalar (standardized residuals) üzerinden yapılan hata kontrollerinde; Weighted Ljung-Box testine göre hatalarda otokorelasyon problemi yoktur. Weighted ARCH LM testine göre hatalarda ARCH etkisi görülmemektedir. Weighted Person Goodness of Fit testine göre ise standart hatalar, referans dağılım (skew ged) ile aynı dağılımı sergilemektedir. Model bu
kontrolleri başarı ile geçmiştir.

spec <- ugarchspec(mean.model = list(armaOrder=c(0,0), include.mean = TRUE),
                   variance.model = list(model = "fGARCH", submodel="GARCH", garchOrder = c(1, 1)), 
                   distribution = "sged")

fit <- ugarchfit(spec = spec, data = (return %>% na.exclude),  solver="hybrid")
fit
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : fGARCH(1,1)
## fGARCH Sub-Model : GARCH
## Mean Model   : ARFIMA(0,0,0)
## Distribution : sged 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.053117    0.016413   3.2362 0.001211
## omega   0.038552    0.010726   3.5943 0.000325
## alpha1  0.179168    0.033834   5.2955 0.000000
## beta1   0.762452    0.040241  18.9473 0.000000
## skew    0.974339    0.029050  33.5404 0.000000
## shape   1.223343    0.064032  19.1052 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.053117    0.015245   3.4843 0.000493
## omega   0.038552    0.012068   3.1945 0.001401
## alpha1  0.179168    0.036747   4.8756 0.000001
## beta1   0.762452    0.045997  16.5761 0.000000
## skew    0.974339    0.030431  32.0176 0.000000
## shape   1.223343    0.069111  17.7013 0.000000
## 
## LogLikelihood : -1545.076 
## 
## Information Criteria
## ------------------------------------
##                    
## Akaike       2.0571
## Bayes        2.0783
## Shibata      2.0571
## Hannan-Quinn 2.0650
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      2.643  0.1040
## Lag[2*(p+q)+(p+q)-1][2]     2.645  0.1752
## Lag[4*(p+q)+(p+q)-1][5]     4.836  0.1667
## d.o.f=0
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                   0.001105  0.9735
## Lag[2*(p+q)+(p+q)-1][5]  0.366268  0.9762
## Lag[4*(p+q)+(p+q)-1][9]  2.236630  0.8750
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]    0.2950 0.500 2.000  0.5871
## ARCH Lag[5]    0.7123 1.440 1.667  0.8197
## ARCH Lag[7]    2.7434 2.315 1.543  0.5633
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  3.1024
## Individual Statistics:             
## mu     0.1646
## omega  1.4040
## alpha1 0.5891
## beta1  1.0486
## skew   0.2096
## shape  1.1941
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.49 1.68 2.12
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value      prob sig
## Sign Bias           3.3956 0.0007025 ***
## Negative Sign Bias  1.0039 0.3155700    
## Positive Sign Bias  0.1302 0.8964561    
## Joint Effect       17.7683 0.0004910 ***
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     24.79       0.1677
## 2    30     25.78       0.6372
## 3    40     40.75       0.3932
## 4    50     50.75       0.4043
## 
## 
## Elapsed time : 2.019373

Mutlak getirilere karşı Şartlı (conditional) volatilite

plot(fit, which=3)

1% VAR Limitleri

plot(fit, which=2)

Standart Hatalar için Emprical Density

plot(fit, which=8)

Standart Hatalar için QQ-Plot

plot(fit, which=9)

Standart Hatalar için ACF

plot(fit, which=10)