diff options
| -rw-r--r-- | R/tranche_functions.R | 98 |
1 files changed, 39 insertions, 59 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]))
+ 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])
+ }
}
- 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)
-
+ 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]
}
- dPVtranche <- bpplus-bpminus
- dPVtranche2 <- bp2plus - bp
+ 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) )
|
