aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--R/load_cf.R99
1 files changed, 26 insertions, 73 deletions
diff --git a/R/load_cf.R b/R/load_cf.R
index d57ae0e0..e798b78a 100644
--- a/R/load_cf.R
+++ b/R/load_cf.R
@@ -179,7 +179,6 @@ getdealcf <- function(dealnames, workdate=Sys.Date()){
sqldata <- dbGetQuery(dbCon, sqlstring)
alldates <- rev(seq.Date(from=sqldata$maturity, to=workdate-90, by="-1 month"))
- n.scenarios <- 100
T <- ifelse(alldates>=L3m$params$tradeDate, yearFrac(L3m$params$tradeDate, alldates), 0)
DC <- DiscountCurve(L3m$params, L3m$tsQuotes, T)
df <- data.table(Date=alldates,
@@ -257,12 +256,16 @@ getcusipcf <- function(cusips, cfdata, dist, workdate=Sys.Date()){
dealname <- dealnames[i]
dealdata <- getdealdata(dealname)
schedule <- getdealschedule(dealdata)
+ alldates <- rev(seq.Date(from=dealdata$maturity, to=workdate-90, by="-1 month"))
+ T <- ifelse(alldates>=L3m$params$tradeDate, yearFrac(L3m$params$tradeDate, alldates), 0)
+ DC <- DiscountCurve(L3m$params, L3m$tsQuotes, T)
+ df <- data.table(Date=alldates,
+ Discounts=DC$discounts,
+ T=T, key="Date")
r <- matrix(0, n.scenarios, 5)
colnames(r) <- c(fields, "wal", "duration")
sqlstring <- sprintf("select curr_balance, spread from latest_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))){
@@ -270,78 +273,28 @@ getcusipcf <- function(cusips, cfdata, dist, workdate=Sys.Date()){
}
data <- read.table(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
sep = "\t", header=F, colClasses="character", skip = 3, comment.char="")
- data <- data[, 1:6]
- 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 >= L3m$params$tradeDate]
- pastdates <- data$Date[data$Date < L3m$params$tradeDate]
- T <- yearFrac(L3m$params$tradeDate, futuredates)
- if(i==1||length(futuredates)>length(DC$times)){
- DC <- DiscountCurve(L3m$params, L3m$tsQuotes, T)
- }
- if(length(futuredates) == 0){
- df <- rep(1, length(pastdates))
- }else{
- df <- c(rep(1, length(pastdates)), DC$discounts[1:length(futuredates)]*exp(-dm*T))
- }
- pv <- c()
- for(field in fields){
- cleanfield <- tryCatch(sanitize.column(data[,field]),
- warning = function(w)w)
- if(inherits(cleanfield, "warning")||any(is.na(cleanfield))){
- cat(sprintf("file: %s is messed up", filename), "\n")
- flag <- TRUE
- break
- }else{
- data[,field] <- cleanfield
- }
- if(nrow(data)>0){
- pv <- c(pv, crossprod(df, data[,field]))
- }else{
- pv <- c(pv, 0)
- }
- }
- if(flag){
- break
- }else{
- data[,"Balance" ] <- tryCatch(sanitize.column(data[,"Balance"]),
- warning = function(w){cat("garbled", dealname, i)})
- data[,"Accum Interest Shortfall"] <-
- tryCatch(sanitize.column(data[,"Accum Interest Shortfall"]),
- warning = function(w){cat("garbled", dealname, i)})
- data[,"Balance"] <- pmax(data[,"Balance"]-data[,"Accum Interest Shortfall"], 0)
- 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
- }else{
- val <- crossprod(cfdata[[dealname]]$weight, r[,c("Cashflow", "wal", "duration")])
- cusipdata[[cusip]] <- c(cusipdata[[cusip]],
- list(fields = r,
- price = 100 * val[,"Cashflow"]/cusipdata[[cusip]]$currbal,
- wal = val[,"wal"],
- duration = val[,"duration"],
- delta = compute.delta(dist, cfdata[[dealname]]$weight,
- r[,"Cashflow"]/cusipdata[[cusip]]$currbal, workdate)))
- cat("done", cusip, "\n")
+ data <- data.table(Date=as.Date(data[,1], "%b %d, %Y"),
+ apply(data[,2:6], 2, function(x)sanitize.column(x)), key="Date")
+ setnames(data, c("Date", intexfields))
+ data[,Balance:=max(Balance-`Accum Interest Shortfall`, 0), by=1:nrow(data)]
+ r[j,] <- as.numeric(df[data,roll=TRUE][,list(Cashflow=temp <- sum(Cashflow*Discounts),
+ Principal=sum(Principal*Discounts),
+ Interest=sum(Interest*Discounts),
+ wal=sum(-diff(Balance)*T[-1])/indicdata$curr_balance,
+ duration=if(temp==0) 0 else sum(Cashflow * Discounts * T)/temp)])
}
+ cusipdata[[cusip]] <- list(currbal=indicdata$curr_balance,
+ spread=indicdata$spread,
+ Cashflow=temp <- crossprod(cfdata[[dealname]]$weight, r[,"Cashflow"]),
+ wal = crossprod(cfdata[[dealname]]$weight, r[,"wal"]),
+ duration = crossprod(cfdata[[dealname]]$weight, r[,"duration"]),
+ price = 100 * temp/indicdata$curr_balance,
+ delta = compute.delta(dist, cfdata[[dealname]]$weight,
+ r[,"Cashflow"]/indicdata$curr_balance, workdate),
+ fields=r)
+ cat("done", cusip, "\n")
}
+
return(cusipdata)
}