diff options
| -rw-r--r-- | R/load_cf.R | 83 |
1 files changed, 54 insertions, 29 deletions
diff --git a/R/load_cf.R b/R/load_cf.R index d4c4c699..8370ea98 100644 --- a/R/load_cf.R +++ b/R/load_cf.R @@ -1,8 +1,9 @@ library(RPostgreSQL)
library(RQuantLib)
library(yaml)
+library(hash)
library(data.table)
-
+options(stringsAsFactors = FALSE)
args <- commandArgs(trailingOnly=TRUE)
if(.Platform$OS.type == "unix"){
@@ -45,21 +46,6 @@ sanitize.column <- function(vec){ return(as.numeric(vec))
}
-if(length(args)>=2){
- cusips <- args[-1]
- dealnames <- unique(dealnamefromcusip(cusips))
-}else{
- pricesdir <- file.path(root.dir, "Scenarios", paste0("Prices_", workdate))
- allfiles <- list.files(pricesdir, "*.txt")
- allfiles <- unique(vapply(strsplit(allfiles, "-"), function(x) x[1], character(1)))
- allfiles <- allfiles[!(allfiles=="Total")]
- dealnames <- list.files(pricesdir, "*COLLAT_INITIAL-CF-Scen100")
- dealnames <- c(dealnames, list.files(pricesdir, "*COLLAT-CF-Scen100"))
- dealnames <- unique(vapply(strsplit(dealnames, "-"), function(x) x[1], character(1)))
- cusips <- setdiff(allfiles, dealnames)
- dealnames <- tolower(dealnames)
-}
-
processzipfiles <- function(workdate=Sys.Date()){
pricesdir <- file.path(root.dir, "Scenarios", paste0("Prices_", workdate))
zipfiles <- file.path(pricesdir, list.files(pricesdir, "*.zip"))
@@ -96,7 +82,33 @@ processzipfiles <- function(workdate=Sys.Date()){ }
return(tb)
}
-
+processzipfiles2 <- function(workdate=Sys.Date()){
+ pricesdir <- file.path(root.dir, "Scenarios", paste0("Prices_", workdate))
+ zipfiles <- file.path(pricesdir, list.files(pricesdir, "*.zip"))
+ zipfiles <- zipfiles[order(file.info(zipfiles)$ctime)]
+ for(n in seq_along(zipfiles)){
+ zip <- zipfiles[n]
+ allfiles <- unzip(zip, list=TRUE)$Name
+ dealnames <- grep("COLLAT.*Scen100", allfiles, value=TRUE)
+ dealnames <- unique(unlist(lapply(strsplit(dealnames, "-"), function(x)x[1])))
+ allfiles <- unique(unlist(lapply(strsplit(allfiles, "-"), function(x)x[1])))
+ allfiles <- allfiles[!(allfiles=="Total")]
+ cusips <- setdiff(allfiles, dealnames)
+ dealnames <- tolower(dealnames)
+ if(n==1){
+ dealnames.hash <- hash(dealnames, 1)
+ cusips.hash <- hash(cusips, 1)
+ }else{
+ for( c in cusips){
+ cusips.hash[c] <- n
+ }
+ for(d in dealnames){
+ dealnames.hash[d] <- n
+ }
+ }
+ }
+ return(list(dealnames=dealnames.hash, cusips=cusips.hash, zipfiles=zipfiles))
+}
getdealcf2 <- function(tb){
uniqdealnames <- unique(tb[,Dealname])
@@ -164,11 +176,12 @@ getdealcf2 <- function(tb){ }
-getdealcf <- function(dealnames, workdate=Sys.Date()){
+getdealcf <- function(params, workdate=Sys.Date()){
cfdata <- list()
fields <- c("Cashflow", "Principal", "Interest")
n.scenarios <- 100
- for(dealname in dealnames){
+ for(dealname in keys(params$dealnames)){
+ zip <- params$zipfiles[params$dealnames[[dealname]]]
sqlstring <- sprintf("select marketvalue from latest_deal_model_numbers where dealname='%s'", dealname)
mv <- dbGetQuery(dbCon, sqlstring)$marketvalue
sqlstring <- sprintf(paste0("select \"Curr Collat Bal\", \"Reinv End Date\", ",
@@ -203,8 +216,12 @@ getdealcf <- function(dealnames, workdate=Sys.Date()){ colnames(r) <- fields
for(i in 1:n.scenarios){
filename <- paste0(paste(toupper(dealname), tranche, "CF", paste0("Scen", i), sep="-"), ".txt")
- data <- fread(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
- sep="\t", colClasses="character")
+
+ 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")
@@ -230,8 +247,9 @@ getdealcf <- function(dealnames, workdate=Sys.Date()){ return( cfdata )
}
-getcusipcf <- function(cusips, cfdata, dist, workdate=Sys.Date()){
+getcusipcf <- function(params, cfdata, dist, workdate=Sys.Date()){
cusipdata <- list()
+ cusips <- keys(params$cusips)
dealnames <- dealnamefromcusip(cusips)
n.scenarios <- 100
intexfields <- c("Cashflow", "Principal", "Interest", "Balance",
@@ -239,6 +257,7 @@ getcusipcf <- function(cusips, cfdata, dist, workdate=Sys.Date()){ fields <- c("Cashflow", "Principal", "Interest")
for(i in 1:length(cusips)){
cusip <- cusips[i]
+ zip <- params$zipfiles[params$cusips[[cusip]]]
dealname <- dealnames[i]
dealdata <- getdealdata(dealname)
schedule <- getdealschedule(dealdata)
@@ -255,11 +274,9 @@ getcusipcf <- function(cusips, cfdata, dist, workdate=Sys.Date()){ indicdata <- dbGetQuery(dbCon, sqlstring)
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 <- fread(file.path(root.dir, "Scenarios", paste0("Prices_", workdate), filename),
- sep="\t", header=TRUE, colClasses="character")
+ 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")
@@ -309,11 +326,19 @@ compute.delta <- function(indexdist, dealweight, cusip.pv, workdate=Sys.Date(), return(model$coef[2])
}
-cfdata <- getdealcf(dealnames, workdate)
+if(length(args)>=2){
+ cusips <- args[-1]
+ dealnames <- unique(dealnamefromcusip(cusips))
+}else{
+ params <- processzipfiles2(workdate)
+}
+
+cfdata <- getdealcf(params, workdate)
+cusips <- keys(params$cusips)
availablecusips <- cusips[dealnamefromcusip(cusips) %in% names(cfdata)]
## load dist into the environment
load(file.path(root.dir, "Scenarios", "Calibration", sprintf("marketdata-%s.RData", calibration.date)))
-cusipdata <- getcusipcf(availablecusips, cfdata, dist, workdate)
+cusipdata <- getcusipcf(params, cfdata, dist, workdate)
save.dir <- file.path(root.dir, "Scenarios", paste0("Prices_", workdate))
save(cusipdata, cfdata, file=file.path(save.dir, "cashflows.RData"),
compress="xz")
|
