Tutkitaan aikasarjaa SP500 osakeindeksin päivittäisistä päätoskursseista ajalta 1950-01-03 -- 2014-08-28.
Lue data R:ään ja muuta hintojen aikasarja tuottojen aikasarjaksi.
file<-"http://cc.oulu.fi/~jklemela/marketrisk/sp500.csv" data<-read.csv(file=file) sp500<-data[,7] sp500<-sp500[length(sp500):1] plot(sp500,type="l") pituus<-length(sp500) tuotto<-log(sp500[2:pituus])-log(sp500[1:(pituus-1)]) plot(tuotto,type="l")
Oletetaan, että portfolio koostuu 10 kappaleesta SP500 indeksiosuutta. Oletetaan, että eletään päivää 2014-08-28, jolloin yhden indeksiosuuden arvo on 1996.74 USD. Laske VaR yhden paivan horisontilla kun luottamustaso on 0.95 ja 0.99 kayttaen GARCH(1,1)-mallia.
# 1: Lasketaan historiallisesti simuloidut tappiot St<-sp500[length(sp500)] losses<--10*St*tuotto # 2: estimointi mu<-mean(losses) losses2<-losses-mu library(tseries) ga<-garch(losses2) ga$coef # a0 a1 b1 # 319.11998228 0.08082493 0.91268289 alpha0<-319.11998228 alpha1<-0.08082493 beta<-0.91268289 # 3: rekursiivinen laskenta sigmat<-matrix(0,length(losses2),1) sigmat[1]<-sd(losses2) for (t in 2:length(losses2)){ sigmat[t]<-sqrt(alpha0+alpha1*losses2[t-1]^2+beta*sigmat[t-1]^2) } sigma<- sqrt(alpha0+alpha1*losses2[length(losses)]^2+beta*sigmat[length(sigmat)]^2) sigma # [1] 112.4752 plot(sigmat,type="l") plot(sigmat[(length(sigmat)-2000):length(sigmat)],type="l") # 4: VaR:in laskeminen alpha<-0.95 VaR<-mu+sigma*qnorm(alpha) VaR # [1] 179.1306 alpha<-0.99 VaR<-mu+sigma*qnorm(alpha) VaR # [1] 255.7818 ################################################## # Staattinen analyysi # parametriton alpha<-0.95 n<-length(losses) m<-ceiling(n*(1-alpha)) VaR<-sort(losses,decreasing=TRUE)[m] VaR # [1] 289.3378 alpha<-0.99 n<-length(losses) m<-ceiling(n*(1-alpha)) VaR<-sort(losses,decreasing=TRUE)[m] VaR # [1] 521.0938 # Normaalijakauma ########################### mu<-mean(losses) sigma<-sd(losses) alpha<-0.95 VaR2<-mu+sigma*qnorm(alpha) VaR2 # [1] 313.7045 alpha<-0.99 VaR2<-mu+sigma*qnorm(alpha) VaR2 # [1] 446.1122
Oletetaan, että portfolio koostuu 10 kappaleesta SP500 indeksiosuutta. Oletetaan, että eletään päivää 2014-08-28. Backtestaa GARCH(1,1)-mallin perustuvaa VaR-estimaattoria.
St<-sp500[length(sp500)] losses<--10*St*tuotto alpha<-0.95 library(tseries) ga<-garch(losses) ga$coef pituus<-length(losses) t0<-250 alitukset<-matrix(0,pituus-t0,1) for (i in t0:(pituus-1)){ datai<-losses[1:i] ga<-garch(datai,control=garch.control(trace = FALSE)) alpha0<-as.real(ga$coef[1]) alpha1<-as.real(ga$coef[2]) beta<-as.real(ga$coef[3]) sigmat<-matrix(0,length(datai),1) sigmat[1]<-sd(datai) for (t in 2:length(datai)){ sigmat[t]<-sqrt(alpha0+alpha1*datai[t-1]^2+beta*sigmat[t-1]^2) } sigma<- sqrt(alpha0+alpha1*datai[length(datai)]^2+beta*sigmat[length(sigmat)]^2) mui<-mean(datai) VaRhat<-mui+sigma*qnorm(alpha) if (losses[i+1]<=VaRhat) alitukset[i-t0+1]<-1 } mean(alitukset) # [1] 0.9453482 alpha<-0.99 pituus<-length(losses) t0<-250 alitukset<-matrix(0,pituus-t0,1) for (i in t0:(pituus-1)){ datai<-losses[1:i] ga<-garch(datai,control=garch.control(trace = FALSE)) alpha0<-as.real(ga$coef[1]) alpha1<-as.real(ga$coef[2]) beta<-as.real(ga$coef[3]) sigmat<-matrix(0,length(datai),1) sigmat[1]<-sd(datai) for (t in 2:length(datai)){ sigmat[t]<-sqrt(alpha0+alpha1*datai[t-1]^2+beta*sigmat[t-1]^2) } sigma<- sqrt(alpha0+alpha1*datai[length(datai)]^2+beta*sigmat[length(sigmat)]^2) mui<-mean(datai) VaRhat<-mui+sigma*qnorm(alpha) if (losses[i+1]<=VaRhat) alitukset[i-t0+1]<-1 } mean(alitukset) # [1] 0.9810326 ################################# Yhteenveto: 1) Normaalijakauma: alpha<-0.95 # [1] 0.934675 # liian pieni alpha<-0.99 # [1] 0.9732527 # liian pieni 2) Empiirinen kvantiili: alpha<-0.95 # [1] 0.9297885 # liian pieni, viela pienempi kuin norm. jak. perustuva alpha<-0.99 # [1] 0.981997 # liian pieni, mutta suurempi kuin Norm. jakaumaan perustuva 3) GARCH(1,1): alpha<-0.95 # [1] 0.9453482 alpha<-0.99 # [1] 0.9810326
Kirjoita ohjelma, joka laskee GARCH(1,1) mallissa logaritmisen uskottavuusfunktion arvoja.
garch.loglik<-function(alpha0,alpha1,beta,x) { # x on n-vektori jossa aikasarjan havainnot n<-length(x) sigma.prev<-sd(x) value<-0 for (t in 2:n){ sigma<-sqrt(alpha0+alpha1*x[t-1]^2+beta*sigma.prev^2) value<-value+log(dnorm(x[t]/sigma)/sigma) sigma.prev<-sigma } return(value) } alpha0<-1.390*10^(-6) alpha1<-0.08529 beta<-0.9066 x<-tuotto[1:215] garch.loglik(alpha0,alpha1,beta,x) ########################## garch.lik<-function(alpha0,alpha1,beta,x) { # x on n-vektori jossa aikasarjan havainnot n<-length(x) sigma.prev<-sd(x) value<-1 for (t in 2:n){ sigma<-sqrt(alpha0+alpha1*x[t-1]^2+beta*sigma.prev^2) value<-value*dnorm(x[t]/sigma)/sigma sigma.prev<-sigma } return(value) } alpha0<-1.390*10^(-6) alpha1<-0.08529 beta<-0.9066 x<-tuotto[1:214] garch.lik(alpha0,alpha1,beta,x)