aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--R/calibration.R5
-rw-r--r--R/cds_functions_generic.R14
-rw-r--r--R/zerorecovery_index.R54
3 files changed, 68 insertions, 5 deletions
diff --git a/R/calibration.R b/R/calibration.R
index 259ebde6..3cb7c54e 100644
--- a/R/calibration.R
+++ b/R/calibration.R
@@ -17,8 +17,9 @@ get.cdsSchedule <- function(tradedate){
newdate <- cdsMaturity(tenor, date=tradedate)
cdsdates <- c(cdsdates, newdate)
}
- return( list(cs=couponSchedule(IMMDate(tradedate, noadj=TRUE), cdsdates[length(cdsdates)], "Q", "FIXED",
- 1, tradedate, IMMDate(tradedate, "prev")), cdsdates=cdsdates) )
+ return( list(cs=couponSchedule(IMMDate(tradedate, noadj=TRUE), cdsdates[length(cdsdates)],
+ "Q", "FIXED", 1, 0, tradedate, IMMDate(tradedate, "prev")),
+ cdsdates=cdsdates) )
}
set.singlenamesdata <- function(index, tradedate){
diff --git a/R/cds_functions_generic.R b/R/cds_functions_generic.R
index 15b8a404..293eb4f5 100644
--- a/R/cds_functions_generic.R
+++ b/R/cds_functions_generic.R
@@ -234,16 +234,24 @@ setMethod("defaultleg", signature("data.frame", "flatcurve", "numeric"),
setMethod("defaultleg", signature("data.frame", "defaultcurve", "numeric"),
## Computes the pv of the default leg of a cds based on a given
## coupon schedule, hazard rate curve, and recovery.
- function(cs, sc, recovery, startdate=Sys.Date()+1){
+ function(cs, sc, recovery, startdate=Sys.Date()+1, pay.at.end=FALSE){
cs <- cs[cs$dates>=startdate,]
T <- yearFrac(startdate, cs$dates)
x1T <- yearFrac(startdate, sc@dates)
hfun <- approxfun(x1T, sc@hazardrates, method="constant", rule=2)
dT <- diff(c(0, T))
- Q <- cumprod(exp(-hfun(T) * dT)) * cs$df
+ if(!pay.at.end) {
+ Q <- cumprod(exp(-hfun(T) * dT)) * cs$df
+ } else {
+ Q <- cumprod(exp(-hfun(T) * dT))
+ }
Qmid <- 1/2 * (c(1, Q[-length(Q)]) + Q)
r <- (1 - recovery) * crossprod(hfun(T) * Qmid, dT)
- return( as.numeric(r) )
+ if(!pay.at.end) {
+ return( as.numeric(r) )
+ } else {
+ return( as.numeric(r) * cs$df[length(cs$df)] )
+ }
})
setMethod("defaultleg", signature("data.frame", "defaultprepaycurve", "numeric"),
diff --git a/R/zerorecovery_index.R b/R/zerorecovery_index.R
new file mode 100644
index 00000000..a7694d79
--- /dev/null
+++ b/R/zerorecovery_index.R
@@ -0,0 +1,54 @@
+code.dir <- Sys.getenv("CODE_DIR")
+source(file.path(code.dir, "R", "yieldcurve.R"))
+source(file.path(code.dir, "R", "optimization.R"))
+source(file.path(code.dir, "R", "calibration.R"), chdir=TRUE)
+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"))
+
+##HY
+tradedate <- as.Date("2017-03-31")
+exportYC(tradedate, "USD")
+index <- creditIndex("HY28", "5yr")
+index <- set.index.desc(index, tradedate)
+index <- set.singlenamesdata(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)
+tweak <- tweakcurves(index)
+zerorecov.portfolio <- lapply(tweak$portfolio, function(x){x@recovery=0;return(x)})
+
+cs <- index$cs
+startdate <- tradedate + 1
+pl.list <- vapply(zerorecov.portfolio, function(x) {
+ pl <- defaultleg(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))
+
+
+##ITRX
+tradedate <- as.Date("2017-03-31")
+exportYC(tradedate, "EUR")
+index <- creditIndex("XO27", "5yr")
+index <- set.index.desc(index, tradedate)
+index <- set.singlenamesdata(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.0968)
+tweak <- tweakcurves(index)
+zerorecov.portfolio <- lapply(tweak$portfolio, function(x){x@recovery=0;return(x)})
+
+cs <- index$cs
+startdate <- tradedate + 1
+pl.list <- vapply(zerorecov.portfolio, function(x) {
+ pl <- defaultleg(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))