diff options
Diffstat (limited to 'R')
| -rw-r--r-- | R/build_scenarios.R | 19 | ||||
| -rw-r--r-- | R/cds_functions_generic.R | 28 |
2 files changed, 29 insertions, 18 deletions
diff --git a/R/build_scenarios.R b/R/build_scenarios.R index 67e1ffca..c5225059 100644 --- a/R/build_scenarios.R +++ b/R/build_scenarios.R @@ -180,24 +180,25 @@ for(j in seq_along(dealnames)){ coupon <- reinvfixed
}
##reinvest tweak
- coupon <- coupon-0.01
-
- ## reinvprices[[assetname]] <- foreach(date = iter(deal.datesmonthly), .combine=c) %dopar% {
- ## 100 * forwardportfolioprice2(cdrmonthly.dt, recoverymonthly.dt, date,
- ## min(date+rollingmaturity*30, deal.data$maturity),
- ## asset$coupontype, coupon, asset$liborfloor/100)
+ #coupon <- coupon-0.01
reinvprices[[assetname]] <- foreach(date = iter(deal.datesmonthly), .combine=c) %dopar% {
- 100 * forwardportfolioprice(deal.portfolio, date,
+ 100 * forwardportfolioprice2(cdrmonthly.dt, recoverymonthly.dt, date,
min(date+rollingmaturity*30, deal.data$maturity),
- asset$coupontype, coupon, asset$liborfloor/100)
+ asset$coupontype, coupon, asset$liborfloor/100)
}
+ ## reinvprices[[assetname]] <- foreach(date = iter(deal.datesmonthly), .combine=c) %dopar% {
+ ## 100 * forwardportfolioprice(deal.portfolio, date,
+ ## min(date+rollingmaturity*30, deal.data$maturity),
+ ## asset$coupontype, coupon, asset$liborfloor/100)
+ ## }
## for(i in seq_along(deal.datesmonthly)){
## date <- deal.datesmonthly[i]
## reinvprices[[assetname]] <-
- ## 100 * forwardportfolioprice(cdrmonthly.dt, recoverymonthly.dt, date,
+ ## 100 * forwardportfolioprice2(cdrmonthly.dt, recoverymonthly.dt, date,
## min(date+rollingmaturity*30, deal.data$maturity),
## asset$coupontype, coupon, asset$liborfloor/100)
+ ## }
}
}
diff --git a/R/cds_functions_generic.R b/R/cds_functions_generic.R index 91aa9ec7..7ce84daa 100644 --- a/R/cds_functions_generic.R +++ b/R/cds_functions_generic.R @@ -766,7 +766,7 @@ forwardportfolioprice <- function(portfolio, startdate, maturity, coupontype, ma ## }
return(crossprod(portfolio$notional[idx],
vapply(portfolio$SC[idx], price, numeric(1)))/
- crossprod(portfolio$notional[idx], durationvec))
+ sum(portfolio$notional[idx]))
}
forwardportfolioprice2 <- function(cdrmonthly, recoverymonthly, startdate, maturity,
@@ -779,14 +779,24 @@ forwardportfolioprice2 <- function(cdrmonthly, recoverymonthly, startdate, matur forwardcs <- data.table(couponSchedule(nextpaydate=startdate+45, maturity,
frequency="Q", coupontype, margin,
currentcoupon, startdate=startdate), key="dates")
- notionals <- cdrmonthly[forwardcs,roll=TRUE]
- R <- recoverymonthly[forwardcs,roll=TRUE]
- outstanding <- notionals[,lapply(.SD,function(x)cumprod(1-x/100*1/12)),.SDcols=paste0("V",1:100)]
- po <- as.numeric(last(outstanding))*last(notionals[,df])
- io <- notionals[,outstanding[,lapply(.SD,function(x)sum(x*coupons*df)), .SDcols=paste0("V",1:100)]]
- recovery <- colSums(-apply(rbind(1,as.matrix(outstanding)), 2, diff)*
- as.matrix(R[,df*.SD,.SDcols=paste0("V",1:100)]))
- mean(as.numeric(recovery+po+io))
+ notionals <- cdrmonthly[date>=startdate, lapply(.SD,function(x)cumprod(1-x/100*1/12)),
+ .SDcols=paste0("V",1:100)]
+ recovery <- as.matrix(recoverymonthly[date>=startdate, .SD, .SDcols=paste0("V",1:100)])*
+ -apply(rbind(1,as.matrix(notionals)), 2, diff)
+ if(nrow(recovery)==1){
+ recovery <- recovery*last(forwardcs[,df])
+ }else{
+ recovery <- data.table(dates=cdrmonthly[date>=startdate,date],apply(recovery, 2, cumsum),key="dates")
+ recovery <- recovery[forwardcs, roll=TRUE]
+ df <- recovery[,df]
+ recovery <- t(df)%*%as.matrix(recovery[,lapply(.SD,function(x)diff(c(0,x))),.SDcols=paste0("V",1:100)])
+ }
+ notionals <- data.table(dates=cdrmonthly[date>=startdate,date], notionals, key="dates")
+ outstanding <- notionals[forwardcs, roll=TRUE]
+ mat.outstanding <- as.matrix(outstanding[,.SD,.SDcols=paste0("V",1:100)])
+ po <- mat.outstanding[nrow(mat.outstanding),]*last(outstanding)[,df]
+ io <- outstanding[, df*coupons]%*%mat.outstanding
+ mean(recovery+po+io)
}
creditcurve.maturity <- function(creditcurve){
|
