
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)