diff options
Diffstat (limited to 'R')
| -rw-r--r-- | R/build_scenarios.R | 7 | ||||
| -rw-r--r-- | R/cds_functions_generic.R | 39 | ||||
| -rw-r--r-- | R/intex_deal_functions.R | 84 |
3 files changed, 54 insertions, 76 deletions
diff --git a/R/build_scenarios.R b/R/build_scenarios.R index 6df618f6..10e4d490 100644 --- a/R/build_scenarios.R +++ b/R/build_scenarios.R @@ -222,7 +222,6 @@ for(j in seq_along(dealnames)){ reinvprices <- list()
for(assetname in names(reinvassets)){
asset <- reinvassets[[assetname]]
- reinvprices[[assetname]] <- numeric(length(deal.datesmonthly))
if(asset$coupontype=="FLOAT") {
coupon <- reinvspread
}else{
@@ -231,9 +230,9 @@ for(j in seq_along(dealnames)){ #reinvest tweak
coupon <- coupon-0.0075
- reinvprices[[assetname]] <- foreach(i = icount(length(deal.datesmonthly))) %dopar% {
- 100 * forwardportfolioprice(deal.portfolio, deal.datesmonthly[i],
- min(deal.datesmonthly[i]+rollingmaturity*30, deal.data$maturity),
+ reinvprices[[assetname]] <- foreach(date = iter(deal.datesmonthly)) %dopar% {
+ 100 * forwardportfolioprice(deal.portfolio, 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 d404992f..8b05d666 100644 --- a/R/cds_functions_generic.R +++ b/R/cds_functions_generic.R @@ -1,4 +1,6 @@ library("methods")
+library("doParallel")
+library("itertools")
if(.Platform$OS.type == "unix"){
root.dir <- "/home/share/CorpCDOs/"
@@ -522,6 +524,7 @@ indexpv <- function(portfolio, index, epsilon=0){ pl <- rep(0, length(portfolio))
cl <- rep(0, length(portfolio))
cs <- couponSchedule(nextIMMDate(Sys.Date()), index$maturity, "Q", "FIXED", index$coupon)
+
for(i in 1:length(portfolio)){
if(epsilon!=0){
tweakedcurve <- portfolio[[i]]@curve
@@ -558,31 +561,22 @@ portfoliospread <- function(portfolio, maturity){ ## computes the spread of a portfolio defined by notionals and survivalcurves
## for a given maturity.
## if maturity is missing, we use the intrinsic maturity for each curve
- S <- 0
- d <- rep_len(0, length(portfolio$SC))
- ## Svec <- 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 seq_along(portfolio$SC)){
- if(length(portfolio$SC[[i]]@curve@hazardrates)==0||maturityvec[i]<=portfolio$SC[[i]]@startdate){
- d[i] <- 0
- ## Svec[i] <- 0
- }else{
- if(portfolio$SC[[i]]@curve@hazardrates[1]>10){
- d[i] <- 0
- }else{
- d[i] <- cdsduration(portfolio$SC[[i]]@curve, maturityvec[i])
+
+ data <- foreach(it = izip(creditcurve = portfolio$SC, notional = portfolio$notional,
+ maturity = maturityvec, count=icount(length(portfolio$notional))), .combine=rbind) %:% {
+ when(length(it$creditcurve@curve@hazardrates)!=0 && it$maturity > it$creditcurve@startdate
+ && it$creditcurve@curve@hazardrates[1]<=10)
+ } %dopar% {
+ d <- cdsduration(it$creditcurve@curve, it$maturity)
+ S <- cdsspread(it$creditcurve@curve, it$maturity, it$creditcurve@recovery)
+ c(d * S * it$notional, d * it$notional)
}
- S <- S + d[i] * portfolio$notional[i] *
- cdsspread(portfolio$SC[[i]]@curve, maturityvec[i], portfolio$SC[[i]]@recovery)
- ## Svec[i] <- cdsspread(portfolio$SC[[i]]@curve, maturityvec[i], portfolio$SC[[i]]@recovery)
- }
- }
- S <- S/crossprod(d, portfolio$notional)
- return(S)
+ return(sum(data[,1])/sum(data[,2]))
}
portfolioduration <- function(portfolio, maturity){
@@ -600,10 +594,9 @@ tweakcurves <- function(portfolio, index){ abs(indexpv(portfolio, index, epsilon)$bp-index$indexref)
}
epsilon <- optimize(f, c(-0.5, 0.5), portfolio, index, tol=1e-6)$minimum
- portfolio.new <- portfolio
- for(i in seq_along(portfolio)){
- portfolio.new[[i]]@curve@hazardrates <- portfolio[[i]]@curve@hazardrates * (1 + epsilon)
- }
+ portfolio.new <- lapply(portfolio, function(x, ...) {
+ x@curve@hazardrates <- x@curve@hazardrates * (1+epsilon)
+ return(x)})
cat("tweak = ", epsilon, "\n")
return( portfolio.new )
}
diff --git a/R/intex_deal_functions.R b/R/intex_deal_functions.R index bf3ba927..5ca6d6aa 100644 --- a/R/intex_deal_functions.R +++ b/R/intex_deal_functions.R @@ -2,6 +2,14 @@ library(RQuantLib) library(statmod)
library(data.table)
options(datatable.nomatch=0)
+library(doParallel)
+
+hostname <- system("hostname", intern=TRUE)
+if(hostname=="debian"){
+ registerDoParallel(8)
+}else{
+ registerDoParallel(4)
+}
if(.Platform$OS.type == "unix"){
root.dir <- "/home/share/CorpCDOs/"
@@ -240,58 +248,36 @@ buildSC <- function(line.item, reinvdate, dealmaturity, global.params, startdate if(is.na(line.item$price)){
## TODO
}
- return( list(SC=SC, notional=line.item$currentbalance, price = line.item$price) )
+ beta <- if(!is.na(line.item$iscdo) && line.item$iscdo) 1 else global.params$defaultcorr
+ return( list(SC=SC, notional=line.item$currentbalance, price = line.item$price, beta = beta) )
}
buildSC.portfolio <- function(dealname, dealdata, cusipdata, global.params, startdate = Sys.Date()) {
- collatdata <- getcollateral(dealname, startdate)
- notionalvec <- c()
- SCvec <- c()
- betavec <- c()
- pricevec <- c()
- fields <- c("maturity", "fixedorfloat", "spread", "grosscoupon", "orig_moody")
- cdonotional <- 0
- missingpricenotional <- 0
- totalnotional <- 0
- for(i in 1:nrow(collatdata)){
- line.item <- collatdata[i,]
- if( is.na(line.item$maturity) ){
- stop("empty maturity")
- }
- ##most likely equity, doesn't impact the risk anyway
- if(line.item$currentbalance < 1 || line.item$assettype=="Equity"){
- next
- }
- ## overwrite the data with cusipdata info if not NA,
- ## because it should be higher quality
- ## e.g all cdos in acacl061 had wrong maturity
- newcusipdata <- cusipdata[line.item$cusip]
- if(dim(newcusipdata)[1]>0){
- line.item$iscdo <- TRUE
- for(field in fields){
- if(!is.na(newcusipdata$field)){
- line.item[field] <- newcusipdata$field
- }
- }
- }
- totalnotional <- totalnotional + line.item$currentbalance
- if(!is.na(line.item$iscdo) && line.item$iscdo){
- cdonotional <- cdonotional + line.item$currentbalance
- }else{
- if(is.na(line.item$price) && line.item$maturity>startdate){
- missingpricenotional <- missingpricenotional + line.item$currentbalance
- }
- }
- temp <- buildSC(line.item, dealdata$"Reinv End Date", dealdata$maturity, global.params, startdate)
- notionalvec <- c(notionalvec, temp$notional)
- SCvec <- c(SCvec, temp$SC)
- pricevec <- c(pricevec, temp$price)
- betavec <- c(betavec, if(!is.na(line.item$iscdo) && line.item$iscdo) 1 else
- global.params$defaultcorr)
- }
- return( list(notional=notionalvec, SC=SCvec, beta=betavec, price = pricevec,
- cdopercentage = cdonotional/totalnotional,
- stale = missingpricenotional/totalnotional, collatbalance = totalnotional) )
+ collatdata <- data.table(getcollateral(dealname, startdate))
+ setkey(collatdata, "cusip")
+
+ ## replace the cdo fields by bloomberg data
+ collatdata[cusipdata[collatdata$cusip],
+ `:=`(maturity=i.maturity, fixedorfloat=i.fixedorfloat,
+ spread=i.spread, grosscoupon=i.grosscoupon, orig_moody=i.orig_moody)]
+
+ portfolio <- foreach(line.item = iter(collatdata, by='row')) %:% {
+ when( !is.na(line.item$maturity) && line.item$currentbalance > 1
+ && line.item$assettype!="Equity") } %dopar% {
+ buildSC(line.item, dealdata$"Reinv End Date", dealdata$maturity, global.params, startdate)
+ }
+ missingpricenotional <- sum(collatdata[is.na(price) & maturity>startdate,currentbalance])
+ cdonotional <- sum(collatdata[iscdo==TRUE,currentbalance])
+ collatbalance <- sum(collatdata[,currentbalance])
+
+ return( list(notional=vapply(portfolio, function(x)x$notional, numeric(1)),
+ beta = vapply(portfolio, function(x)x$beta, numeric(1)),
+ price = vapply(portfolio, function(x)x$price, numeric(1)),
+ SC = lapply(portfolio, function(x)x$SC),
+ stale = missingpricenotional/collatbalance,
+ cdopercentage = cdonotional/collatbalance,
+ collatbalance = collatbalance
+ ) )
}
cdrfromscenarios <- function(scenarios, dates){
|
