Tietokoneharjoitus 6

Tutkitaan aikasarjaa SP500 osakeindeksin päivittäisistä päätoskursseista ajalta 1950-01-03 -- 2014-08-28.

Tehtävä 5

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

Tehtävä 5a

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

Tehtävä 5b

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

Tehtävä 5c

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)