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.R14
1 files changed, 11 insertions, 3 deletions
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"),