diff options
Diffstat (limited to 'R')
| -rw-r--r-- | R/pretty_plots.R | 105 |
1 files changed, 98 insertions, 7 deletions
diff --git a/R/pretty_plots.R b/R/pretty_plots.R index bb9be08b..e883910f 100644 --- a/R/pretty_plots.R +++ b/R/pretty_plots.R @@ -1,18 +1,109 @@ -load("/home/share/CorpCDOs/Scenarios/Intex Curves_2015-11-30/csv/wthrs4.RData") -wthrs4.dist <- dist.joint -load("/home/share/CorpCDOs/Scenarios/Intex Curves_2015-11-30/csv/saturn.RData") -saturn.dist <- dist.joint +library(ggplot2) +root.dir <- "/home/share/CorpCDOs/" +source(file.path(root.dir, "code", "R", "load_cf.R")) +date <- Sys.Date() +dists <- list() +for(deal in c('ares29', 'bally131')) { + load(file.path(root.dir, "Scenarios", sprintf("Intex Curves_%s", date), "csv", paste(deal, "RData", sep="."))) + dists[[deal]] <- dist.joint +} + +support <- seq(0, 1, length = 201) ##5 year ggplot() + - geom_line(aes(x=support, y=rowSums(wthrs4.dist[17,,]), colour='Whitehorse IV')) + - geom_line(aes(x=support, y=rowSums(saturn.dist[17,,]), colour='Saturn CLO')) + + geom_line(aes(x=support, y=rowSums(dists$ares29[17,,]), colour='Ares XXIX CLO')) + + geom_line(aes(x=support, y=rowSums(dists$bally131[17,,]), colour='Ballyrock CLO 2013-1')) + ylab("loss density")+xlab("percentage of loss") + geom_vline(aes(colour='Market assumption', xintercept=0.03)) + annotate("text", x=0.5, y=0.025, label="T=5 year", size=4) + annotate("text", x=0.5, y=0, label="2 CDR, 70% recovery", colour="#F8766D", size=4) + -labs(colour="") + + labs(colour="") + theme(legend.position="bottom") ggsave("Loss distribution.png", width=4.35, height=4) ##ggsave("Loss distribution.png") + +tradedate <- as.Date("2016-10-19") +calibration.date <- as.Date("2016-10-18") +load(file.path(root.dir, "Scenarios", "Calibration", sprintf("marketdata-%s.RData", calibration.date))) +load(file.path(root.dir, "Scenarios", paste0("Prices_", tradedate), "cashflows.RData")) + +getcusip.pv <- function(cusip, dealname, cusipdata, date) { + indic.data <- getcusip_indicdata(cusip, dealname, date) + cusip.pv <- cusipdata[[cusip]]$fields[,"Cashflow"]/indic.data$curr_balance + return( cusip.pv ) +} + +index.pv <- function(indexdist, dealdata) { + dealweight <- dealdata$weight + dealprice <- dealdata$price + nT <- dim(indexdist$L)[2] + Ngrid <- dim(indexdist$L)[1] + scenariosl <- matrix(0, length(dealweight), nT) + scenariosr <- matrix(0, length(dealweight), nT) + for(t in 1:nT){ + scenariosl[,t] <- interpvalues(indexdist$L[,t], seq(0, 1, length=Ngrid), dealweight) + ## numerical artefact, but we want scenariosr[i,] + scenariosl[i,] <= 1 at all times + scenariosr[,t] <- pmin(interpvalues(indexdist$R[,t], seq(0, 1, length=Ngrid), dealweight), + 1-scenariosl[,t]) + } + ## we assume the index is fully funded - need to be changed depending + ## on how we fund the swaps (hence floating coupon instead of fixed) + indexpv <- c() + for(i in 1:length(dealweight)){ + indexpv <- c(indexpv, funded.tranche.pv(scenariosl[i,], scenariosr[i,], cs, 0, 1, TRUE)) + } + return(indexpv) +} + +getcusip_indicdata <- function(Cusip, dealname, date){ + sqlstr <- "SELECT DISTINCT isin FROM cusip_universe WHERE cusip=$1" + r <- tryCatch(dbGetQuery(etdb, sqlstr, params=list(Cusip)), + error = function(w) logerror(w$message)) + if(length(r$isin)>1){ + stop("We have a problem") + } + isinval <- r$isin[1] + sqlstr <- "SELECT * FROM historical_dealname_universe($1, $2)" + r <- tryCatch(dbGetQuery(etdb, sqlstr, params = list(dealname, date)), + error = function(w) logerror(w$message)) + if(!is.na(isinval)){ + return(r %>% group_by(isin) %>% slice(1) %>% + summarize(cusip, curr_balance, orig_balance, spread, curr_attach) %>% + arrange(desc(curr_attach)) %>% + mutate(cum_bal = cumsum(curr_balance)) %>% filter(isin==isinval) ) + }else{ + return(r %>% select(cusip, curr_balance, orig_balance, spread, curr_attach) %>% + arrange(desc(curr_attach)) %>% + mutate(cum_bal = cumsum(curr_balance)) %>% filter(cusip==Cusip) ) + } +} + +tradedate <- as.Date("2016-10-19") +dealname <- "bally131" +hy.pv <- index.pv(dist, cfdata[[dealname]]) +bally131 <- data.frame(cusips = c("05874PAA4", "05874PAC0", "05874PAE6", "05874PAG1", "05874QAC8", "05874QAA2"), + name = c("A", "B", "C", "D", "E", "SUB"), + rating = c("AAA", "AA", "A", "BBB", "BB", "NA")) + +support <- cumsum(cfdata[[dealname]]$weight) * 100 + +df <- data.frame(x =support, pv = hy.pv * 100, name = "HY27 5Y") +for(i in 1:nrow(bally131)) { + df <- rbind(df, + data.frame(x =support, + pv = getcusip.pv(bally131$cusips[i], dealname, cusipdata, date)*100, + name = bally131$rating[i])) +} + +ggplot(df) + + geom_line(aes(x=x, y =pv, group = name, colour = factor(name))) + + ylab("Expected price")+xlab("scenario percentile") + + theme(legend.position="bottom") + +for(cusip in cusips ) { + cusip.pv <- getcusip.pv(cusip, dealname, cusipdata, date) + plot <- plot + geom_line(aes(x=support, y =cusip.pv * 100, + colour=sprintf('Ballyrock CLO 2013-1 %s', cusip))) +} |
