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.R24
1 files changed, 15 insertions, 9 deletions
diff --git a/R/cds_functions_generic.R b/R/cds_functions_generic.R
index 4b0db5b4..615403fa 100644
--- a/R/cds_functions_generic.R
+++ b/R/cds_functions_generic.R
@@ -75,8 +75,8 @@ setMethod("couponleg", signature("data.frame", "defaultprepaycurve"),
## happenning is the sum of the two.
function(cs, sc, accruedondefault=TRUE, startdate=today()){
x1T <- yearFrac(today(), sc@dates)
- x2T <- yearFrac(startdate, cs$dates)
- dT <- diff(c(0, x2T))
+ x2T <- yearFrac(today(), cs$dates)
+ dT <- diff(c(0, yearFrac(startdate, cs$dates)))
hfun <- approxfun(x1T, sc@hazardrates, method="constant", rule=2)
pfun <- approxfun(x1T, sc@prepayrates, method="constant", rule=2)
SP <- cumprod(exp( - (hfun(x2T) + pfun(x2T)) * dT))
@@ -320,8 +320,8 @@ setMethod("contingentleg", signature("data.frame", "defaultprepaycurve", "numeri
## coupon schedule, hazard rates curve, prepay curve, and recovery.
function(cs, sc, recovery, startdate=today()) {
x1T <- yearFrac(today(), sc@dates)
- x2T <- yearFrac(startdate, cs$dates)
- dT <- diff(c(0, x2T))
+ x2T <- yearFrac(today(), cs$dates)
+ dT <- diff(c(0, yearFrac(startdate, cs$dates)))
hfun <- approxfun(x1T, sc@hazardrates, method="constant", rule=2)
pfun <- approxfun(x1T, sc@prepayrates, method="constant", rule=2)
Q <- cumprod(exp( -(hfun(x2T)+pfun(x2T)) * dT)) * cs$df
@@ -701,13 +701,19 @@ SPmatrix2 <- function(portfolio, dealdata, freq="3 months", startdate=Sys.Date()
forwardportfolioprice <- function(portfolio, startdate, maturity, coupontype, margin, recovery){
forwardcs <- couponSchedule(nextpaydate=startdate+45, maturity,
frequency="Q", "FLOAT", margin, margin, startdate=startdate)
- r <- rep(0, length(portfolio$SC))
+ r <- c()
+ notionalvec <- c()
for(i in seq_along(portfolio$SC)){
- cl <- couponleg(forwardcs, portfolio$SC[[i]]@curve)
- pl <- contingentleg(forwardcs, portfolio$SC[[1]]@curve, portfolio$SC[[i]]@recovery)
- r[i] <- pl+cl
+ if(length(portfolio$SC[[i]]@curve@hazardrates)==0){
+ next
+ }else{
+ notionalvec <- c(notionalvec, portfolio$notional[i])
+ }
+ cl <- couponleg(forwardcs, portfolio$SC[[i]]@curve, startdate)
+ pl <- contingentleg(forwardcs, portfolio$SC[[i]]@curve, portfolio$SC[[i]]@recovery, startdate)
+ r <- c(r, pl+cl)
}
- return(mean(r))
+ return(crossprod(notionalvec, r)/sum(notionalvec))
}