if(.Platform$OS.type == "unix"){ root.dir <- "/home/share/CorpCDOs" }else{ root.dir <- "//WDSENTINEL/share/CorpCDOs" } source(file.path(root.dir, "code", "R", "cds_utils.R")) source(file.path(root.dir, "code", "R", "cds_functions_generic.R")) buildSC <- function(quote, cs, cdsdates){ SC <- new("creditcurve", recovery=quote$recovery, startdate=tradedate, issuer=quote$ticker) quotes <- data.frame(maturity=cdsdates, upfront = quote$upfront, running=quote$running) SC@curve <- cdshazardrate(quotes, SC@recovery, tradedate, cs) return( SC ) } get.cdsSchedule <- function(tradedate){ cdsdates <- as.Date(character(0)) for(tenor in paste0(1:5, "y")){ cdsdates <- c(cdsdates, cdsMaturity(tenor, date=tradedate)) } return( list(cs=couponSchedule(IMMDate(tradedate), cdsdates[length(cdsdates)], "Q", "FIXED", 1, tradedate, IMMDate(tradedate, "prev")), cdsdates=cdsdates) ) } set.singlenamesdata <- function(index, tradedate){ cds.cs <- get.cdsSchedule(tradedate) quotes <- get.indexquotes(index$name, tradedate) tenor <- paste0(1:5, "y") index$portfolio <- list() for(i in seq_along(quotes$tickers)){ quote <- list(ticker = quotes$ticker[i], running = quotes$spread_curve[i, tenor] * 1e-4, upfront = quotes$upfront_curve[i, tenor] * 0.01, recovery = quotes$recovery[i,tenor][1]) index$portfolio <- c(index$portfolio, buildSC(quote, cds.cs$cs, cds.cs$cdsdates)) } index$issuerweights <- rep(1/length(index$portfolio), length(index$portfolio)) index$recov <- sapply(index$portfolio, attr, "recovery") return( index ) } set.tranchedata <- function(index, tradedate){ temp <- get.tranchequotes(index$name, tradedate) index$indexref <- temp$refbasketprice[1]/100 index$cs <- couponSchedule(IMMDate(tradedate), index$maturity,"Q", "FIXED", 0.05, 0, tradedate, IMMDate(tradedate, "prev")) index$portfolio <- tweakcurves(index, tradedate)$portfolio index$defaultprob <- 1-SPmatrix(index$portfolio, length(index$cs$dates)) negprob <- which(index$defaultprob<0, arr.ind=T) if(nrow(negprob)>0){ stop(paste(index$portfolio[[negprob[1,]]]@issuer, "has negative probability, check single names data")) } K <- c(0, temp$detach/100) index$K <- adjust.attachments(K, index$loss, index$factor) index$tranche.upf <- temp$upfront index$tranche.running <- temp$running*1e-4 ## convert the quotes ## - we convert to protection terms x->1-x/100 ## - we remove accrued x->x-acc ## - we weight it by the size of the tranche ## - we take the cumsum to convert to 0-5, 0-10, 0-15 quotes, etc... ## calibrate the tranches using base correlation index$quotes <- cumsum(diff(index$K) * (1-index$tranche.upf/100-cdsAccrued(tradedate, index$tranche.running))) return(index) }