diff options
Diffstat (limited to 'R/load_cf.R')
| -rw-r--r-- | R/load_cf.R | 141 |
1 files changed, 75 insertions, 66 deletions
diff --git a/R/load_cf.R b/R/load_cf.R index abaf9ef1..d3b8bcd5 100644 --- a/R/load_cf.R +++ b/R/load_cf.R @@ -79,77 +79,86 @@ getdealcf <- function(dealnames, zipfiles, tradedate=Sys.Date()){ cfdata <- list()
fields <- c("Cashflow", "Principal", "Interest")
n.scenarios <- 100
- for(dealname in keys(dealnames)){
- zip <- zipfiles[dealnames[[dealname]]]
- dealdata <- getdealdata(dealname, tradedate)
- if(dealdata$"Deal Next Pay Date">tradedate){
+ indextodealnames <- invert(dealnames)
+ for(k in keys(indextodealnames)){
+ zip <- zipfiles[as.numeric(k)]
+ tmp <- tempfile(tmpdir="/tmp")
+ file.copy(zip, tmp)
+ zip <- tmp
+ for(dealname in indextodealnames[[k]]){
+ dealdata <- getdealdata(dealname, tradedate)
+ if(dealdata$"Deal Next Pay Date">tradedate){
## some new issue deals have next pay date too far back in the future
- n.quarters <- as.numeric(dealdata$"Deal Next Pay Date" - tradedate)%/%90+1
- dealdata$"Deal Next Pay Date" <- seq(dealdata$"Deal Next Pay Date", length=n.quarters,
- by="-3 months")[n.quarters]
- }
- alldates <- getdealschedule(dealdata, "1 month")
- config <- getconfig(dealname, tradedate)
+ n.quarters <- as.numeric(dealdata$"Deal Next Pay Date" - tradedate)%/%90+1
+ dealdata$"Deal Next Pay Date" <- seq(dealdata$"Deal Next Pay Date", length=n.quarters,
+ by="-3 months")[n.quarters]
+ }
+ alldates <- getdealschedule(dealdata, "1 month")
+ config <- getconfig(dealname, tradedate)
- 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")
- cfdata[[dealname]] <- list(mv = dealdata$mv, currbal = dealdata$"Curr Collat Bal")
+ 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")
+ cfdata[[dealname]] <- list(mv = dealdata$mv, currbal = dealdata$"Curr Collat Bal")
- if(is.na(dealdata$"Reinv End Date")||!config$reinvflag){
- tranches <- "COLLAT"
- }else{
- tranches <- c("COLLAT_INITIAL", "COLLAT_REINVEST")
- ## if(dealname=="octag11"){
- ## tranches <- c("COLLAT_USD_INITIAL", "COLLAT_USD_REINVEST")
- ## }
- }
- for(tranche in tranches){
- 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)
+ if(is.na(dealdata$"Reinv End Date")||!config$reinvflag){
+ tranches <- "COLLAT"
+ }else{
+ tranches <- c("COLLAT_INITIAL", "COLLAT_REINVEST")
+ ## if(dealname=="octag11"){
+ ## tranches <- c("COLLAT_USD_INITIAL", "COLLAT_USD_REINVEST")
+ ## }
+ }
+ for(tranche in tranches){
+ 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_", tradedate), 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(cfdata[[dealname]])<2+length(tranches)){##meaning we existed early in the above loop
- cfdata[[dealname]] <- NULL
- next
- }
- cf <- rep(0,n.scenarios)
- for(tranche in tranches){
- cf <- cf+cfdata[[dealname]][[tranche]][,"Cashflow"]
- }
- cf <- cf-min(dealdata$"Principal Bal", 0)
- cfdata[[dealname]]$wapbasis <- (mean(cf)- dealdata$mv)/dealdata$mv
- program <- tryCatch(KLfit(t(cf)/1e8, rep(1/n.scenarios, n.scenarios),
- dealdata$mv/1e8), error=function(e) e)
- if(inherits(program, "error")){
- cat("error computing the weights for deal:", dealname,"\n")
- cfdata[[dealname]] <- NULL
- next
- }else{
- cfdata[[dealname]]$weight <- program$weight
- cat(dealname, "\n")
+ ## data <- fread(file.path(root.dir, "Scenarios", paste0("Prices_", tradedate), 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(cfdata[[dealname]])<2+length(tranches)){##meaning we existed early in the above loop
+ cfdata[[dealname]] <- NULL
+ next
+ }
+ cf <- rep(0,n.scenarios)
+ for(tranche in tranches){
+ cf <- cf+cfdata[[dealname]][[tranche]][,"Cashflow"]
+ }
+ cf <- cf-min(dealdata$"Principal Bal", 0)
+ cfdata[[dealname]]$wapbasis <- (mean(cf)- dealdata$mv)/dealdata$mv
+ program <- tryCatch(KLfit(t(cf)/1e8, rep(1/n.scenarios, n.scenarios),
+ dealdata$mv/1e8), error=function(e) e)
+ if(inherits(program, "error")){
+ cat("error computing the weights for deal:", dealname,"\n")
+ cfdata[[dealname]] <- NULL
+ next
+ }else{
+ cfdata[[dealname]]$weight <- program$weight
+ cat(dealname, "\n")
+ }
}
+ unlink(tmp)
}
return( cfdata )
}
|
