aboutsummaryrefslogtreecommitdiffstats
path: root/R
diff options
context:
space:
mode:
Diffstat (limited to 'R')
-rw-r--r--R/zerorecovery_index.R49
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")