--------------- # Aufgabe 1 # --------------- # we can use the code from week9.txt: # log-Likelihood-Funktion fuer das ARCH(1)-Modell: logL = function( bsvol , w0 ) { w1 = 1 - w0 vol = sqrt(w0*bsvol^2+w1*ret^2) # man kann den Vektor ret benutzen, obwohl # der nicht als Argument uebergeben wurde # shift vol by 1 element: n = length(ret) vol = vol[-n] # remove last one vol = c(sqrt(w0*bsvol^2),vol) # add a new first one terms = log(vol) + 1/2*ret^2/vol^2 result = -sum(terms) return(result) } # load SPX.txt data and generate return vector ret: spx = read.table("C:/Users/detlef/OneDrive/hochschule/Vorlesungen/WS2122/Datenanalyse-mit-R/SPX.txt",header=TRUE,sep=";") head(spx) summary(spx) # no NA's S = spx[,2] n = length(S) ret = rep(0,n) for(i in 2:n) { ret[i] = (S[i]-S[i-1])/S[i-1] } plot(ret,type="l") # returns look ok # compute spx-logL and make setup for contour-plot: bsvol = seq( from=0.1/100 , to=4/100 , by=0.1/100 ) w0 = seq( from=0.05 , to=0.95 , by=0.05 ) nbs = length(bsvol) nw = length(w0) z = matrix( 0 , nrow=nbs , ncol=nw ) for(i in 1:nbs) { for(j in 1:nw ) { z[i,j] = logL( bsvol[i] , w0[j] ) } } # let's look at the result: contour( bsvol , w0 , z ) contour( bsvol , w0 , z , nlevels = 50 ) contour( bsvol , w0 , z , nlevels = 50 , zlim=c(60000,80000) ) contour( bsvol , w0 , z , nlevels = 100 , zlim=c(60000,80000) ) # we take a more refined look at the region w0 = 0.5 to 0.9 # and bsvol = 0.5% to 1.5%: bsvol = seq( from=0.5/100 , to=1.5/100 , by=0.02/100 ) w0 = seq( from=0.5 , to=0.9 , by=0.01 ) nbs = length(bsvol) nw = length(w0) z = matrix( 0 , nrow=nbs , ncol=nw ) for(i in 1:nbs) { for(j in 1:nw ) { z[i,j] = logL( bsvol[i] , w0[j] ) } } contour( bsvol , w0 , z , nlevels = 100 , zlim=c(60000,80000) ) contour( bsvol , w0 , z , nlevels = 100 , zlim=c(69000,70000) ) max(z) logL(sd(ret),0.69) sd(ret) # thus: Maximum approximately at bsvol = sd(ret) = 0.97% and w0 = 0.69 # same analysis for GE.txt data: # load GE.txt data and generate return vector ret: ge = read.table("C:/Users/detlef/OneDrive/hochschule/Vorlesungen/WS2122/Datenanalyse-mit-R/GE.txt",header=TRUE,sep=";") head(ge) summary(ge) # no NA's S = ge[,2] n = length(S) ret = rep(0,n) for(i in 2:n) { ret[i] = (S[i]-S[i-1])/S[i-1] } plot(ret,type="l") # returns look ok # compute GE-logL and make setup for contour-plot: bsvol = seq( from=0.1/100 , to=4/100 , by=0.1/100 ) w0 = seq( from=0.05 , to=0.95 , by=0.05 ) nbs = length(bsvol) nw = length(w0) z = matrix( 0 , nrow=nbs , ncol=nw ) for(i in 1:nbs) { for(j in 1:nw ) { z[i,j] = logL( bsvol[i] , w0[j] ) } } # let's look at the result: contour( bsvol , w0 , z ) contour( bsvol , w0 , z , nlevels = 50 ) contour( bsvol , w0 , z , nlevels = 50 , zlim=c(40000,50000) ) # we take a more refined look at the region w0 = 0.5 to 0.9 # and bsvol = 1.0% to 2.0%: bsvol = seq( from=1.0/100 , to=2.0/100 , by=0.02/100 ) w0 = seq( from=0.5 , to=0.9 , by=0.01 ) nbs = length(bsvol) nw = length(w0) z = matrix( 0 , nrow=nbs , ncol=nw ) for(i in 1:nbs) { for(j in 1:nw ) { z[i,j] = logL( bsvol[i] , w0[j] ) } } contour( bsvol , w0 , z , nlevels = 50 , zlim=c(40000,50000) ) contour( bsvol , w0 , z , nlevels = 100 , zlim=c(49500,50000) ) max(z) logL(sd(ret),0.68) sd(ret) # thus: Maximum approximately at bsvol = sd(ret) = 0.97% and w0 = 0.69 ------------- # Aufgabe 2 # ------------- # 2a) Kurtosis = function( x ) { n = length(x) xbar = sum(x)/n zaehler = sum((x - xbar)^4)/n nenner = (sum((x - xbar)^2)/n)^2 result = zaehler/nenner return(result) } # let's check: x = rnorm(10000,mean=15,sd=2) Kurtosis(x) # etwa 2.985 oder 3.0407.. # 2b) dax = read.table("C:/Users/detlef/OneDrive/hochschule/Vorlesungen/WS2122/Datenanalyse-mit-R/DAX.txt",header=TRUE,sep=";") spx = read.table("C:/Users/detlef/OneDrive/hochschule/Vorlesungen/WS2122/Datenanalyse-mit-R/SPX.txt",header=TRUE,sep=";") ge = read.table("C:/Users/detlef/OneDrive/hochschule/Vorlesungen/WS2122/Datenanalyse-mit-R/GE.txt",header=TRUE,sep=";") head(dax) head(spx) head(ge) summary(dax) # dax has NA's dax = na.omit(dax) summary(dax) summary(spx) # no NA's summary(ge) # no NA's # we need only the index or price values which are in the second column: Sdax = dax[,2] Sspx = spx[,2] Sge = ge[,2] # generate return data: ndax = length(Sdax) nspx = length(Sspx) nge = length(Sge) retdax = rep(0,ndax) retspx = rep(0,nspx) retge = rep(0,nge) for(k in 2:ndax) { retdax[k] = (Sdax[k]-Sdax[k-1])/Sdax[k-1] } for(k in 2:nspx) { retspx[k] = (Sspx[k]-Sspx[k-1])/Sspx[k-1] } for(k in 2:nge) { retge[k] = (Sge[k]-Sge[k-1])/Sge[k-1] } Kurtosis(retdax) # 10.7683 Kurtosis(retspx) # 23.9977 Kurtosis(retge) # 11.4684 # 2c) # for spx, let's just take out 1 return, the 1987 crash day with # a market drop of more than 20%: test = ifelse(retspx < -0.2 , 1 , 0 ) sum(test) # just 1 day test retspx_ohnecrash = retspx * (1 - test) # der relevante return wird mit 0 # multipliziert.. plot(retspx_ohnecrash,type="l") # ok, ist verschwunden.. Kurtosis(retspx_ohnecrash) # 12.5451 Kurtosis(retspx) # 23.9977 # just 1 return out of 16553 returns about doubles the spx-kurtosis # from 12.55 to 24.00 !!