aboutsummaryrefslogtreecommitdiffstats
path: root/R/cds_functions_generic.R
diff options
context:
space:
mode:
Diffstat (limited to 'R/cds_functions_generic.R')
-rw-r--r--R/cds_functions_generic.R89
1 files changed, 60 insertions, 29 deletions
diff --git a/R/cds_functions_generic.R b/R/cds_functions_generic.R
index cae12c28..9d6d7ae0 100644
--- a/R/cds_functions_generic.R
+++ b/R/cds_functions_generic.R
@@ -111,11 +111,11 @@ setMethod("couponleg", signature("data.frame", "shapedcurve"),
})
## define dcouponleg generic
-setGeneric("dcouponleg", function(cs, sc, index, ...) {
+setGeneric("dcouponleg", function(cs, sc, startdate, ...) {
standardGeneric("dcouponleg")
})
-setMethod("dcouponleg", signature("data.frame", "flatcurve", "missing"),
+setMethod("dcouponleg", signature("data.frame", "flatcurve", "Date"),
function(cs, sc, startdate=Sys.Date() + 1, accruedondefault=TRUE){
stopifnot(is.logical(accruedondefault))
T <- yearFrac(startdate, cs$dates)
@@ -128,9 +128,9 @@ setMethod("dcouponleg", signature("data.frame", "flatcurve", "missing"),
return( as.numeric(crossprod(dPDadj, cs$coupons * cs$df)) )
})
-setMethod("dcouponleg", signature("data.frame", "defaultcurve", "numeric"),
+setMethod("dcouponleg", signature("data.frame", "defaultcurve", "Date"),
## derivative of couponleg with respect to hazardrate
- function(cs, sc, index, startdate=Sys.Date() + 1, accruedondefault=TRUE) {
+ function(cs, sc, startdate=Sys.Date() + 1, index, accruedondefault=TRUE) {
stopifnot(is.logical(accruedondefault))
dT <- diff(c(0, yearFrac(startdate, cs$dates)))
PD <- cumprod(exp(-sc@hazardrates[1:length(dT)] * dT))
@@ -143,7 +143,7 @@ setMethod("dcouponleg", signature("data.frame", "defaultcurve", "numeric"),
return( as.numeric(crossprod( dPDadj, cs$coupons * cs$df)) )
})
-setMethod("dcouponleg", signature("data.frame", "shapedcurve", "missing"),
+setMethod("dcouponleg", signature("data.frame", "shapedcurve", "Date"),
function(cs, sc, startdate=Sys.Date() + 1, accruedondefault = TRUE){
T <- yearFrac(startdate, cs$dates)
dT <- diff(c(0, T))
@@ -183,10 +183,13 @@ setGeneric("cdsduration", function(sc, maturity, ...) {
## duration is based on the standard IMM schedule
setMethod("cdsduration", signature("abstractcurve", "Date"),
## computes the risky PV01, also called risky annuity of a cds
- function(sc, maturity, startdate=Sys.Date() + 1, accruedondefault=TRUE){
+ function(sc, maturity, tradedate=Sys.Date(), accruedondefault=TRUE){
stopifnot(is.logical(accruedondefault))
- cs <- couponSchedule(IMMDate(startdate), maturity, "Q", "FIXED", 1)
- couponleg(cs, sc, startdate, accruedondefault=accruedondefault)
+ cs <- couponSchedule(IMMDate(tradedate, noadj=TRUE), maturity,"Q", "FIXED", 1,
+ 0, tradedate, IMMDate(tradedate, "prev"))
+ startdate <- tradedate+1
+ acc <- cdsAccrued(tradedate, 1)
+ return( couponleg(cs, sc, startdate, accruedondefault=accruedondefault) - acc)
})
## define defaultleg generic
@@ -242,11 +245,11 @@ setMethod("defaultleg", signature("data.frame", "shapedcurve", "numeric"),
})
## define ddefaultleg generic
-setGeneric("ddefaultleg", function(cs, sc, recovery, index, ...) {
+setGeneric("ddefaultleg", function(cs, sc, recovery, startdate, ...) {
standardGeneric("ddefaultleg")
})
-setMethod("ddefaultleg", signature("data.frame", "flatcurve", "numeric", "missing"),
+setMethod("ddefaultleg", signature("data.frame", "flatcurve", "numeric", "Date"),
## derivative of defaultleg with respect to flat hazardrate
function(cs, sc, recovery, startdate=Sys.Date()+1){
T <- yearFrac(startdate, cs$dates)
@@ -259,9 +262,9 @@ setMethod("ddefaultleg", signature("data.frame", "flatcurve", "numeric", "missin
return( as.numeric(dr) )
})
-setMethod("ddefaultleg", signature("data.frame", "defaultcurve", "numeric", "numeric"),
+setMethod("ddefaultleg", signature("data.frame", "defaultcurve", "numeric", "Date"),
## derivative of defaultleg with respect to hazardrate
- function(cs, sc, recovery, index, startdate=Sys.Date()+1){
+ function(cs, sc, recovery, startdate=Sys.Date()+1, index){
T <- yearFrac(startdate, cs$dates)
dT <- diff(c(0,T))
Q <- cumprod(exp(-sc@hazardrates[1:length(dT)] * dT)) * cs$df
@@ -272,7 +275,7 @@ setMethod("ddefaultleg", signature("data.frame", "defaultcurve", "numeric", "num
return( as.numeric(dr) )
})
-setMethod("ddefaultleg", signature("data.frame", "shapedcurve", "numeric", "missing"),
+setMethod("ddefaultleg", signature("data.frame", "shapedcurve", "numeric", "Date"),
function(cs, sc, recovery, startdate=Sys.Date()+1) {
T <- yearFrac(startdate, cs$dates)
dT <- diff(c(0, T))
@@ -405,19 +408,42 @@ cdspv <- function(cs, sc, recovery, tradedate){
return ( couponleg(cs, sc, startdate) - defaultleg(cs, sc, recovery, startdate))
}
-cdsspread <- function(sc, maturity, recovery){
+cds.parspread <- function(cs, sc, recovery, tradedate){
## computes exact cds running spread for a cds
## should be very close to hazardrate * (1-recovery)
- cs <- couponSchedule(IMMDate(Sys.Date()), maturity, "Q", "FIXED", 1)
- defaultleg(cs, sc, recovery)/couponleg(cs, sc)
+ startdate <- tradedate + 1
+ return (defaultleg(cs, sc, recovery, startdate)/
+ (couponleg(cs, sc, startdate)-cdsAccrued(tradedate, 1)))
+}
+
+dcds.parspread <- function(cs, sc, recovery, tradedate){
+ startdate <- tradedate + 1
+ u <- defaultleg(cs, sc, recovery, startdate)
+ v <- couponleg(cs, sc, startdate)-cdsAccrued(tradedate, 1)
+ u_prime <- ddefaultleg(cs, sc, recovery, startdate)
+ v_prime <- dcouponleg(cs, sc, startdate)
+ return( (u_prime*v-u*v_prime)/v^2 )
+}
+
+snacpv <- function(cs, parspread, coupon, recovery, tradedate){
+ ## compute the equivalent pv of a snac quote
+ startdate <- tradedate + 1
+ sc <- new("flatcurve", h=parspread/(1-recovery))
+ epsilon <- 1e-8
+ while(abs(cds.parspread(cs, sc, recovery, tradedate)-parspread)>epsilon){
+ sc@h <- sc@h - (cds.parspread(cs, sc, recovery, tradedate)-parspread)/
+ dcds.parspread(cs, sc, recovery, tradedate)
+ }
+ acc <- cdsAccrued(tradedate, coupon)
+ return( 1 + couponleg(cs, sc, startdate)*coupon-defaultleg(cs, sc, recovery, startdate)-acc )
}
-dcdspv <- function(cs, sc, recovery, index, tradedate){
+dcdspv <- function(cs, sc, recovery, tradedate, index){
startdate <- tradedate + 1
if(missing(index)){
return(dcouponleg(cs, sc, startdate) - ddefaultleg(cs, sc, recovery, startdate))
}else{
- return ( dcouponleg(cs, sc, index, startdate) - ddefaultleg(cs, sc, recovery, index, startdate) )
+ return ( dcouponleg(cs, sc, startdate, index) - ddefaultleg(cs, sc, recovery, startdate, index) )
}
}
@@ -425,22 +451,25 @@ bondpv <- function(cs, sc, recovery, tradedate=Sys.Date()){
return( contingentleg(cs, sc, recovery, tradedate) + couponleg(cs, sc, tradedate) )
}
-dbondpv <- function(cs, sc, recovery, index, startdate){
+dbondpv <- function(cs, sc, recovery, startdate, index){
if(missing(index)){
- return( dcontingentleg(cs, sc, recovery, ,startdate) + dcouponleg(cs, sc, ,startdate))
+ return( dcontingentleg(cs, sc, recovery, startdate) + dcouponleg(cs, sc, startdate))
}else{
- return( dcontingentleg(cs, sc, recovery, index, startdate)+dcouponleg(cs, sc, index, startdate) )
+ return( dcontingentleg(cs, sc, recovery, startdate, index)+dcouponleg(cs, sc, startdate, index) )
}
}
-cdshazardrate.flat <- function(upfront, running, maturity, R=0.4){
+cdshazardrate.flat <- function(upfront, running, maturity, R=0.4, tradedate){
## computes the implied hazard rate of the cds based on the upfront
## and running quotes, as well as maturity and recovery
- cs <- couponSchedule(IMMDate(Sys.Date()), maturity, "Q", "FIXED", running)
+ cs <- couponSchedule(IMMDate(tradedate, noadj=TRUE), maturity,"Q", "FIXED", running,
+ 0, tradedate, IMMDate(tradedate, "prev"))
sc <- new("flatcurve", h = 0.05)
eps <- 1e-8
- while(abs(cdspv(cs, sc, R) + upfront) > eps){
- sc@h <- sc@h - (upfront + cdspv(cs, sc, R))/dcdspv(cs, sc, R)
+ acc <- cdsAccrued(tradedate, running)
+ upfront <- upfront - acc
+ while(abs(cdspv(cs, sc, R, tradedate) + upfront) > eps){
+ sc@h <- sc@h - (upfront + cdspv(cs, sc, R, tradedate))/dcdspv(cs, sc, R, tradedate)
}
return(sc@h)
}
@@ -478,7 +507,7 @@ cdshazardrate <- function(quotes, R=0.4, tradedate=Sys.Date(), cs.all){
acc <- cdsAccrued(tradedate, quotes$running[i])
while(abs(cdspv(cs, sc, R, tradedate) + quotes$upfront[i] - acc) > eps){
new.h <- new.h - (quotes$upfront[i] + cdspv(cs, sc, R, tradedate) - acc)/
- dcdspv(cs, sc, R, index, tradedate)
+ dcdspv(cs, sc, R, tradedate, index)
hvec <- c(previous.hvec, rep(new.h, flength))
sc@hazardrates <- hvec
}
@@ -577,10 +606,12 @@ indexpv <- function(index, epsilon=0, tradedate=Sys.Date(), clean=TRUE,
return(r)
}
-indexduration <- function(index){
+indexduration <- function(index, tradedate, maturity=index$maturity){
## compute the duration of a portfolio of survival curves
- durations <- unlist(lapply(index$portfolio, function(x){cdsduration(x@curve, index$maturity)}))
- return( mean(durations) )
+ cs <- index$cs[index$cs$dates-maturity< 3,]
+ startdate <- tradedate+1
+ cl.list <- unlist(lapply(index$portfolio, function(x){couponleg(cs, x@curve, startdate)}))
+ return( mean(cl.list) )
}
indexspread <- function(index, tradedate=Sys.Date()){