aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--R/load_cf.R251
1 files changed, 124 insertions, 127 deletions
diff --git a/R/load_cf.R b/R/load_cf.R
index 9fe4f207..c411f545 100644
--- a/R/load_cf.R
+++ b/R/load_cf.R
@@ -9,8 +9,10 @@ if(.Platform$OS.type == "unix"){
source(file.path(root.dir, "code", "R", "etdb.R"))
source(file.path(root.dir, "code", "R", "yieldcurve.R"))
source(file.path(root.dir, "code", "R", "cds_utils.R"))
+source(file.path(root.dir, "code", "R", "intex_deal_functions.R"))
+source(file.path(root.dir, "code", "R", "optimization.R"))
-workdate <- as.Date("2013-02-07")
+workdate <- as.Date("2013-02-11")
MarkitData <- getMarkitIRData(workdate)
L1m <- buildMarkitYC(MarkitData, dt = 1/12)
@@ -29,11 +31,6 @@ sanitize.column <- function(vec){
return( as.numeric(vec) )
}
-fields <- c("Cashflow", "Principal", "Interest")
-tranches <- c("COLLAT_REINVEST", "COLLAT_INITIAL")
-n.scenarios <- 100
-
-flag <- FALSE
allfiles <- list.files(file.path(root.dir, "Scenarios", paste0("Prices_", workdate)), "*.txt")
allfiles <- unique(sapply(strsplit(allfiles, "-"), function(x) x[1]))
allfiles <- allfiles[!(allfiles=="Total")]
@@ -42,44 +39,127 @@ dealnames <- unique(sapply(strsplit(dealnames, "-"), function(x) x[1]))
cusips <- setdiff(allfiles, dealnames)
dealnames <- tolower(dealnames)
-cfdata <- list()
-for(dealname in dealnames){
- cfdata[[dealname]] <- list()
- r <- matrix(0, n.scenarios, 3)
- colnames(r) <- fields
- sqlstring <- sprintf("select marketvalue from latest_deal_model_numbers where dealname='%s'", dealname)
- mv <- dbGetQuery(dbCon, sqlstring)$marketvalue
- sqlstring <- sprintf("select \"Curr Collat Bal\" from latest_clo_universe where dealname='%s'", dealname)
- currbal <- dbGetQuery(dbCon, sqlstring)$"Curr Collat Bal"
- cfdata[[dealname]]$mv <- mv
- cfdata[[dealname]]$currbal <- currbal
- for(tranche in tranches){
- for(i in 1:n.scenarios){
- filename <- paste0(paste(toupper(dealname), tranche, "CF", paste0("Scen", i), sep="-"), ".txt")
- ## we catch the error if there is an error reading the file
- ## happen if the tranche is missing in intex
- data <- tryCatch(read.table(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
- sep="\t", header=F, skip=3, colClasses="character", comment.char=""),
- error = function(e) e)
- if(inherits(data, "error")){
+getdealcf <- function(dealnames, workdate=Sys.Date()){
+ cfdata <- list()
+ tranches <- c("COLLAT_REINVEST", "COLLAT_INITIAL")
+ fields <- c("Cashflow", "Principal", "Interest")
+ flag <- FALSE
+ n.scenarios <- 100
+ for(dealname in dealnames){
+ cfdata[[dealname]] <- list()
+ r <- matrix(0, n.scenarios, 3)
+ colnames(r) <- fields
+ sqlstring <- sprintf("select marketvalue from latest_deal_model_numbers where dealname='%s'", dealname)
+ mv <- dbGetQuery(dbCon, sqlstring)$marketvalue
+ sqlstring <- sprintf("select \"Curr Collat Bal\" from latest_clo_universe where dealname='%s'", dealname)
+ currbal <- dbGetQuery(dbCon, sqlstring)$"Curr Collat Bal"
+ cfdata[[dealname]]$mv <- mv
+ cfdata[[dealname]]$currbal <- currbal
+ for(tranche in tranches){
+ for(i in 1:n.scenarios){
+ filename <- paste0(paste(toupper(dealname), tranche, "CF", paste0("Scen", i), sep="-"), ".txt")
+ ## we catch the error if there is an error reading the file
+ ## happen if the tranche is missing in intex
+ data <- tryCatch(
+ read.table(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
+ sep="\t", header=F, skip=3, colClasses="character", comment.char=""),
+ error = function(e) e)
+ if(inherits(data, "error")){
+ cfdata[[dealname]] <- NULL
+ break
+ }
+ data <- data[,1:4]
+ colnames(data) <- c("Date", "Cashflow", "Principal", "Interest")
+ data$Date <- as.Date(data$Date, "%b %d, %Y")
+ if(any(is.na(data$Date))){
+ cat(sprintf("file: %s is messed up", filename), "\n")
+ flag <- TRUE
+ break
+ }
+ futuredates <- data$Date[data$Date>=workdate]
+ pastdates <- data$Date[data$Date<workdate]
+ if(i==1||length(futuredates)>length(DC$times)){
+ DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, futuredates))
+ }
+ pv <- c()
+ for(field in fields){
+ data[,field] <- tryCatch(sanitize.column(data[,field]),
+ warning = function(w){cat("garbled", dealname, i)})
+ if(length(futuredates) == 0){
+ df <- rep(1, length(pastdates))
+ }else{
+ df <- c(rep(1, length(pastdates)), DC$discounts[1:length(futuredates)])
+ }
+ if(nrow(data)>0){
+ pv <- c(pv, crossprod(df, data[,field]))
+ }else{
+ pv <- c(pv, 0)
+ }
+ }
+ r[i,] <- pv
+ }
+ if(flag){
cfdata[[dealname]] <- NULL
+ flag <- FALSE
break
+ }else{
+ cfdata[[dealname]][[tranche]]<- r
+ }
+ }
+ cf <- cfdata[[dealname]][["COLLAT_REINVEST"]][,"Cashflow"] +
+ cfdata[[dealname]][["COLLAT_INITIAL"]][,"Cashflow"]
+ program <- KLfit(t(cf)/1e8, rep(1/n.scenarios, n.scenarios),
+ cfdata[[dealname]]$mv/1e8)
+ cfdata[[dealname]]$weight <- program$weight
+ }
+ return( cfdata )
+}
+
+getcusipcf <- function(cusips, cfdata, workdate=Sys.Date()){
+ flag <- FALSE
+ cusipdata <- list()
+ dealnames <- dealnamefromcusip(cusips)
+ n.scenarios <- 100
+ intexfields <- c("Cashflow", "Principal", "Interest", "Balance")
+ fields <- c("Cashflow", "Principal", "Interest")
+ for(i in 1:length(cusips)){
+ cusip <- cusips[i]
+ dealdata <- getdealdata(dealnames[i])
+ schedule <- getdealschedule(dealdata)
+ r <- matrix(0, n.scenarios, 4)
+ colnames(r) <- c(fields, "wal")
+ sqlstring <- sprintf("select curr_balance, spread from cusip_universe where cusip = '%s'", cusip)
+ indicdata <- dbGetQuery(dbCon, sqlstring)
+ cusipdata[[cusip]]$currbal <- indicdata$curr_balance
+ cusipdata[[cusip]]$spread <- indicdata$spread
+ for(j in 1:n.scenarios){
+ filename <- sprintf("%s-CF-Scen%s.txt", cusip, j)
+ if(!file.exists(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename))){
+ next
}
- data <- data[,1:4]
- colnames(data) <- c("Date", "Cashflow", "Principal", "Interest")
+ data <- read.table(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
+ sep = "\t", header=T, colClasses="character", skip = 3, comment.char="")
+ data <- data[, 1:5]
+ colnames(data) <- c("Date", intexfields)
data$Date <- as.Date(data$Date, "%b %d, %Y")
if(any(is.na(data$Date))){
cat(sprintf("file: %s is messed up", filename), "\n")
flag <- TRUE
break
}
- futuredates <- data$Date[data$Date>=workdate]
- pastdates <- data$Date[data$Date<workdate]
+ futuredates <- data$Date[data$Date >= workdate]
+ pastdates <- data$Date[data$Date < workdate]
if(i==1||length(futuredates)>length(DC$times)){
DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, futuredates))
}
+ if(length(futuredates) == 0){
+ df <- rep(1, length(pastdates))
+ }else{
+ df <- c(rep(1, length(pastdates)), DC$discounts[1:length(futuredates)])
+ }
pv <- c()
for(field in fields){
+ data[,"Balance"]
data[,field] <- tryCatch(sanitize.column(data[,field]),
warning = function(w){cat("garbled", dealname, i)})
if(length(futuredates) == 0){
@@ -93,104 +173,21 @@ for(dealname in dealnames){
pv <- c(pv, 0)
}
}
- r[i,] <- pv
+ wal <- yearFrac(workdate, data$Date) * data[,"Cashflow"]/sum(data[,"Cashflow"])
+ r[,j] <- c(pv, wal)
}
- if(flag){
- cfdata[[dealname]] <- NULL
- flag <- FALSE
- break
- }else{
- cfdata[[dealname]][[tranche]]<- r
- }
- }
-}
-r <- c()
-for(dealname in names(cfdata)){
- r <- rbind(r, c(cfdata[[dealname]]$mv, cfdata[[dealname]]$currbal, apply(cfdata[[dealname]]$COLLAT_REINVEST, 2, mean)[1], apply(cfdata[[dealname]]$COLLAT_INITIAL, 2, mean)[1]))
-}
-colnames(r) <- c("mv", "currbal", "Reinvest", "Initial")
-rownames(r) <- dealnames
-
-intexfields <- c("Cashflow", "Principal", "Interest", "Balance")
-
-flag <- FALSE
-cusipdata <- list()
-for(cusip in cusips){
- dealname <- dealnamefromcusip(cusip)
- dealdata <- getdealdata(dealname)
- schedule <- getdealschedule(dealdata)
- r <- matrix(0, n.scenarios, 3)
- colnames(r) <- fields
- sqlstring <- sprintf("select curr_balance, spread from cusip_universe where cusip = '%s'", cusip)
- indicdata <- dbGetQuery(dbCon, sqlstring)
- cusipdata[[cusip]]$currbal <- indicdata$curr_balance
- cusipdata[[cusip]]$spread <- indicdata$spread
- for(i in 1:n.scenarios){
- filename <- sprintf("%s-CF-Scen%s.txt", cusip, i)
- if(length(list.files(file.path(root.dir, "Scenarios", paste0("Prices_", workdate)), filename))==0){
- next
- }
- data <- read.table(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
- sep = "\t", header=T, colClasses="character", skip = 3, comment.char="")
- data <- data[, 1:5]
- colnames(data) <- c("Date", "Cashflow", "Principal", "Interest", "Balance")
- data$Date <- as.Date(data$Date, "%b %d, %Y")
- if(any(is.na(data$Date))){
- cat(sprintf("file: %s is messed up", filename), "\n")
- flag <- TRUE
- break
- }
- ## cleanup the data
- for(field in intexfields){
- data[,field] <- tryCatch(sanitize.column(data[,field]),
- warning = function(w){cat("garbled", dealname, i)})
- }
- futuredates <- data$Date[data$Date >= workdate]
- pastdates <- data$Date[data$Date < workdate]
- if(i==1||length(futuredates)>length(DC$times)){
- DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, futuredates))
- }
- if(length(futuredates) == 0){
- df <- rep(1, length(pastdates))
- }else{
- df <- c(rep(1, length(pastdates)), DC$discounts[1:length(futuredates)])
- }
- ## compute the pvs
- for(field in c("Cashflow", "Principal", "Interest")){
- if(nrow(data)>0){
- cusipdata[[cusip]][[field]] <- c(pv, crossprod(df, data[,field]))
- }else{
- cusipdata[[cusip]][[field]] <- c(pv, crossprod(df, data[,field]))
- }
- }
- ## compute the duration
- data[,"Balance"]* DC$forwards[DC$times==
- if(flag){
- cusipsdata[[cusip]] <- NULL
- flag <- FALSE
- break
- }else{
- for(field in fields){
- cusipdata[[cusip]][[field]] <- r[,field]
- }
- cusipdata[[cusip]][["duration"]] <- data[,"Interest"]/data
- }
-}
-
-prices <- c()
-duration <- c()
- for(cusip in names(cusipdata)){
- prices <- c(prices, mean(cusipdata[[cusip]]$Cashflow)/cusipdata[[cusip]]$currbal)
- duration <- c(duration, mean(cusipdata[[cusip]]$Interest)/
- (cusipdata[[cusip]]$currbal*cusipdata[[cusip]]$spread))
}
-}
-cusupdata[[cusip]]$Interest-cusipdata[[cusip
-durations <- getdealschedule(getdealdata("marlst"))
-forwards <- DC$forwards
-cusipdata[[cusip]]$Balance * forwards[i]+spreadi <- 1
-for(cusip in names(cusipdata)){
- cat(cusip, prices[i], "\n")
- i <- i+1
+ if(flag){
+ cusipdata[[cusip]] <- NULL
+ flag <- FALSE
+ break
+ }else{
+ cusipdata[[cusip]]$fields <- r
+ cusipdata[[cusip]]$price <- crossprod(cfdata[[dealnames[i]]]$weight,
+ cusipdata[[cusip]]$fields[,"Cashflow"])/cusipdata[[cusip]]$currbal
+ cusipdata[[cusip]]$wal <- crossprod(cfdata[[dealnames[i]]]$weight,
+ cusipdata[[cusip]]$fields[,"wal"])
+ }
+ return(cusipdata)
}