aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--R/cds_functions_generic.R33
-rw-r--r--R/intex_deal_functions.R11
2 files changed, 27 insertions, 17 deletions
diff --git a/R/cds_functions_generic.R b/R/cds_functions_generic.R
index 1491db69..9696e766 100644
--- a/R/cds_functions_generic.R
+++ b/R/cds_functions_generic.R
@@ -544,15 +544,20 @@ portfoliospread <- function(portfolio, maturity){
d <- rep(0, length(portfolio$SC))
if(missing(maturity)){
maturityvec <- as.Date(sapply(portfolio$SC, creditcurve.maturity), origin="1970-01-01")
+ }else{
+ maturityvec <- rep(maturity, length(portfolio$SC))
}
for(i in 1:length(portfolio$SC)){
- if(missing(maturity)){
- maturity <- maturityvec[i]
+ if(length(portfolio$SC[[i]]@curve@hazardrates)==0){
+ S <- S + 0
+ d[i] <- 0
+ }else{
+ d[i] <- cdsduration(portfolio$SC[[i]]@curve, maturityvec[i])
+ S <- S + d[i] * portfolio$notional[i] *
+ cdsspread(portfolio$SC[[i]]@curve, maturityvec[i], portfolio$SC[[i]]@recovery)
}
- d[i] <- cdsduration(portfolio$SC[[i]]@curve, maturity) * portfolio$notional[i]
- S <- S + d[i] * cdsspread(portfolio$SC[[i]]@curve, maturity, portfolio$SC[[i]]@recovery)
}
- S <- S/sum(d)
+ S <- S/crossprod(d, portfolio$notional)
return(S)
}
@@ -649,17 +654,21 @@ SPmatrix <- function(portfolio, index){
return( SP )
}
-DP2 <- function(sc, dates){
+DP2 <- function(sc, dates, startdate=Sys.Date()){
## computes the default probability and prepay probability associated
## with the survival curve at the dates specified by dates
- x2T <- yearFrac(today(), dates)
+ if(length(sc@hazardrates)==0){
+ return(list(defaultprob=rep(0,length(dates)),
+ prepayprob=rep(0, length(dates))))
+ }
+ x2T <- yearFrac(startdate, dates)
dT <- diff(c(0, x2T))
- x1T <- yearFrac(today(), sc@dates)
+ x1T <- yearFrac(startdate, sc@dates)
hfun <- approxfun(x1T, sc@hazardrates, method="constant", rule=2)
pfun <- approxfun(x1T, sc@prepayrates, method="constant", rule=2)
Qmid <- exp(-cumsum((hfun(x2T)+pfun(x2T)) * dT))
- list(defaultprob = cumsum(hfun(x2T) * Qmid * dT),
- prepayprob = cumsum(pfun(x2T) * Qmid * dT))
+ return(list(defaultprob = cumsum(hfun(x2T) * Qmid * dT),
+ prepayprob = cumsum(pfun(x2T) * Qmid * dT)))
}
getdealschedule <- function(dealdata, freq="3 months", startdate = Sys.Date(), lag = 0){
@@ -668,10 +677,10 @@ getdealschedule <- function(dealdata, freq="3 months", startdate = Sys.Date(), l
return( dates )
}
-SPmatrix2 <- function(portfolio, dealdata, freq="3 months"){
+SPmatrix2 <- function(portfolio, dealdata, freq="3 months", startdate=Sys.Date()){
## computes the default and prepay probability matrix of a portfolio
## at the dates specified from dealdata
- dates <- getdealschedule(dealdata, freq)
+ dates <- getdealschedule(dealdata, freq, startdate)
DP <- matrix(0, length(portfolio), length(dates))
PP <- matrix(0, length(portfolio), length(dates))
for(i in 1:length(portfolio)){
diff --git a/R/intex_deal_functions.R b/R/intex_deal_functions.R
index 2ed3f2fa..91a4960a 100644
--- a/R/intex_deal_functions.R
+++ b/R/intex_deal_functions.R
@@ -198,10 +198,12 @@ buildSC <- function(line.item, reinvdate, dealmaturity, global.params, startdate
line.item$price <- 100
SC@startdate <- startdate + global.params$defaultedlag
- line.item$maturity <- min(dealmaturity, SC@startdate + global.params$rollingmaturity)
- line.item$nextpaydate <- SC@startdate
- ## automatic reinvest
- SC<- stackcurve(SC, line.item, global.params, SC@startdate)
+ if(SC@startdate<reinvdate && global.params$reinvflag){
+ line.item$maturity <- min(dealmaturity, SC@startdate + global.params$rollingmaturity)
+ line.item$nextpaydate <- SC@startdate
+ ## automatic reinvest
+ SC<- stackcurve(SC, line.item, global.params, SC@startdate)
+ }
}else if(line.item$maturity <= startdate){#matured asset
SC <- buildSC.matured(SC, line.item, reinvdate, dealmaturity, global.params, startdate)
if(is.na(line.item$price))line.item$price <- 100
@@ -274,7 +276,6 @@ buildSC.portfolio <- function(dealname, dealdata, cusipdata, global.params, star
cdonotional <- cdonotional + line.item$currentbalance
}else{
if(is.na(line.item$price)){
- browser()
missingpricenotional <- missingpricenotional + line.item$currentbalance
}
}