diff options
| -rw-r--r-- | R/build_scenarios.R | 17 | ||||
| -rw-r--r-- | R/cds_functions_generic.R | 67 |
2 files changed, 59 insertions, 25 deletions
diff --git a/R/build_scenarios.R b/R/build_scenarios.R index 6e007341..92364c17 100644 --- a/R/build_scenarios.R +++ b/R/build_scenarios.R @@ -216,11 +216,13 @@ for(j in seq_along(dealnames)){ }else{
rollingmaturity <- basecase.rollingmaturity
}
- DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, deal.datesmonthlylagged))
- df <- DC$discounts
- forwards <- DC$forwards
-
+ ## DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, deal.datesmonthlylagged))
+ ## df <- DC$discounts
+ ## forwards <- DC$forwards
+ cdrmonthly.dt <- data.table(date=deal.datesmonthly, t(cdrmonthly), key="date")
+ recoverymonthly.dt <- data.table(date=deal.datesmonthly, t(recoverymonthly), key="date")
reinvassets <- get.reinvassets(dealnames[j], workdate)
+
reinvprices <- list()
if(reinvflags[j] && length(reinvassets)>0){
for(assetname in names(reinvassets)){
@@ -234,12 +236,13 @@ for(j in seq_along(dealnames)){ coupon <- coupon-0.01
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)
+ 100 * forwardportfolioprice2(cdrmonthly.dt, recoverymonthly.dt, date,
+ min(date+rollingmaturity*30, deal.data$maturity),
+ asset$coupontype, coupon, asset$liborfloor/100)
}
}
}
+
## reinvprices <- compute.reinvprices(df, forwards, cdrmonthly, recoverymonthly, reinvspread,
## reinvfixed, rollingmaturity, reinvlag)
diff --git a/R/cds_functions_generic.R b/R/cds_functions_generic.R index f00c6b01..fcc5a3dd 100644 --- a/R/cds_functions_generic.R +++ b/R/cds_functions_generic.R @@ -735,27 +735,58 @@ SPmatrix2 <- function(portfolio, dealdata, freq="3 months", startdate=Sys.Date() }
forwardportfolioprice <- function(portfolio, startdate, maturity, coupontype, margin, liborfloor){
- if(missing(liborfloor)){
- currentcoupon <- margin
- }else{
- currentcoupon <- margin + liborfloor
- }
- forwardcs <- couponSchedule(nextpaydate=startdate+45, maturity,
- frequency="Q", coupontype, margin,
- currentcoupon, startdate=startdate)
- #select curves that have non zero lengthhazardrates
- idx <- unlist(lapply(portfolio$SC, function(x)length(x@curve@hazardrates)>0))
- price <- function(x, ...){
- cl <- couponleg(forwardcs, x@curve, startdate)
- pl <- contingentleg(forwardcs, x@curve, x@recovery, startdate)
- return( pl + cl)
- }
+ if(missing(liborfloor)||is.na(liborfloor)){
+ currentcoupon <- margin
+ }else{
+ currentcoupon <- margin + liborfloor
+ }
+ forwardcs <- couponSchedule(nextpaydate=startdate+45, maturity,
+ frequency="Q", coupontype, margin,
+ currentcoupon, startdate=startdate)
+ fixedcs <- couponSchedule(nextpaydate=startdate+45, maturity, frequency="Q", "FIXED", 1,
+ startdate=startdate)
+ ##select curves that have non zero lengthhazardrates
+ idx <- unlist(lapply(portfolio$SC, function(x)length(x@curve@hazardrates)>0))
+ price <- function(x, ...){
+ cl <- couponleg(forwardcs, x@curve, startdate)
+ pl <- contingentleg(forwardcs, x@curve, x@recovery, startdate)
+ return( pl + cl)
+ }
- return(crossprod(portfolio$notional[idx],
- vapply(portfolio$SC[idx], price, numeric(1)))/
- sum(portfolio$notional[idx]))
+ ## duration <- function(x, ...){
+ ## return( couponleg(fixedcs, x@curve))
+ ## }
+ ## durationvec <- unlist(lapply(portfolio$SC[idx], function(x){couponleg(fixedcs, x@curve)}))
+ ## if(all(durationvec==0)){
+ ## return(1)
+ ## }else{
+ ## return(crossprod(portfolio$notional[idx] * durationvec,
+ ## vapply(portfolio$SC[idx], price, numeric(1)))/
+ ## crossprod(portfolio$notional[idx], durationvec))
+ ## }
+ return(crossprod(portfolio$notional[idx],
+ vapply(portfolio$SC[idx], price, numeric(1)))/
+ crossprod(portfolio$notional[idx], durationvec))
}
+forwardportfolioprice2 <- function(cdrmonthly, recoverymonthly, startdate, maturity,
+ coupontype, margin, liborfloor){
+ if(missing(liborfloor)||is.na(liborfloor)){
+ currentcoupon <- margin
+ }else{
+ currentcoupon <- margin + liborfloor
+ }
+ browser()
+ forwardcs <- data.table(couponSchedule(nextpaydate=startdate+45, maturity,
+ frequency="Q", coupontype, margin,
+ currentcoupon, startdate=startdate), key="dates")
+ notionals <- cdrmonthly[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 <- crossprod(-apply(rbind(1,as.matrix(outstanding)), 2, diff),t(notionals[,df]))
+ mean(as.numeric(recovery+po+io))
+}
creditcurve.maturity <- function(creditcurve){
if(class(creditcurve)=="creditcurve"){
|
