Praca ma na celu przeprowadzenie analizy porównawczej ryzyka oszacowanego za pomocą funkcji warunkowej wariancji w modelach klasy GARCH. Wyznaczono wartości narażone na ryzyko (VaR) w okresach in-sample i out-of-sample. Wykorzystane dane pochodzą ze strony: (https://stooq.pl/) i dotyczą pięciu indeksów: EUR/PLN, USD/PLN, notowań złota (GOLD) oraz akcji firm APPLE i MICROSOFT.
Analizę zaczęto od pobrania niezbędnych danych finansowych z bazy danych stooq dostępnej pod adresem: (https://stooq.pl/) oraz zainstalowania odpowiednich bibliotek w programie RStudio: xts, tseries, fBasics, rugarch, fGarch, FinTS, car.
url_EURPLN <- "https://stooq.com/q/d/l/?s=eurpln&i=d"
url_USDPLN <- "https://stooq.com/q/d/l/?s=usdpln&i=d"
url_MICROSOFT <- "https://stooq.com/q/d/l/?s=msft.us&i=d"
url_APPLE <- "https://stooq.com/q/d/l/?s=aapl.us&i=d"
url_GOLD <- "https://stooq.com/q/d/l/?s=gc.f&i=d"
Ponieważ zmienne zawierają obserwacje z różnych okresów czasu dokonano następujących transformacji:
date <- max(min(EURPLN$Date), min(USDPLN$Date), min(MICROSOFT$Date), min(APPLE$Date), min(GOLD$Date))
EURPLN <- EURPLN[as.Date(date) <= EURPLN$Date, ]
USDPLN <- USDPLN[as.Date(date) <= USDPLN$Date, ]
MICROSOFT <- MICROSOFT[as.Date(date) <= MICROSOFT$Date, ]
APPLE <- APPLE[as.Date(date) <= APPLE$Date, ]
GOLD <- GOLD[as.Date(date) <= GOLD$Date, ]
m1 <- merge(EURPLN, USDPLN, by="Date")
m2 <- merge(m1, MICROSOFT, by="Date")
m3 <- merge(m2, APPLE, by="Date")
m4 <- merge(m3, GOLD, by="Date")
Następnie policzono logarytmiczne stopy zwrotów:
m4$r_EURPLN <- diff.xts(log(m4$EURPLN))
m4$r_USDPLN <- diff.xts(log(m4$USDPLN))
m4$r_MICROSOFTr <- diff.xts(log(m4$MICROSOFT))
m4$r_APPLEr <- diff.xts(log(m4$APPLE))
m4$r_GOLDr <- diff.xts(log(m4$GOLD))
Na ich podstawie utworzono uśrednione stopy zwrotu oraz uśrednione notowania zgodnie z założeniami portfela równoważnego. Tak, że każdy instrument będzie miał taką samą wagę:
notowania <-(m4$EURPLN+m4$USDPLN+m4$MICROSOFT+m4$APPLE+m4$GOLD)/5
zwroty <- (m4$r_EURPLN+m4$r_USDPLN+m4$r_MICROSOFT+m4$r_APPLE+m4$r_GOLD)/5
Następnie utworzono macierz z danymi o 4 kolumnach: Data, Zwroty, Notowania, nr obserwacji i 6826 wierszach (ostateczna liczba obserwacji). Dalsza analiza będzie opierać się wyłącznie na elementach uzyskanej macierzy.
Portfel <- data.frame(m4$Date, zwroty, notowania, 1:length(m4$EURPLN))
colnames(Portfel) <- c("Date", "Zwroty", "Notowania", "obs")
Po obrobieniu danych sporządzono wykresy dla notowań i stóp zwrotów portfela:
Na pierwszy rzut oka widać, że szereg wydaje się być niestacjonarny. Możemy wyróżnić okresy o zwiększonej zmienności, po których następują okresy gdzie ta zmienność jest znacznie mniejsza. Efekt ten nazywany jest grupowaniem wariancji.
Analizę zaczęto od sprawdzenia czy szereg czasowy charakteryzuje się rozkładem normalnym składnika losowego. Pomocnym narzędziem do analizy w tym przypadku jest histogram:
hist(Portfel$Zwroty, prob = T, breaks = 100, main = "Histogram dla zwrotów")
curve(dnorm(x, mean = mean(Portfel$Zwroty, na.rm = T), sd = sd(Portfel$Zwroty, na.rm = T)),
col = "darkblue", lwd = 2, add = TRUE)
Rozkład portfela okazał się być leptokurtyczny. Wskazuje na to wyższy szczyt funkcji gęstości w porównaniu z rozkładem normalnym i występowanie tzn. “grubych ogonów”.
Podstawowe statystyki dla zwrotów z portfela wyglądają następująco:
basicStats(Portfel$Zwroty)
## X..Portfel.Zwroty
## nobs 6827.000000
## NAs 1.000000
## Minimum -0.161504
## Maximum 0.180071
## 1. Quartile -0.004015
## 3. Quartile 0.005009
## Mean 0.000737
## Median 0.000564
## Sum 5.030391
## SE Mean 0.000125
## LCL Mean 0.000491
## UCL Mean 0.000983
## Variance 0.000107
## Stdev 0.010364
## Skewness 1.101571
## Kurtosis 41.229926
Uzyskane statystyki potwierdzają tezę o braku rozkładu normalnego składnika losowego. Uzyskany współczynnik kurtozy świadczy o leptokurtyczności rozkładu.
Test Jarque-Bera na normalność rozkładu składnika losowego:
jarque.bera.test(na.omit(Portfel$Zwroty))
##
## Jarque Bera Test
##
## data: na.omit(Portfel$Zwroty)
## X-squared = 485170, df = 2, p-value < 2.2e-16
Na podstawie powyższych wyników (p=value < 0,05) odrzucono hipotezę zerową mówiącą o normalności składnika losowego.
Wniosek: Szereg nie charakteryzuje się normalnością składnika losowego.
W zaobserowowaniu występowania zjawiska autokorelacji składnika losowego pomocne są wykresy ACF oraz PACF.
Wykresy ACF i PACF dla zwrotów wyglądają następująco:
acf(Portfel$Zwroty, lag.max = 36, na.action = na.pass,
col = "darkblue", lwd = 7,
main = "ACF dla zwrotów")
pacf(Portfel$Zwroty, lag.max = 36, na.action = na.pass,
col = "darkblue", lwd = 7,
main = "PACF dla zwrotów")
Zarówno dla wykresu ACF jak i PACF zaobserwowano istotne statystycznie opóźnienia. Na tej podstawie można stwierdzić, że zwroty zależą istotnie od swoich przeszłych wartości. Składnik losowy nie jest białym szumem. Podlega on zjawisku autokorelacji.
Oraz dla kwadratów zwrotów:
acf(Portfel$Zwroty^2, lag.max = 100, na.action = na.pass,
col = "darkblue", lwd = 7,
main = "ACF dla kwadratów zwrotów")
pacf(Portfel$Zwroty^2, lag.max = 100, na.action = na.pass,
col = "darkblue", lwd = 7,
main = "PACF dla kwadratów zwrotów")
Wykresy ACF i PACF dla kwadratów zwrotów wskazują na występowanie zależności wyższego rzędu. Szereg podlega zjawisku autokorelacji składnika losowego.
Dla większej pewności przeprowadzono test Durbina-Watsona:
durbinWatsonTest(lm(Portfel$Zwroty ~ 1), max.lag = 5)
## lag Autocorrelation D-W Statistic p-value
## 1 0.01609411 1.967765 0.17
## 2 0.04158131 1.915993 0.00
## 3 0.05656816 1.885936 0.00
## 4 0.10558077 1.787902 0.00
## 5 0.05524975 1.887969 0.00
## Alternative hypothesis: rho[lag] != 0
durbinWatsonTest(lm(Portfel$Zwroty^2 ~ 1), max.lag = 5)
## lag Autocorrelation D-W Statistic p-value
## 1 0.15700665 1.685982 0.000
## 2 0.20258160 1.594773 0.000
## 3 0.12695772 1.746016 0.002
## 4 0.11279966 1.774326 0.008
## 5 0.08382853 1.832229 0.008
## Alternative hypothesis: rho[lag] != 0
Na podstawie uzyskanych wyników możemy zaaobserwować zjawisko autokorelacji dla drugiego opóźnienia i dalej (dla zwrotów) oraz autokorelację dla wszystkich przedstawionych opóźnień (dla kwadratów zwrotów).
W dalszej analizie zastosowano test na wystepowanie efektów ARCH:
ArchTest(Portfel$Zwroty, lags = 5)
##
## ARCH LM-test; Null hypothesis: no ARCH effects
##
## data: Portfel$Zwroty
## Chi-squared = 452.27, df = 5, p-value < 2.2e-16
Dla powyższej statystyki wynoszącej 452,19 p-value jest mniejsze od przyjętego poziomu istotności 5% oznacza to, że należy odrzucić hipotezę zerową mówiącą o braku efektów ARCH.
W modelu GARCH(p,q): \[\sigma_t^2 = \omega +\sum_{j=1}^q\alpha_j u_{t-j}^2 +\sum_{j=1}^p \beta_j\sigma_{t-j}^2\]
Estymacja modelu GARCH(1,1):
specc <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = T),
distribution.model = "norm")
garch11 <- ugarchfit(spec = specc, data = na.omit(Portfel$Zwroty))
garch11
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(0,0,0)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000571 0.000080 7.1774 0.000000
## omega 0.000000 0.000000 2.1499 0.031564
## alpha1 0.067874 0.004581 14.8166 0.000000
## beta1 0.931115 0.004400 211.6195 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000571 0.000092 6.18699 0.00000
## omega 0.000000 0.000001 0.36102 0.71808
## alpha1 0.067874 0.043372 1.56493 0.11760
## beta1 0.931115 0.039949 23.30751 0.00000
##
## LogLikelihood : 23312.77
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.8294
## Bayes -6.8254
## Shibata -6.8294
## Hannan-Quinn -6.8280
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 3.683 0.05498
## Lag[2*(p+q)+(p+q)-1][2] 4.098 0.07097
## Lag[4*(p+q)+(p+q)-1][5] 8.031 0.02896
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.007842 0.9294
## Lag[2*(p+q)+(p+q)-1][5] 0.109301 0.9977
## Lag[4*(p+q)+(p+q)-1][9] 0.568139 0.9977
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.01051 0.500 2.000 0.9183
## ARCH Lag[5] 0.09490 1.440 1.667 0.9878
## ARCH Lag[7] 0.53201 2.315 1.543 0.9754
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 630.7702
## Individual Statistics:
## mu 0.3860
## omega 82.9442
## alpha1 0.7915
## beta1 0.8179
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.07 1.24 1.6
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.03137 0.9750
## Negative Sign Bias 1.07741 0.2813
## Positive Sign Bias 0.84383 0.3988
## Joint Effect 1.94702 0.5835
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 136.3 9.339e-20
## 2 30 162.7 1.494e-20
## 3 40 175.0 3.888e-19
## 4 50 185.7 8.657e-18
##
##
## Elapsed time : 0.985178
Parametry modelu GARCH(1,1):
garch11@fit$coef
## mu omega alpha1 beta1
## 5.711672e-04 3.725621e-07 6.787436e-02 9.311150e-01
Wszystkie parametry modelu są istotne i dodatnie. Suma parametrów alpha1 i beta1 jest mniejsza od jedynki.
Wybieramy przedział czasowy:
Portfel2 <- Portfel[Portfel$Date <= as.Date("2009-01-01"), ]
Portfel2 <- Portfel2[as.Date("2001-01-01") <= Portfel2$Date, ]
Wystandaryzowane zwroty otrzymano w następujący sposób:
Portfel2$rstd <- (Portfel2$Zwroty - mean(Portfel2$Zwroty, na.rm=T)) /
sd(Portfel2$Zwroty ,na.rm = T)
tail(Portfel2$rstd)
## [1] 0.6593505 -1.0264979 -0.3226919 0.7732970 0.7198683 -0.5391480
Histogram wystandaryzowanych zwrotów:
hist(Portfel2$rstd, prob = T, breaks = 40, main ="Histogram dla standaryzowanych zwrotów")
curve(dnorm(x, mean = mean(Portfel2$rstd, na.rm = T),
sd = sd(Portfel2$rstd, na.rm = T)),
col = "darkblue", lwd = 2, add = TRUE)
Szczyt funkcji gęstości w dalszym ciągu jest wyższy niż w rozkładzie normalnym.
Statystyki opisowe:
basicStats(Portfel2$rstd)
## X..Portfel2.rstd
## nobs 1972.000000
## NAs 0.000000
## Minimum -5.147880
## Maximum 6.069680
## 1. Quartile -0.556515
## 3. Quartile 0.548739
## Mean 0.000000
## Median 0.007951
## Sum 0.000000
## SE Mean 0.022519
## LCL Mean -0.044163
## UCL Mean 0.044163
## Variance 1.000000
## Stdev 1.000000
## Skewness 0.120570
## Kurtosis 3.037720
Kurtoza o wartości 3,0377 świadczy o leptokurtyczności rozkładu.
Jako pierwszy oszacowano model GARCH.
Estymacja modelu GARCH(1,1):
spec0 <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = T),
distribution.model = "norm")
portfel2.garch11 <- ugarchfit(spec = spec0, data = na.omit(Portfel2$Zwroty))
portfel2.garch11
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(0,0,0)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000537 0.000167 3.21079 0.001324
## omega 0.000001 0.000001 0.89192 0.372439
## alpha1 0.043007 0.007934 5.42091 0.000000
## beta1 0.950543 0.008360 113.69569 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000537 0.000208 2.57824 0.009931
## omega 0.000001 0.000005 0.10600 0.915579
## alpha1 0.043007 0.083527 0.51488 0.606636
## beta1 0.950543 0.085295 11.14414 0.000000
##
## LogLikelihood : 6693.773
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.7848
## Bayes -6.7734
## Shibata -6.7848
## Hannan-Quinn -6.7806
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 9.077 0.0025880
## Lag[2*(p+q)+(p+q)-1][2] 11.237 0.0009004
## Lag[4*(p+q)+(p+q)-1][5] 13.292 0.0012702
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.08694 0.7681
## Lag[2*(p+q)+(p+q)-1][5] 0.89836 0.8822
## Lag[4*(p+q)+(p+q)-1][9] 3.60353 0.6566
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.5538 0.500 2.000 0.4568
## ARCH Lag[5] 1.5246 1.440 1.667 0.5859
## ARCH Lag[7] 4.3568 2.315 1.543 0.2980
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 433.903
## Individual Statistics:
## mu 0.06049
## omega 80.84532
## alpha1 0.18482
## beta1 0.11430
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.07 1.24 1.6
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.8195 0.4126
## Negative Sign Bias 0.1142 0.9091
## Positive Sign Bias 0.5515 0.5813
## Joint Effect 0.8078 0.8476
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 38.85 0.004616
## 2 30 43.60 0.040047
## 3 40 62.89 0.009027
## 4 50 73.13 0.014309
##
##
## Elapsed time : 0.9271128
Parametry modelu GARCH(1,1):
portfel2.garch11@fit$coef
## mu omega alpha1 beta1
## 5.370784e-04 5.198124e-07 4.300678e-02 9.505431e-01
Otrzymano model, w którym parametr omega jest nieistotny. Wszystkie parametry są dodatnie, a suma parametrów alfa i beta jest mniejsza od 1.
Wykres ACF kwadratów wystandaryzowanych reszt:
plot(portfel2.garch11, which = 10)
Na wykresie obserwujemy istotne statystycznie słupki co świadczy o występowaniu autokorelacji. Test Ljung-Box’dla kwadratów reszt jednak wskazuje, że zjawisko to nie występuje dla kwadratów wystandaryzowanych reszt.
Model EGARCH umożliwia opisanie sytuacji, w której korelacja wzrasta w większym stopniu gdy stopy zwrotu spadają, niż gdy rosną w takim samym stopniu
Model EGARCH(1,1):
spec = ugarchspec(variance.model = list(model ="eGARCH",
garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = F),
distribution.model = "norm")
portfel2.egarch11 <- ugarchfit( spec = spec, data = na.omit(Portfel2$rstd))
portfel2.egarch11
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : eGARCH(1,1)
## Mean Model : ARFIMA(0,0,0)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## omega 0.000812 0.002028 0.4002 0.689011
## alpha1 -0.034192 0.011278 -3.0318 0.002431
## beta1 0.985646 0.001348 731.2509 0.000000
## gamma1 0.117125 0.017096 6.8509 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## omega 0.000812 0.002730 0.2973 0.766237
## alpha1 -0.034192 0.015227 -2.2455 0.024734
## beta1 0.985646 0.000494 1996.1484 0.000000
## gamma1 0.117125 0.022430 5.2218 0.000000
##
## LogLikelihood : -2610.271
##
## Information Criteria
## ------------------------------------
##
## Akaike 2.6514
## Bayes 2.6627
## Shibata 2.6514
## Hannan-Quinn 2.6556
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 7.424 0.006437
## Lag[2*(p+q)+(p+q)-1][2] 9.211 0.003091
## Lag[4*(p+q)+(p+q)-1][5] 10.941 0.005265
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.08219 0.7743
## Lag[2*(p+q)+(p+q)-1][5] 1.47588 0.7458
## Lag[4*(p+q)+(p+q)-1][9] 4.18856 0.5572
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 1.600 0.500 2.000 0.2059
## ARCH Lag[5] 2.518 1.440 1.667 0.3677
## ARCH Lag[7] 5.156 2.315 1.543 0.2092
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 0.7169
## Individual Statistics:
## omega 0.16532
## alpha1 0.10663
## beta1 0.08191
## gamma1 0.29364
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.07 1.24 1.6
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.43854 0.6610
## Negative Sign Bias 0.32517 0.7451
## Positive Sign Bias 0.05323 0.9576
## Joint Effect 0.84274 0.8392
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 27.92 0.08500
## 2 30 47.22 0.01768
## 3 40 50.35 0.10523
## 4 50 69.33 0.02948
##
##
## Elapsed time : 0.283242
Parametr omega okazał się być nieistotny, a parametr alfa jest ujemny.
plot(portfel2.egarch11, which = 10)
Nie możemy też odrzucić autokorelacji dla wystandaryzowanych zwrotów.
Model TGARCH w odróżnieniu od modelu GARCH zawiera zmienną zero-jedynkową która przyjmuje wartość 1 gdy reszta w okresie \((t-j)\) jest ujemna, a 0 dla pozostałych przypadków. Tak więc pozwala wyróżnić odmienny wpływ dodatnich i ujemnych szoków na rynku.
Estymacja modelu TGARCH(1,1):
spec2 <- ugarchspec(variance.model = list(model = "fGARCH", garchOrder = c(1, 1), submodel = "TGARCH"),
mean.model = list(armaOrder = c(0, 0), include.mean = F),
distribution.model = "norm")
portfel2.tgarch11 <- ugarchfit(spec = spec2, data = na.omit(Portfel2$Zwroty))
portfel2.tgarch11
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : fGARCH(1,1)
## fGARCH Sub-Model : TGARCH
## Mean Model : ARFIMA(0,0,0)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## omega 0.000188 0.000077 2.4514 0.014231
## alpha1 0.073438 0.014435 5.0874 0.000000
## beta1 0.922200 0.018688 49.3478 0.000000
## eta11 0.345931 0.104942 3.2964 0.000979
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## omega 0.000188 0.000140 1.3454 0.178488
## alpha1 0.073438 0.027208 2.6992 0.006951
## beta1 0.922200 0.036071 25.5661 0.000000
## eta11 0.345931 0.127831 2.7061 0.006807
##
## LogLikelihood : 6680.968
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.7718
## Bayes -6.7604
## Shibata -6.7718
## Hannan-Quinn -6.7676
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 6.540 0.010549
## Lag[2*(p+q)+(p+q)-1][2] 8.254 0.005541
## Lag[4*(p+q)+(p+q)-1][5] 10.073 0.008817
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.09821 0.7540
## Lag[2*(p+q)+(p+q)-1][5] 1.64674 0.7038
## Lag[4*(p+q)+(p+q)-1][9] 5.61547 0.3448
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.981 0.500 2.000 0.32194
## ARCH Lag[5] 2.822 1.440 1.667 0.31660
## ARCH Lag[7] 6.861 2.315 1.543 0.09303
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 0.7204
## Individual Statistics:
## omega 0.27392
## alpha1 0.35737
## beta1 0.29677
## eta11 0.09285
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.07 1.24 1.6
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.01170 0.9907
## Negative Sign Bias 0.69051 0.4900
## Positive Sign Bias 0.04743 0.9622
## Joint Effect 0.71518 0.8696
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 29.42 0.0596612
## 2 30 52.91 0.0043095
## 3 40 74.82 0.0004883
## 4 50 90.02 0.0003215
##
##
## Elapsed time : 0.5234671
Parametry modelu TGARCH(1,1):
portfel2.tgarch11@fit$coef
## omega alpha1 beta1 eta11
## 0.0001878577 0.0734382783 0.9221996372 0.3459310302
Model spełnia założenia dotyczące parametrów. Na podstawie testu Ljung-Box’a dla kwadratów wystandaryzowanych reszt nie ma podstaw do odrzucenia hipotezy zerowej o braku autokorelacji.
Wykres ACF kwadratów wystandaryzowanych reszt:
plot(portfel2.tgarch11, which = 10)
Model GARCH-t różni się od modelu GARCH rozkładem składnika losowego. W tym przypadku przyjmujemy dystrybuantę rozkładu t-studenta.
Model GARCH-t(1,1):
spec3 <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = F),
distribution.model = "std")
portfel2.garcht11 <- ugarchfit(spec=spec3, data=na.omit(Portfel2$Zwroty))
portfel2.garcht11
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(0,0,0)
## Distribution : std
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## omega 0.000001 0.000000 1.5920 0.11138
## alpha1 0.045215 0.005230 8.6461 0.00000
## beta1 0.947932 0.005556 170.6101 0.00000
## shape 8.279357 1.300662 6.3655 0.00000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## omega 0.000001 0.000001 0.48612 0.62688
## alpha1 0.045215 0.029697 1.52254 0.12787
## beta1 0.947932 0.029901 31.70264 0.00000
## shape 8.279357 1.873535 4.41911 0.00001
##
## LogLikelihood : 6719.297
##
## Information Criteria
## ------------------------------------
##
## Akaike -6.8106
## Bayes -6.7993
## Shibata -6.8107
## Hannan-Quinn -6.8065
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 8.896 0.002858
## Lag[2*(p+q)+(p+q)-1][2] 10.983 0.001051
## Lag[4*(p+q)+(p+q)-1][5] 13.093 0.001434
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 0.06459 0.7994
## Lag[2*(p+q)+(p+q)-1][5] 0.62932 0.9360
## Lag[4*(p+q)+(p+q)-1][9] 3.13534 0.7364
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.6163 0.500 2.000 0.4324
## ARCH Lag[5] 1.0367 1.440 1.667 0.7221
## ARCH Lag[7] 3.7798 2.315 1.543 0.3794
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 420.9834
## Individual Statistics:
## omega 85.71975
## alpha1 0.17963
## beta1 0.12263
## shape 0.03499
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.07 1.24 1.6
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.7161 0.4740
## Negative Sign Bias 0.2506 0.8021
## Positive Sign Bias 0.5682 0.5700
## Joint Effect 0.5762 0.9019
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 21.61 0.3041
## 2 30 36.42 0.1617
## 3 40 35.91 0.6116
## 4 50 57.72 0.1842
##
##
## Elapsed time : 0.233458
Parametry modelu GARCH-t(1,1):
portfel2.garcht11@fit$coef
## omega alpha1 beta1 shape
## 5.755540e-07 4.521518e-02 9.479316e-01 8.279357e+00
Parametr omega jest nieistotny. Odrzucamy hipotezę o korelacji dla kwadratów wystandaryzowanych reszt.
Wykres ACF kwadratów wystandaryzowanych reszt:
plot(portfel2.garcht11, which = 10)
| GARCH(1,1) | EGARCH(1,1) | TGARCH(1,1) | GARCH-t(1,1) | |
|---|---|---|---|---|
| Akaike | -6.7848 | 2.6514 | -6.7718 | -6.8106 |
| Bayes | -6.7734 | 2.6627 | -6.7604 | -6.7993 |
| Shibata | -6.7848 | 2.6514 | -6.7718 | -6.8107 |
| Hannan-Quinn | -6.7806 | 2.6556 | -6.7676 | -6.8065 |
Wszystkie kryteria wskazją model GARCH-t(1,1)
VaR dla modeli:
q011 <- quantile(Portfel2$rstd, 0.01, na.rm = T)
Portfel2$VaR <- q011 * portfel2.garch11@fit$sigma
Portfel2$VaR2 <- q011 * portfel2.egarch11@fit$sigma
Portfel2$VaR3 <- q011 * portfel2.tgarch11@fit$sigma
Portfel2$VaR4 <- q011 * portfel2.garcht11@fit$sigma
tail(Portfel2)
## Date Zwroty Notowania obs rstd VaR
## 4644 2008-12-19 0.006221930 174.7218 4644 0.6593505 -0.04843197
## 4645 2008-12-22 -0.008823767 176.4554 4645 -1.0264979 -0.04734876
## 4646 2008-12-23 -0.002542507 174.8187 4646 -0.3226919 -0.04646025
## 4647 2008-12-29 0.007238869 182.4363 4647 0.7732970 -0.04536247
## 4648 2008-12-30 0.006762034 181.5480 4648 0.7198683 -0.04440405
## 4649 2008-12-31 -0.004474314 182.9019 4649 -0.5391480 -0.04345386
## VaR2 VaR3 VaR4
## 4644 -5.164147 -0.04716463 -0.04846911
## 4645 -4.946163 -0.04472835 -0.04734831
## 4646 -4.866968 -0.04393412 -0.04638345
## 4647 -4.662210 -0.04162871 -0.04522139
## 4648 -4.489948 -0.03974688 -0.04424250
## 4649 -4.323873 -0.03795344 -0.04327176
Wykresy dziennych stóp zwrotu oraz VaR:
W ilu przypadkach straty przekroczyły zakładany poziom VaR?
Dla modelu GARCH(1,1) w 0.7099391 %, dla modelu EGARCH(1,1) 0%, dla modelu TGARCH(1,1) w 0.7606491 % i dla modelu GARCH-t(1,1) w 0.7099391 %.
Próba do ostatniego roku:
Portfel3 <- Portfel[Portfel$Date <= as.Date("2009-01-01"), ]
Portfel3 <- Portfel3[as.Date("2008-01-01") <= Portfel3$Date, ]
Liczymy VaR:
Portfel3$rstd <- (Portfel3$Zwroty - mean(Portfel3$Zwroty, na.rm = T)) /
sd(Portfel3$Zwroty, na.rm = T)
q012 <- quantile(Portfel3$rstd, 0.01, na.rm = T)
portfel3.garch11 <- ugarchfit(spec = spec0, data = na.omit(Portfel3$Zwroty))
Portfel3$VaR <- q012 * portfel3.garch11@fit$sigma
portfel3.egarch11 <- ugarchfit(spec = spec, data = na.omit(Portfel3$Zwroty))
Portfel3$VaR2 <- q012 * portfel3.egarch11@fit$sigma
portfel3.tgarch11 <- ugarchfit(spec = spec2, data = na.omit(Portfel3$Zwroty))
Portfel3$VaR3 <- q012 * portfel3.tgarch11@fit$sigma
portfel3.garcht11 <- ugarchfit(spec = spec3, data = na.omit(Portfel3$Zwroty))
Portfel3$VaR4 <- q012 * portfel3.garcht11@fit$sigma
tail(Portfel3)
## Date Zwroty Notowania obs rstd VaR
## 4644 2008-12-19 0.006221930 174.7218 4644 0.5579876 -0.04718610
## 4645 2008-12-22 -0.008823767 176.4554 4645 -0.6194063 -0.04469150
## 4646 2008-12-23 -0.002542507 174.8187 4646 -0.1278693 -0.04246281
## 4647 2008-12-29 0.007238869 182.4363 4647 0.6375676 -0.03990151
## 4648 2008-12-30 0.006762034 181.5480 4648 0.6002531 -0.03817349
## 4649 2008-12-31 -0.004474314 182.9019 4649 -0.2790419 -0.03652832
## VaR2 VaR3 VaR4
## 4644 -0.04890401 -0.05038196 -0.04834774
## 4645 -0.04605948 -0.04772706 -0.04609233
## 4646 -0.04525578 -0.04764281 -0.04425722
## 4647 -0.04271115 -0.04569132 -0.04203271
## 4648 -0.04052742 -0.04337031 -0.04029781
## 4649 -0.03847442 -0.04117864 -0.03863161
Na wykresach:
sigma.forecast <- ugarchforecast(portfel2.egarch11, n.ahead = 1)
sigma.forecast2 <- sigma.forecast@forecast$sigmaFor[1, 1]
sigma.forecast3 <- ugarchforecast(portfel2.tgarch11, n.ahead = 1)
sigma.forecast4 <- sigma.forecast@forecast$sigmaFor[1, 1]
sigma.forecast5 <- ugarchforecast(portfel2.garcht11, n.ahead = 1)
sigma.forecast6 <- sigma.forecast3@forecast$sigmaFor[1, 1]
Jednodniowa prognoza VaR dla EGARCH(1,1) wynosi: -4.195701910^{6}, dla TGARCH(1,1) wynosi: -4.1957019, a dla GARCH-t -3.659708110^{4}.
Prognoza dla całego okresu out-of-sample:
start <- Portfel$obs[Portfel$Date == as.Date("2008-01-02")]
finish <- Portfel$obs[Portfel$Date == as.Date("2009-01-05")]
Portfel4 <- Portfel[start:finish, ]
VaR <- rep(NA, times = finish - start + 1)
VaR2 <- rep(NA, times = finish - start + 1)
VaR3 <- rep(NA, times = finish - start +1)
for (k in start:finish) {
tmp.data <- Portfel[Portfel$obs <= (k - 1), ]
tmp.data <- tmp.data[as.Date("2001-01-01") <= tmp.data$Date, ]
tmp.data$rstd <- (tmp.data$Zwroty - mean(tmp.data$Zwroty, na.rm = T)) /
sd(tmp.data$Zwroty, na.rm = T)
q01 <- quantile(tmp.data$rstd, 0.01, na.rm = T)
tmp.egarch11 <- ugarchfit(spec = spec, data = na.omit(tmp.data$Zwroty))
sigma.forecast <- ugarchforecast(tmp.egarch11, n.ahead = 1)
sigma.forecast2 <- sigma.forecast@forecast$sigmaFor[1, 1]
VaR[k - start + 1] <- q01 * sigma.forecast2
}
Portfel4$VaR <- VaR
for (k in start:finish) {
tmp.data <- Portfel[Portfel$obs <= (k - 1), ]
tmp.data <- tmp.data[as.Date("2000-01-01") <= tmp.data$Date, ]
tmp.data$rstd <- (tmp.data$Zwroty - mean(tmp.data$Zwroty, na.rm = T)) /
sd(tmp.data$Zwroty, na.rm = T)
q01 <- quantile(tmp.data$rstd, 0.01, na.rm = T)
tmp.tgarch11 <- ugarchfit(spec = spec2, data = na.omit(tmp.data$Zwroty))
sigma.forecast <- ugarchforecast(tmp.tgarch11, n.ahead = 1)
sigma.forecast2 <- sigma.forecast@forecast$sigmaFor[1, 1]
VaR2[k - start + 1] <- q01 * sigma.forecast2
}
Portfel4$VaR2 <- VaR2
for (k in start:finish) {
tmp.data <- Portfel[Portfel$obs <= (k - 1), ]
tmp.data <- tmp.data[as.Date("2000-01-01") <= tmp.data$Date, ]
tmp.data$rstd <- (tmp.data$Zwroty - mean(tmp.data$Zwroty, na.rm = T)) /
sd(tmp.data$Zwroty, na.rm = T)
q01 <- quantile(tmp.data$rstd, 0.01, na.rm = T)
tmp.garcht11 <- ugarchfit(spec = spec3, data = na.omit(tmp.data$Zwroty))
sigma.forecast <- ugarchforecast(tmp.garcht11, n.ahead = 1)
sigma.forecast1 <- sigma.forecast@forecast$sigmaFor[1, 1]
VaR3[k - start + 1] <- q01 * sigma.forecast1
}
Portfel4$VaR3 <- VaR3
Wykresy:
Dla modelu EGARCH(1,1) straty przekroczyły wymagany poziom VaR w 1.6260163\(\%\), dla modelu TGARCH(1,1) w 2.0325203\(\%\), a dla GARCH-t(1,1) 2.0325203\(\%\)
Praca przedstawia analizę portfela równoważnego o pięciu instrumentach. Szereg czasowy dotyczący danych finansowych cechuje się autkorelacją składnika losowego oraz leptokurtycznością rozkładu. Zauważono, że w szeregu pojawiają się efekty ARCH. Z tego powodu do modelowania portfela wykorzystano model GARCH i jego rozszerzenia (EGARCH, TGARCH, GARCH-t). Kryteria informacyjne jako model najlepiej dopasowany wskazały model GARCH-t(1,1) Następnie obliczono wartości narażone na ryzyko (VaR) dla tych modeli w okresach in-sample i out-of-sample.