Wstęp

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.

Dane

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")

Analiza danych

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.

Test normalności rozkładu

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.

Test na występowanie autokorelacji

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).

Test na występowanie efektów ARCH

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.

Model GARCH

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.

Analiza dla podpróbki (standaryzacja)

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

Statystyki dla wystandaryzowanych zwrotów

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.

Oszacowania modeli klasy GARCH

Jako pierwszy oszacowano model GARCH.

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

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

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

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)

Kryteria informacyjne

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)

Wartość narażona na ryzyko (VaR) in-sample

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:

Wartość narażona na ryzyko (VaR) out-of-sample

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\(\%\)

Podsumowanie

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.