diff options
Diffstat (limited to 'R')
| -rw-r--r-- | R/load_cf.R | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/R/load_cf.R b/R/load_cf.R index 5a4882b1..d7fbe17c 100644 --- a/R/load_cf.R +++ b/R/load_cf.R @@ -84,23 +84,28 @@ getconfig <- function(dealname, workdate){ }
}
-getdealcf <- function(params, workdate=Sys.Date()){
+get_dealschedule <- function(dealdata, freq="1 month"){
+ if(is.null(dealdata$"Pay Day")){
+ dealdata$"Pay Day" = seq(dealdata$"Deal Next Pay Date", length=2, by="-3 months")[2]
+ }
+ if (abs(as.numeric(dealdata$"Deal Next Pay Date"- dealdata$"Pay Day") - 90)>10){
+ dealdata$"Pay Day" = seq(dealdata$"Deal Next Pay Date", length=2, by="-6 months")[2]
+ }
+ return(seq(dealdata$"Pay Day", dealdata$"maturity", by=freq))
+}
+
+
+getdealcf <- function(dealnames, zipfiles, workdate=Sys.Date()){
cfdata <- list()
fields <- c("Cashflow", "Principal", "Interest")
n.scenarios <- 100
- 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\", ",
- "\"Deal Next Pay Date\" , maturity, \"Principal Bal\" from ",
- "historical_clo_universe('%s', '%s')"), dealname, workdate)
- sqldata <- dbGetQuery(dbCon, sqlstring)
+ for(dealname in keys(dealnames)){
+ zip <- zipfiles[dealnames[[dealname]]]
+ dealdata <- getdealdata(dealname, workdate)
## to get the list of payment dates, we backtrack a little bit, because sometimes the first
## date in intex vector is pre current date.
## we also add some wiggle room at the end to make sure we're not missing one date
- prevpaydate <- basic.advance(sqldata$"Deal Next Pay Date", -6, "month")
- alldates <- seq.Date(from=prevpaydate, sqldata$maturity+11, by="1 month")
+ alldates <- get_dealschedule(dealdata, "1 month")
config <- getconfig(dealname, workdate)
T <- ifelse(alldates>=L3m$params$tradeDate, yearFrac(L3m$params$tradeDate, alldates), 0)
@@ -108,9 +113,9 @@ getdealcf <- function(params, workdate=Sys.Date()){ df <- data.table(Date=alldates,
Discounts=DC$discounts,
T=T, key="Date")
- cfdata[[dealname]] <- list(mv = mv, currbal = sqldata$"Curr Collat Bal")
+ cfdata[[dealname]] <- list(mv = dealdata$mv, currbal = dealdata$"Curr Collat Bal")
- if(is.na(sqldata$"Reinv End Date")||!config$reinvflag){
+ if(is.na(dealdata$"Reinv End Date")||!config$reinvflag){
tranches <- "COLLAT"
}else{
tranches <- c("COLLAT_INITIAL", "COLLAT_REINVEST")
@@ -150,10 +155,10 @@ getdealcf <- function(params, workdate=Sys.Date()){ for(tranche in tranches){
cf <- cf+cfdata[[dealname]][[tranche]][,"Cashflow"]
}
- cf <- cf-min(sqldata$"Principal Bal", 0)
- cfdata[[dealname]]$wapbasis <- (mean(cf)- mv)/mv
+ 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),
- cfdata[[dealname]]$mv/1e8), error=function(e) e)
+ dealdata$mv/1e8), error=function(e) e)
if(inherits(program, "error")){
cat("error computing the delta for deal:", dealname,"\n")
cfdata[[dealname]] <- NULL
@@ -174,21 +179,20 @@ getcusipcf <- function(params, cfdata, dist, workdate=Sys.Date()){ n.scenarios <- 100
intexfields <- c("Cashflow", "Principal", "Interest", "Balance",
"Accum Interest Shortfall")
- fields <- c("Cashflow", "Principal", "Interest")
+ fields <- c("Cashflow", "Principal", "Interest", "wal", "duration")
for(i in 1:length(cusips)){
cusip <- cusips[i]
zip <- params$zipfiles[params$cusips[[cusip]]]
dealname <- dealnames[i]
- dealdata <- getdealdata(dealname)
- schedule <- getdealschedule(dealdata)
- alldates <- rev(seq.Date(from=dealdata$maturity, to=workdate-90, by="-1 month"))
+ dealdata <- getdealdata(dealname, workdate)
+ alldates <- getdealschedule(dealdata,"1 month", startdate=workdate)
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")
+ colnames(r) <- fields
sqlstring <- sprintf("select curr_balance, spread from historical_cusip_universe('%s', '%s')",
cusip, workdate)
indicdata <- dbGetQuery(dbCon, sqlstring)
@@ -246,7 +250,6 @@ compute.delta <- function(indexdist, dealweight, cusip.pv, workdate=Sys.Date(), for(i in 1:length(dealweight)){
indexpv <- c(indexpv, funded.tranche.pv(scenariosl[i,], scenariosr[i,], cs, K1, K2, TRUE))
}
-
model <- lm(cusip.pv~indexpv, weights=dealweight)
return(model$coef[2])
}
@@ -258,7 +261,7 @@ if(length(args)>=2){ params <- processzipfiles(workdate)
}
-cfdata <- getdealcf(params, workdate)
+cfdata <- getdealcf(params$dealnames, params$zipfiles, workdate)
## load dist into the environment
load(file.path(root.dir, "Scenarios", "Calibration", sprintf("marketdata-%s.RData", calibration.date)))
|
