aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--R/load_cf.R139
1 files changed, 65 insertions, 74 deletions
diff --git a/R/load_cf.R b/R/load_cf.R
index 225e16ff..c8b98a16 100644
--- a/R/load_cf.R
+++ b/R/load_cf.R
@@ -46,21 +46,21 @@ processzipfiles <- function(tradedate=Sys.Date()){
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)
+ figis <- setdiff(allfiles, dealnames)
dealnames <- tolower(dealnames)
if(n==1){
dealnames.hash <- hash(dealnames, 1)
- cusips.hash <- hash(cusips, 1)
+ figis.hash <- hash(figis, 1)
}else{
- for( c in cusips){
- cusips.hash[c] <- n
+ for( f in figis){
+ figis.hash[f] <- n
}
for(d in dealnames){
dealnames.hash[d] <- n
}
}
}
- return(list(dealnames=dealnames.hash, cusips=cusips.hash, zipfiles=zipfiles))
+ return(list(dealnames=dealnames.hash, figis=figis.hash, zipfiles=zipfiles))
}
getconfig <- function(dealname, tradedate){
@@ -119,7 +119,7 @@ getdealcf <- function(dealnames, zipfiles, tradedate=Sys.Date()){
filename <- paste0(paste(toupper(dealname), tranche, "CF",
paste0("Scen", i), sep="-"), ".txt")
conn <- unz(zip, filename)
- data <- tryCatch(suppressWarnings(read_tsv(conn, col_types= ct)),
+ data <- tryCatch(suppressWarnings(read_tsv(conn, col_types= ct, name_repair="minimal")),
error=function(e){
logerror(conditionMessage(e))
NULL})
@@ -178,44 +178,35 @@ getdealcf <- function(dealnames, zipfiles, tradedate=Sys.Date()){
return( cfdata )
}
-getcusip_indicdata <- function(cusip, dealname, date) {
- cusip_universe <- tbl(etdb, "cusip_universe")
- r <- cusip_universe %>%
- filter(cusip == !!cusip) %>%
- distinct(isin) %>% collect()
- if(length(r$isin) > 1) {
- stop("We have a problem")
- }
- isin <- r$isin
+gettranche_indicdata <- function(figi, dealname, date) {
+ tranche_universe <- tbl(etdb, "tranche_universe")
+ r <- tranche_universe %>%
+ filter(figi == !!figi) %>%
+ collect()
sqlstr <- "SELECT * FROM historical_dealname_universe($1, $2)"
r <- tryCatch(dbGetQuery(etdb, sqlstr, params = list(dealname, date)),
error = function(w) logerror(w$message))
- if(!is.na(isin)) {
- return(r %>% group_by(isin) %>% slice(1) %>% ungroup() %>%
- arrange(desc(curr_attach)) %>%
- mutate(cum_bal = cumsum(curr_balance)) %>% filter(isin == !!isin) %>%
- select(cusip, curr_balance, orig_balance, spread, curr_attach, cum_bal))
- } else {
- return(r %>% select(cusip, curr_balance, orig_balance, spread, curr_attach) %>%
- arrange(desc(curr_attach)) %>%
- mutate(cum_bal = cumsum(curr_balance)) %>% filter(cusip == !!cusip) )
- }
+ return(r %>%
+ arrange(desc(curr_attach)) %>%
+ mutate(cum_bal = cumsum(curr_balance)) %>%
+ filter(figi == !!figi) %>%
+ select(figi, curr_balance, orig_balance, spread, curr_attach, cum_bal))
}
-getcusipcf <- function(params, cfdata, dist, tradedate=Sys.Date()){
- cusipdata <- list()
- cusips <- keys(params$cusips)
- dealnames <- dealnamefromcusip(cusips)
- cusips <- cusips[dealnames %in% names(cfdata)]
+gettranchecf <- function(params, cfdata, dist, tradedate=Sys.Date()){
+ tranchedata <- list()
+ figis <- keys(params$figis)
+ dealnames <- dealnamefromfigi(figis)
+ figis <- figis[dealnames %in% names(cfdata)]
dealnames <- dealnames[dealnames %in% names(cfdata)]
n.scenarios <- 100
intexfields <- c("Cashflow", "Principal", "Interest", "Balance",
"Accum Interest Shortfall")
fields <- c("Cashflow", "Principal", "Interest", "wal", "duration")
- for(i in 1:length(cusips)){
- cusip <- cusips[i]
- loginfo(paste("processing", cusip))
- zip <- params$zipfiles[params$cusips[[cusip]]]
+ for(i in 1:length(figis)){
+ figi <- figis[i]
+ loginfo(paste("processing", figi))
+ zip <- params$zipfiles[params$figis[[figi]]]
dealname <- dealnames[i]
dealdata <- getdealdata(dealname, tradedate)
alldates <- getdealschedule(dealdata, "Monthly", bdc = "Following")
@@ -227,7 +218,7 @@ getcusipcf <- function(params, cfdata, dist, tradedate=Sys.Date()){
T=T, key="Date")
r <- matrix(0, n.scenarios, 5)
colnames(r) <- fields
- indicdata <- getcusip_indicdata(cusip, dealname, tradedate)
+ indicdata <- gettranche_indicdata(figi, dealname, tradedate)
flag <- TRUE
ct <- list(col_date("%b %d, %Y"),
col_number(),
@@ -235,14 +226,14 @@ getcusipcf <- function(params, cfdata, dist, tradedate=Sys.Date()){
col_number(), col_number(), col_number(),
col_skip(), col_skip())
for(j in 1:n.scenarios){
- filename <- sprintf("%s-CF-Scen%s.txt", cusip, j)
+ filename <- sprintf("%s-CF-Scen%s.txt", figi, j)
conn <- unz(zip, filename)
- data <- tryCatch(suppressWarnings(read_tsv(conn, col_types=ct)),
+ data <- tryCatch(suppressWarnings(read_tsv(conn, col_types=ct, name_repair="minimal")),
error=function(e){
logerror(conditionMessage(e))
NULL})
if(is.null(data)||nrow(data)<=2){
- loginfo(paste(cusip, "Scenario", j))
+ loginfo(paste(figi, "Scenario", j))
flag <- FALSE
break
}
@@ -255,31 +246,31 @@ getcusipcf <- function(params, cfdata, dist, tradedate=Sys.Date()){
wal=sum(-diff(Balance)*T[-1])/indicdata$curr_balance,
duration=if(temp==0) 0 else sum(Cashflow * Discounts * T)/temp)])
}
- cusip.pv <- if(indicdata$curr_balance == 0) {
- r[,"Cashflow"] / indicdata$orig_balance
- } else {
- r[,"Cashflow"] / indicdata$curr_balance
- }
+ tranche.pv <- if(indicdata$curr_balance == 0) {
+ r[,"Cashflow"] / indicdata$orig_balance
+ } else {
+ r[,"Cashflow"] / indicdata$curr_balance
+ }
if(flag) {
- cusipdata[[cusip]] <- list(currbal=indicdata$curr_balance,
- spread=indicdata$spread,
- Cashflow=crossprod(cfdata[[dealname]]$weight, r[,"Cashflow"]),
- wal = crossprod(cfdata[[dealname]]$weight, r[,"wal"]),
- duration = crossprod(cfdata[[dealname]]$weight, r[,"duration"]),
- price = 100 * crossprod(cusip.pv, cfdata[[dealname]]$weight),
- delta = compute.delta(dist, cfdata[[dealname]], cusip.pv),
- mvoc = (cfdata[[dealname]]$mv+cfdata[[dealname]]$principalbal)/
- indicdata$cum_bal-1,
- mvcoverage = 1+(cfdata[[dealname]]$mv+cfdata[[dealname]]$principalbal-indicdata$cum_bal)/indicdata$curr_balance,
- fields=r)
- loginfo(paste("done", cusip))
+ tranchedata[[figi]] <- list(currbal=indicdata$curr_balance,
+ spread=indicdata$spread,
+ Cashflow=crossprod(cfdata[[dealname]]$weight, r[,"Cashflow"]),
+ wal = crossprod(cfdata[[dealname]]$weight, r[,"wal"]),
+ duration = crossprod(cfdata[[dealname]]$weight, r[,"duration"]),
+ price = 100 * crossprod(tranche.pv, cfdata[[dealname]]$weight),
+ delta = compute.delta(dist, cfdata[[dealname]], tranche.pv),
+ mvoc = (cfdata[[dealname]]$mv+cfdata[[dealname]]$principalbal)/
+ indicdata$cum_bal-1,
+ mvcoverage = 1+(cfdata[[dealname]]$mv+cfdata[[dealname]]$principalbal-indicdata$cum_bal)/indicdata$curr_balance,
+ fields=r)
+ loginfo(paste("done", figi))
}
}
- return(cusipdata)
+ return(tranchedata)
}
-compute.delta <- function(indexdist, dealdata, cusip.pv, K1=0, K2=1){
+compute.delta <- function(indexdist, dealdata, tranche.pv, K1=0, K2=1){
dealweight <- dealdata$weight
dealprice <- dealdata$price
nT <- dim(indexdist$L)[2]
@@ -301,13 +292,13 @@ compute.delta <- function(indexdist, dealdata, cusip.pv, K1=0, K2=1){
## model1 <- lm(cusip.pv~dealprice, weights=dealweight)
## model2 <- lm(dealprice~indexpv, weights=dealweight)
## return(model1$coef[2]/model2$coef[2])
- model <- lm(cusip.pv~indexpv, weights=dealweight)
+ model <- lm(tranche.pv~indexpv, weights=dealweight)
return( model$coef[2] )
}
if(length(args)>=2){
- cusips <- args[-1]
- dealnames <- unique(dealnamefromcusip(cusips))
+ figis <- args[-1]
+ dealnames <- unique(dealnamefromfigi(figis))
}else{
params <- processzipfiles(tradedate)
}
@@ -320,9 +311,9 @@ cfdata <- getdealcf(params$dealnames, params$zipfiles, tradedate)
## load dist into the environment
load(file.path(root.dir, "Scenarios", "Calibration", sprintf("marketdata-%s.RData", calibration.date)))
-cusipdata <- getcusipcf(params, cfdata, dist, tradedate)
+tranchedata <- gettranchecf(params, cfdata, dist, tradedate)
save.dir <- file.path(root.dir, "Scenarios", paste0("Prices_", tradedate))
-save(cusipdata, cfdata, file=file.path(save.dir, "cashflows.RData"),
+save(tranchedata, cfdata, file=file.path(save.dir, "cashflows.RData"),
compress="xz")
## upload wapbasis
@@ -340,21 +331,21 @@ for(dealname in names(cfdata)){
## upload model data
dawndb <- dbConn("dawndb")
-for(cusip in names(cusipdata)){
- sqlstring <- paste0("SELECT updatedate from et_cusip_model_numbers",
- " WHERE cusip=$1")
- sqldata <- tryCatch(dbGetQuery(etdb, sqlstring, params=list(cusip)),
+for(figi in names(tranchedata)){
+ sqlstring <- paste0("SELECT updatedate from et_tranche_model_numbers",
+ " WHERE figi=$1")
+ sqldata <- tryCatch(dbGetQuery(etdb, sqlstring, params=list(figi)),
error = function(w) logerror(w$message))
columns <- c("price", "wal", "duration", "delta", "mvoc", "mvcoverage")
- values <- cusipdata[[cusip]][match(columns, names(cusipdata[[cusip]]))]
+ values <- tranchedata[[figi]][match(columns, names(tranchedata[[figi]]))]
if(nrow(sqldata) && (tradedate %in% as.Date(sqldata$updatedate))) {
- params <- c(values, cusip, as.character(tradedate))
- sqlstring <- paste0("UPDATE et_cusip_model_numbers SET price=$1, wal=$2, duration=$3,",
- "delta=$4, mvoc=$5, mvcoverage=$6 WHERE cusip=$7 and updatedate=$8")
+ params <- c(values, figi, as.character(tradedate))
+ sqlstring <- paste0("UPDATE et_tranche_model_numbers SET price=$1, wal=$2, duration=$3,",
+ "delta=$4, mvoc=$5, mvcoverage=$6 WHERE figi=$7 and updatedate=$8")
}else{
- params <- c(list(cusip=cusip, updatedate=as.character(tradedate)), values)
- sqlstring <- sprintf("INSERT INTO et_cusip_model_numbers(%s) VALUES(%s)",
+ params <- c(list(figi=figi, updatedate=as.character(tradedate)), values)
+ sqlstring <- sprintf("INSERT INTO et_tranche_model_numbers(%s) VALUES(%s)",
paste(names(params), collapse=","),
paste(paste0("$", 1:length(params)), collapse=","))
}
@@ -362,8 +353,8 @@ for(cusip in names(cusipdata)){
r <- tryCatch(dbSendQuery(etdb, sqlstring, params=params),
error = function(e) logerror(e$message))
dbClearResult(r)
- identifier <- tryCatch(dbGetQuery(dawndb, "SELECT identifier from securities WHERE cusip=$1",
- params=list(cusip)),
+ identifier <- tryCatch(dbGetQuery(dawndb, "SELECT identifier from securities WHERE figi=$1",
+ params=list(figi)),
error = function(e) logerror(e$message))
identifier <- if(nrow(identifier)>0) identifier$identifier else NULL
if(!is.null(identifier)) {