diff options
Diffstat (limited to 'R')
| -rw-r--r-- | R/zerorecovery_index.R | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/R/zerorecovery_index.R b/R/zerorecovery_index.R index 58df61c8..b4d75800 100644 --- a/R/zerorecovery_index.R +++ b/R/zerorecovery_index.R @@ -6,6 +6,29 @@ source(file.path(code.dir, "R", "serenitasdb.R")) source(file.path(code.dir, "R", "creditIndex.R")) source(file.path(code.dir, "R", "tranche_functions.R")) + +zerorecov.pv <- function(portfolio, tradedate=Sys.Date()) { + startdate <- tradedate + 1 + zerorecov.portfolio <- lapply(portfolio, function(x) {x@recovery=0;return(x)}) + pl.list <- vapply(zerorecov.portfolio, function(x) { + pl <- defaultleg(index$cs, x@curve, x@recovery, startdate, TRUE) + if(is.na(pl)) { + print("couldn't compute single name protection leg for", x@issuer)) + return( NA ) + } + return( pl ) + }, numeric(1)) + return( mean(pl.list) ) +} + +delta <- function(index, tradedate=Sys.Date()) { + old.pv.zerorecov <- zerorecov.pv(index$portfolio, tradedate) + old.pv.index <- indexpv(index, tradedate=tradedate)$bp + new.pv.zerorecov <- zerorecov.pv(tweakportfolio(index$portfolio, 0.01), tradedate) + new.pv.index <- indexpv(index, 0.01, tradedate=tradedate)$bp + return( -(new.pv.zerorecov-old.pv.zerorecov) / (new.pv.index - old.pv.index) ) +} + ##HY tradedate <- as.Date("2017-04-04") exportYC(tradedate, "USD") @@ -15,25 +38,15 @@ index <- set.index.desc(index, tradedate) index$cs <- couponSchedule(IMMDate(tradedate, noadj=TRUE), index$maturity, "Q", "FIXED", 1, 0, tradedate, IMMDate(tradedate, "prev")) index$quotes <- data.frame(maturity=as.Date("2022-06-20"), spread=0.05, price=1.0716) -startdate <- tradedate + 1 upfront <- c() for(R in seq(0.2, 0.45, 0.01)) { index <- set.singlenamesdata(index, tradedate, R) tweak <- tweakcurves(index) - zerorecov.portfolio <- lapply(tweak$portfolio, function(x){x@recovery=0;return(x)}) - pl.list <- vapply(zerorecov.portfolio, function(x) { - pl <- defaultleg(index$cs, x@curve, x@recovery, startdate, TRUE) - if(is.na(pl)) { - logerror(paste("couldn't compute single name protection leg for", x@issuer)) - return( NA ) - } - return( pl ) - }, numeric(1)) - upfront <- c(upfront, mean(pl.list)) + upfront <- c(upfront, zerorecov.pv(tweak$portfolio)) } ##ITRX -tradedate <- as.Date("2017-04-04") +tradedate <- as.Date("2017-04-05") exportYC(tradedate, "EUR") index <- creditIndex("XO27", "5yr") index <- set.index.desc(index, tradedate) @@ -42,20 +55,10 @@ index$cs <- couponSchedule(IMMDate(tradedate, noadj=TRUE), index$maturity, "Q", 0, tradedate, IMMDate(tradedate, "prev")) index$quotes <- data.frame(maturity=as.Date("2022-06-20"), spread=0.05, price=1.095) -startdate <- tradedate + 1 upfront <- c() for(R in seq(0.2, 0.45, 0.01)) { index <- set.singlenamesdata(index, tradedate, R) tweak <- tweakcurves(index) - zerorecov.portfolio <- lapply(tweak$portfolio, function(x){x@recovery=0;return(x)}) - pl.list <- vapply(zerorecov.portfolio, function(x) { - pl <- defaultleg(index$cs, x@curve, x@recovery, startdate, TRUE) - if(is.na(pl)) { - logerror(paste("couldn't compute single name protection leg for", x@issuer)) - return( NA ) - } - return( pl ) - }, numeric(1)) - upfront <- c(upfront, mean(pl.list)) + upfront <- c(upfront, zerorecov.pv(tweak$portfolio)) } plot(seq(0.2, 0.45, 0.01), upfront, type="l", xlab="recovery") |
