From 5d70571e21b0f918d6dcc33ceb1379b72336e07c Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Tue, 17 Jun 2014 14:37:36 -0400 Subject: cleanup BCtranche.delta and fixed bugs --- R/tranche_functions.R | 102 ++++++++++++++++++++------------------------------ 1 file changed, 41 insertions(+), 61 deletions(-) diff --git a/R/tranche_functions.R b/R/tranche_functions.R index 2743efd..d071fda 100644 --- a/R/tranche_functions.R +++ b/R/tranche_functions.R @@ -691,77 +691,57 @@ BCtranche.delta <- function(index, Z, w, N=length(index$portolio)+1, tradedate = ## this makes sense for bottom-up skews eps <- 1e-4 - Portf.plus <- tweakportfolio(index$portfolio, eps) - Portf.minus <- tweakportfolio(index$portfolio, -eps) - Portf.2plus <- tweakportfolio(index$portfolio, 2*eps) - indexplus <- index - indexplus$portfolio <- Portf.plus - indexplus$defaultprob <- 1 - SPmatrix(Portf.plus, length(index$cs$dates)) - - index2plus <- index - index2plus$portfolio <- Portf.2plus - index2plus$defaultprob <- 1 - SPmatrix(Portf.2plus, length(index$cs$dates)) - - indexminus <- index - indexminus$portfolio <- Portf.minus - indexminus$defaultprob <- 1 - SPmatrix(Portf.minus, length(index$cs$dates)) - dPVindex <- indexpv(indexplus, tradedate = tradedate, clean = FALSE)$bp - - indexpv(indexminus, tradedate = tradedate, clean = FALSE)$bp - dPVindex2 <- indexpv(index2plus, tradedate = tradedate, clean = FALSE)$bp - + ## we build a lit of 4 indices with various shocks + index.list <- lapply(c(0, eps, -eps, 2*eps), function(x){ + if(x==0){ + return(index) + }else{ + newindex <- index + newindex$portfolio <- tweakportfolio(newindex$portfolio, x) + newindex$defaultprob <- 1 - SPmatrix(newindex$portfolio, length(index$cs$dates)) + return(newindex) + } + }) + dPVindex <- indexpv(index.list[[2]], tradedate = tradedate, clean = FALSE)$bp - + indexpv(index.list[[3]], tradedate = tradedate, clean = FALSE)$bp + dPVindex2 <- indexpv(index.list[[4]], tradedate = tradedate, clean = FALSE)$bp - indexpv(index, tradedate = tradedate, clean = FALSE)$bp - dPVindex1 <- indexpv(indexplus, tradedate = tradedate, clean = FALSE)$bp- + dPVindex1 <- indexpv(index.list[[2]], tradedate = tradedate, clean = FALSE)$bp- indexpv(index, tradedate = tradedate, clean = FALSE)$bp - clplus <- 0 - clminus <- 0 - cl <- 0 - cl2plus <- 0 - plplus <- 0 - plminus <- 0 - pl <- 0 - pl2plus <- 0 - bp <- c() - bpplus <- c() - bpminus <- c() - bp2plus <- c() + index$cs$coupons <- index$cs$coupons/index$spreadref + cl <- matrix(0, length(index$rho)-2, length(index.list)) + pl <- matrix(0, length(index$rho)-2, length(index.list)) + bp <- matrix(0, length(index$rho)-1, length(index.list)) for(i in 1:(length(index$rho)-2)){ - dist <- BClossdistC(index$defaultprob, index$issuerweights, index$recov, index$rho[i+1], Z, w, N) - distplus <- BClossdistC(indexplus$defaultprob, index$issuerweights, index$recov, index$rho[i+1], Z, w, N) - distminus <- BClossdistC(indexminus$defaultprob, index$issuerweights, index$recov, index$rho[i+1], Z, w, N) - dist2plus <- BClossdistC(index2plus$defaultprob, index$issuerweights, index$recov, index$rho[i+1], Z, w, N) - #shock all the coupon legs - cl <- c(cl, tranche.cl(dist$L, dist$R, index$cs, 0, index$K[i+1])) - clplus <- c(clplus, tranche.cl(distplus$L, distplus$R, index$cs, 0, index$K[i+1])) - clminus <- c(clminus, tranche.cl(distminus$L, distminus$R, index$cs, 0, index$K[i+1])) - cl2plus <- c(cl, tranche.cl(dist2plus$L, dist2plus$R, index$cs, 0, index$K[i+1])) - #shock all the protection legs - pl <- c(pl, tranche.pl(dist$L, index$cs, 0, index$K[i+1])) - plplus <- c(plplus, tranche.pl(distplus$L, index$cs, 0, index$K[i+1])) - plminus <- c(plminus, tranche.pl(distminus$L, index$cs, 0, index$K[i+1])) - pl2plus <- c(pl2plus, tranche.pl(dist2plus$L, index$cs, 0, index$K[i+1])) - } - for(i in 2:(length(cl))){ - dK <- index$K[i]-index$K[i-1] - bp <- c(bp, (pl[i]+cl[i]*index$tranche.running[i]-(pl[i-1]+cl[i-1]*index$tranche.running[i]))/dK) - bpplus <- c(bpplus, (plplus[i]+clplus[i]*index$tranche.running[i]- - (plplus[i-1]+clplus[i-1]*index$tranche.running[i]))/dK) - bpminus <- c(bpminus, (plminus[i]+clminus[i]*index$tranche.running[i]- - (plminus[i-1]+clminus[i-1]*index$tranche.running[i]))/dK) - bp2plus <- c(bp2plus, (pl2plus[i]+cl2plus[i]*index$tranche.running[i]- - (pl2plus[i-1]+cl2plus[i-1]*index$tranche.running[i]))/dK) - - } - dPVtranche <- bpplus-bpminus - dPVtranche2 <- bp2plus - bp + dist.list <- list() + for(j in seq_along(index.list)){ + dist.list[[j]] <- BClossdistC(index.list[[j]]$defaultprob, + index$issuerweights, index$recov, index$rho[i+1], Z, w, N) + } + for(j in seq_along(dist.list)){ + #shock all the coupon and protection legs + cl[i,j] <- tranche.cl(dist.list[[j]]$L, dist.list[[j]]$R, index$cs, 0, index$K[i+1]) + pl[i,j] <- tranche.pl(dist.list[[j]]$L, index$cs, 0, index$K[i+1]) + } + } + bp[1,] <- (pl[1,]+cl[1,]*index$tranche.running[1]) + for(i in 2:(nrow(cl))){ + bp[i,] <- pl[i,]-pl[i-1,]+(cl[i,]-cl[i-1,])*index$tranche.running[i] + } + bp[nrow(bp),] <- pl[nrow(pl),]+cl[nrow(cl),]*index$tranche.running[length(index$tranche.running)] + dPVtranche <- (bp[-nrow(bp),2]-bp[-nrow(bp),3])/diff(index$K[-length(index$K)]) + dPVtranche2 <- (bp[-nrow(bp),4] - bp[-nrow(bp),1])/diff(index$K[-length(index$K)]) deltas <- dPVtranche/dPVindex + deltasplus <- dPVtranche2/dPVindex2 ##might need to check that in case of non 1 factor deltas <- c(deltas, - (1-(bpplus[length(bpplus)]-bpminus[length(bpminus)])/dPVindex)/(1-index$K[length(index$K)-1])) - deltasplus <- dPVtranche2/dPVindex2 + (1-(bp[nrow(bp),2]-bp[nrow(bp),3])/dPVindex)/(1-index$K[length(index$K)-1])) ##might need to check that in case of non 1 factor deltasplus <- c(deltasplus, - (1-(bp2plus[length(bpplus)]-bp[length(bpminus)])/dPVindex2)/(1-index$K[length(index$K)-1])) + (1-(bp[nrow(bp),4]-bp[nrow(bp),1])/dPVindex2)/(1-index$K[length(index$K)-1])) + gammas <- (deltasplus-deltas)/dPVindex1/100 return( list(deltas=deltas, gammas=gammas) ) -- cgit v1.2.3-70-g09d2