diff options
| -rw-r--r-- | R/load_cf.R | 107 |
1 files changed, 80 insertions, 27 deletions
diff --git a/R/load_cf.R b/R/load_cf.R index c411f545..7703e87f 100644 --- a/R/load_cf.R +++ b/R/load_cf.R @@ -65,7 +65,8 @@ getdealcf <- function(dealnames, workdate=Sys.Date()){ sep="\t", header=F, skip=3, colClasses="character", comment.char=""),
error = function(e) e)
if(inherits(data, "error")){
- cfdata[[dealname]] <- NULL
+ cat(sprintf("file: %s, tranche: %s can't be loaded", dealname, tranche), "\n")
+ flag <- TRUE
break
}
data <- data[,1:4]
@@ -76,15 +77,22 @@ getdealcf <- function(dealnames, workdate=Sys.Date()){ flag <- TRUE
break
}
- futuredates <- data$Date[data$Date>=workdate]
- pastdates <- data$Date[data$Date<workdate]
+ futuredates <- data$Date[data$Date>=L3m$params$tradeDate]
+ pastdates <- data$Date[data$Date<L3m$params$tradeDate]
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)})
+ cleanfield <- tryCatch(sanitize.column(data[,field]),
+ warning = function(w) w)
+ if(inherits(cleanfield, "warning")){
+ cat("garbled", dealname, i, "\n")
+ flag <- TRUE
+ break
+ }else{
+ data[,field] <- cleanfield
+ }
if(length(futuredates) == 0){
df <- rep(1, length(pastdates))
}else{
@@ -96,7 +104,11 @@ getdealcf <- function(dealnames, workdate=Sys.Date()){ pv <- c(pv, 0)
}
}
- r[i,] <- pv
+ if(flag){
+ break
+ }else{
+ r[i,] <- pv
+ }
}
if(flag){
cfdata[[dealname]] <- NULL
@@ -106,8 +118,13 @@ getdealcf <- function(dealnames, workdate=Sys.Date()){ cfdata[[dealname]][[tranche]]<- r
}
}
+ if(is.null(cfdata[[dealname]])){
+ next
+ }
cf <- cfdata[[dealname]][["COLLAT_REINVEST"]][,"Cashflow"] +
cfdata[[dealname]][["COLLAT_INITIAL"]][,"Cashflow"]
+ cfdata[[dealname]]$wapbasis <- (mean(cf)- cfdata[[dealname]]$mv)/cfdata[[dealname]]$mv
+ cat(dealname, "\n")
program <- KLfit(t(cf)/1e8, rep(1/n.scenarios, n.scenarios),
cfdata[[dealname]]$mv/1e8)
cfdata[[dealname]]$weight <- program$weight
@@ -126,8 +143,8 @@ getcusipcf <- function(cusips, cfdata, workdate=Sys.Date()){ cusip <- cusips[i]
dealdata <- getdealdata(dealnames[i])
schedule <- getdealschedule(dealdata)
- r <- matrix(0, n.scenarios, 4)
- colnames(r) <- c(fields, "wal")
+ r <- matrix(0, n.scenarios, 5)
+ colnames(r) <- c(fields, "wal", "duration")
sqlstring <- sprintf("select curr_balance, spread from cusip_universe where cusip = '%s'", cusip)
indicdata <- dbGetQuery(dbCon, sqlstring)
cusipdata[[cusip]]$currbal <- indicdata$curr_balance
@@ -138,7 +155,7 @@ getcusipcf <- function(cusips, cfdata, workdate=Sys.Date()){ next
}
data <- read.table(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
- sep = "\t", header=T, colClasses="character", skip = 3, comment.char="")
+ sep = "\t", header=F, colClasses="character", skip = 3, comment.char="")
data <- data[, 1:5]
colnames(data) <- c("Date", intexfields)
data$Date <- as.Date(data$Date, "%b %d, %Y")
@@ -147,8 +164,8 @@ getcusipcf <- function(cusips, cfdata, workdate=Sys.Date()){ flag <- TRUE
break
}
- futuredates <- data$Date[data$Date >= workdate]
- pastdates <- data$Date[data$Date < workdate]
+ futuredates <- data$Date[data$Date >= L3m$params$tradeDate]
+ pastdates <- data$Date[data$Date < L3m$params$tradeDate]
if(i==1||length(futuredates)>length(DC$times)){
DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, futuredates))
}
@@ -159,9 +176,14 @@ getcusipcf <- function(cusips, cfdata, workdate=Sys.Date()){ }
pv <- c()
for(field in fields){
- data[,"Balance"]
- data[,field] <- tryCatch(sanitize.column(data[,field]),
- warning = function(w){cat("garbled", dealname, i)})
+ cleanfield <- tryCatch(sanitize.column(data[,field]),
+ warning = function(w)w)
+ if(inherits(cleanfield, "warning")){
+ flag <- TRUE
+ break
+ }else{
+ data[,field] <- cleanfield
+ }
if(length(futuredates) == 0){
df <- rep(1, length(pastdates))
}else{
@@ -173,21 +195,52 @@ getcusipcf <- function(cusips, cfdata, workdate=Sys.Date()){ pv <- c(pv, 0)
}
}
- wal <- yearFrac(workdate, data$Date) * data[,"Cashflow"]/sum(data[,"Cashflow"])
- r[,j] <- c(pv, wal)
+ if(flag){
+ break
+ }else{
+ data[,"Balance" ] <- tryCatch(sanitize.column(data[,"Balance"]),
+ warning = function(w){cat("garbled", dealname, i)})
+ wal <- crossprod(yearFrac(workdate, data$Date)[-1], -diff(data[,"Balance"]))/
+ indicdata$curr_balance
+ if(pv[1] == 0){
+ duration <- 0
+ }else{
+ duration <- crossprod(data[,"Cashflow"], df * yearFrac(workdate, data$Date))/pv[1]
+ }
+ tryCatch(r[j,] <- c(pv, wal, duration),
+ error =function(e) browser())
+ }
}
- }
- 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"])
+ if(flag){
+ cusipdata[[cusip]] <- NULL
+ flag <- FALSE
+ }else{
+ cat("done", cusip, "\n")
+ cusipdata[[cusip]]$fields <- r
+ cusipdata[[cusip]]$price <- 100 * crossprod(cfdata[[dealnames[i]]]$weight,
+ cusipdata[[cusip]]$fields[,"Cashflow"])/cusipdata[[cusip]]$currbal
+ cusipdata[[cusip]]$wal <- crossprod(cfdata[[dealnames[i]]]$weight,
+ cusipdata[[cusip]]$fields[,"wal"])
+ cusipdata[[cusip]]$duration <- crossprod(cfdata[[dealnames[i]]]$weight,
+ cusipdata[[cusip]]$fields[,"duration"])
+ }
}
return(cusipdata)
}
+
+cfdata <- getdealcf(dealnames, workdate)
+availablecusips <- cusips[dealnamefromcusip(cusips) %in% names(cfdata)]
+cusipdata <- getcusipcf(availablecusips, cfdata, workdate)
+
+for(cusip in names(cusipdata)){
+ columns <- c("Cusip", "price", "wal", "duration", "updatedate")
+ values <- c(cusip, cusipdata[[cusip]]$price, cusipdata[[cusip]]$wal,
+ cusipdata[[cusip]]$duration, workdate)
+ colstring <- paste(columns[!is.na(values)], collapse=",")
+ valstring <- paste(values[!is.na(values)], collapse="','")
+ sqlstring <- sprintf(paste0("INSERT INTO et_cusip_model_numbers",
+ "(%s) VALUES('%s')"),
+ colstring, valstring)
+ dbSendQuery(dbCon, sqlstring)
+}
|
