aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--R/load_cf.R96
1 files changed, 55 insertions, 41 deletions
diff --git a/R/load_cf.R b/R/load_cf.R
index 337b033c..7f060f1f 100644
--- a/R/load_cf.R
+++ b/R/load_cf.R
@@ -216,23 +216,32 @@ getdealcf <- function(params, workdate=Sys.Date()){
}
}
for(tranche in tranches){
- r <- matrix(0, n.scenarios, 3)
- colnames(r) <- fields
- for(i in 1:n.scenarios){
- filename <- paste0(paste(toupper(dealname), tranche, "CF", paste0("Scen", i), sep="-"), ".txt")
- conn <- unz(zip, filename)
- data <- read.table(conn, sep="\t", header=TRUE, colClasses="character", comment.char="")
- data <- data.table(data)
- ## data <- fread(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
- ## sep="\t", colClasses="character")
- data <- data[-c(1,2),]
- data[,Date:=as.Date(Date, "%b %d, %Y")]
- data <- data.table(Date=data[,Date], data[,lapply(.SD, sanitize.column),.SDcols=2:4],key="Date")
- r[i,] <- as.numeric(data[df][,list(sum(Cashflow*Discounts),
- sum(Principal*Discounts),
- sum(Interest*Discounts))])
- }
- cfdata[[dealname]][[tranche]]<- r
+ cfdata[[dealname]][[tranche]] <- callCC(function(k){
+ r <- matrix(0, n.scenarios, 3)
+ colnames(r) <- fields
+ for(i in 1:n.scenarios){
+ filename <- paste0(paste(toupper(dealname), tranche, "CF", paste0("Scen", i), sep="-"), ".txt")
+ conn <- unz(zip, filename)
+ data <- read.table(conn, sep="\t", header=TRUE, colClasses="character", comment.char="")
+ data <- data.table(data)
+ if("Error" %in% names(data)){
+ k(NULL)
+ }
+ ## data <- fread(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
+ ## sep="\t", colClasses="character")
+ data <- data[-c(1,2),]
+ data[,Date:=as.Date(Date, "%b %d, %Y")]
+ data <- data.table(Date=data[,Date], data[,lapply(.SD, sanitize.column),.SDcols=2:4],key="Date")
+ r[i,] <- as.numeric(df[data,roll=TRUE][,list(sum(Cashflow*Discounts),
+ sum(Principal*Discounts),
+ sum(Interest*Discounts))])
+ }
+ k(r)
+ })
+ }
+ if(length(names(cfdata[[dealname]]))==2){##meaning we existed early in the above loop
+ cfdata[[dealname]] <- NULL
+ next
}
cf <- rep(0,n.scenarios)
for(tranche in tranches){
@@ -275,30 +284,35 @@ getcusipcf <- function(params, cfdata, dist, workdate=Sys.Date()){
sqlstring <- sprintf("select curr_balance, spread from historical_cusip_universe('%s', '%s')",
cusip, workdate)
indicdata <- dbGetQuery(dbCon, sqlstring)
- for(j in 1:n.scenarios){
- filename <- sprintf("%s-CF-Scen%s.txt", cusip, j)
- conn <- unz(zip, filename)
- data <- data.table(read.table(conn, sep="\t", header=TRUE, colClasses="character",
- check.names=FALSE))
- data <- data[-c(1,2),]
- data <- data[,Date:=as.Date(Date, "%b %d, %Y")]
- data <- data.table(Date=data[,Date],data[,lapply(.SD,sanitize.column),.SDcols=2:6],key="Date")
- 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)
+ cusipdata[[cusip]] <- callCC(function(k){
+ for(j in 1:n.scenarios){
+ filename <- sprintf("%s-CF-Scen%s.txt", cusip, j)
+ conn <- unz(zip, filename)
+ data <- data.table(read.table(conn, sep="\t", header=TRUE, colClasses="character",
+ check.names=FALSE))
+ data <- data[-c(1,2),]
+ if("Error" %in% names(data)){
+ k(NULL)
+ }
+ data <- data[,Date:=as.Date(Date, "%b %d, %Y")]
+ data <- data.table(Date=data[,Date],data[,lapply(.SD,sanitize.column),.SDcols=2:6],key="Date")
+ 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)])
+ }
+ k(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")
}