Value-at-risk

Modele GARCH w R

Kris Boudt

Professor of finance and econometrics

Value-at-risk

  • Popularna miara ryzyka spadkowego: 5% value-at-risk. Kwantyl 5% rozkładu stóp zwrotu to najlepsza stopa zwrotu w 5% najgorszych scenariuszy.
    Rozkład dziennych stóp zwrotu w ciągu roku
Modele GARCH w R

Rozkład dziennych stóp zwrotu w ciągu roku

Modele GARCH w R

Potrzebne jest podejście prospektywne

  • Kwantyle z kroczących okien stóp zwrotu mają charakter retrospektywny:
    • pytanie ex post: jaki był kwantyl 5% dziennych stóp zwrotu w ciągu ostatniego roku?
    • pytanie ex ante: jaki jest kwantyl 5% prognozowanego rozkładu przyszłej stopy zwrotu?
  • Prospektywne zarządzanie ryzykiem wykorzystuje prognozowane kwantyle z estymacji GARCH.
  • Jak? Metoda quantile() zastosowana do obiektu ugarchroll.
Modele GARCH w R

Procedura uzyskiwania prognozowanych kwantyli 5% z ugarchroll

ugarchspec(): Określ model GARCH do zastosowania

garchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
                        variance.model = list(model = "gjrGARCH"),
                        distribution.model = "sstd")

ugarchroll(): Estymacja modelu GARCH na kroczących próbkach

garchroll <- ugarchroll(garchspec, data = sp500ret, n.start = 2500, 
                        refit.window = "moving", refit.every = 100)

quantile(): Oblicz prognozowany kwantyl

garchVaR <- quantile(garchroll, probs = 0.05)

Można wybrać inne prawdopodobieństwo straty: popularne są też 1% i 2,5%

Modele GARCH w R

Wykres value-at-risk dla poziomu prawdopodobieństwa straty 5%

actual <- xts(as.data.frame(garchroll)$Realized, time(garchVaR))
VaRplot(alpha = 0.05, actual = actual, VaR = garchVaR)

Rozkład dziennych stóp zwrotu w ciągu roku

Modele GARCH w R

Przekroczenie i pokrycie VaR

Przekroczenie VaR następuje, gdy rzeczywista stopa zwrotu jest niższa niż przewidywany value-at-risk: $ R_t \ < {VaR}_t$.

Częstość przekroczeń VaR nazywana jest pokryciem VaR.

# Calculation of coverage for S&P 500 returns and 5% probability level
mean(actual < garchVaR)
0.05159143
Modele GARCH w R

Pokrycie VaR a walidacja modelu

  • Interpretacja pokrycia VaR dla poziomu prawdopodobieństwa straty $\alpha$ (np. 5%):
    • Prawidłowy model ma pokrycie bliskie poziomowi $\alpha$.
    • Jeśli pokrycie $\gg$ $\alpha$: zbyt wiele przekroczeń – przewidywany kwantyl powinien być bardziej ujemny. Ryzyko straty zostało niedoszacowane.
    • Jeśli pokrycie $\ll$ $\alpha$: zbyt mało przekroczeń – przewidywany kwantyl był zbyt ujemny. Ryzyko straty zostało przeszacowane.
Modele GARCH w R

Czynniki pogarszające wyniki modelu

distribution.model = "std" zamiast distribution.model = "sstd":

garchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
                        variance.model = list(model = "gjrGARCH"),
                        distribution.model = "std")

Estymacja krocząca i prognoza VaR 5%:

garchroll <- ugarchroll(garchspec, data = sp500ret, n.start = 2500, 
                        refit.window = "moving", refit.every = 100)
garchVaR <- quantile(garchroll, probs = 0.05)
mean(actual < garchVaR) # returns 0.05783233
Modele GARCH w R

Dalsze pogorszenie wyników

variance.model = list(model = "sGARCH")

zamiast

variance.model = list(model = "gjrGARCH"):

garchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
                        variance.model = list(model = "sGARCH"),
                        distribution.model = "std")

Estymacja krocząca i prognoza VaR 5%:

garchroll <- ugarchroll(garchspec, data = sp500ret, n.start = 2500, 
                        refit.window = "moving", refit.every = 100)
garchVaR <- quantile(garchroll, probs = 0.05)
mean(actual < garchVaR) # returns 0.06074475
Modele GARCH w R

Jeszcze większe pogorszenie wyników

refit.every = 1000

zamiast

refit.every = 100:

garchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
                        variance.model = list(model = "sGARCH"),
                        distribution.model = "std")
garchroll <- ugarchroll(garchspec, data = sp500ret, n.start = 2500, 
                        refit.window = "moving", refit.every = 1000)
garchVaR <- quantile(garchroll, probs = 0.05)
mean(actual < garchVaR) # returns 0.06199293
Modele GARCH w R

Ryzyko spadkowe to myślenie o prognozowanych kwantylach.

Modele GARCH w R

Preparing Video For Download...