diff options
| -rw-r--r-- | R/load_cf.R | 97 |
1 files changed, 28 insertions, 69 deletions
diff --git a/R/load_cf.R b/R/load_cf.R index 9d0d4f94..82bc33cd 100644 --- a/R/load_cf.R +++ b/R/load_cf.R @@ -1,6 +1,7 @@ library(RPostgreSQL)
library(RQuantLib)
library(yaml)
+library(data.table)
args <- commandArgs(trailingOnly=TRUE)
@@ -98,21 +99,27 @@ getdealcf2 <- function(tb){ uniqdealnames <- uniqdealnames[uniqdealnames!="TOTAL"]
dealnames <- grep("COLLAT", uniqdealnames, value=TRUE)
cusips <- grep("COLLAT", uniqdealnames, invert=TRUE, value=TRUE)
- cfdata <- list()
- n.scenarios <- 100
alldates <- unique(tb$Date)
- futuredates <- alldates[alldates>=L3m$params$tradeDate]
- pastdates <- alldates[alldates<L3m$params$tradeDate]
- DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, futuredates))
-
- df <- data.table(Date=c(pastdates, futuredates),
- Discounts=c(rep(1, length(pastdates)), DC$discounts))
+ n.scenarios <- 100
+ 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)
setkey(df, Date)
setkey(tb, Date)
- data <- tb[df][, list(Cashflow=sum(Discounts * Cashflow),
- Principal=sum(Discounts * Principal),
- Interest=sum(Discounts * Interest)), by="Dealname,Scenario"]
+ tb[,Balance:=max(Balance-`Accum Interest Shortfall`, 0), by=1:nrow(tb)]
+ sqlstring <- sprintf("select cusip, dealname, curr_balance, spread from latest_cusip_universe where cusip in ('%s')", paste(cusips, collapse="','"))
+ cusipdata <- data.table(dbGetQuery(dbCon, sqlstring), key="cusip")
+ data <- tb[df][,list(Cashflow=temp <- sum(Cashflow*Discounts),
+ Principal=sum(Principal*Discounts),
+ Interest=sum(Interest*Discounts),
+ wal=sum(-diff(Balance)*T[-1])/cusipdata[Dealname]$curr_balance,
+ duration=if(temp==0) 0 else sum(Cashflow * Discounts * T)/temp
+ ), by=list(Dealname,Scenario)]
+
setkey(data, "Dealname")
+ cfdata <- list()
for(dealname in dealnames){
dealname.split <- unlist(strsplit(dealname, ","))
dealname.short <- tolower(dealname.split[1])
@@ -140,65 +147,17 @@ getdealcf2 <- function(tb){ cfdata[[dealname]]$weight <- program$weight
cat(dealname, "\n")
}
- return( cfdata )
+ setnames(cusipdata, "cusip", "Dealname")
+ cusipdata <- data[cusipdata,list(Cashflow=temp <- sum(cfdata[[dealname]]$weight * Cashflow),
+ wal = sum(cfdata[[dealname]]$weight * wal),
+ duration = sum(cfdata[[dealname]]$weight * duration),
+ price = 100 * temp/curr_balance,
+ delta = compute.delta(dist, cfdata[[dealname]]$weight,
+ Cashflow/curr_balance, workdate)
+ )]
+ return( list(cusipdata, cfdata) )
}
-getcusipcf2 <- function(tb, cfdata, dist, workdate=Sys.Date()){
- uniqdealnames <- unique(tb[,Dealname])
- uniqdealnames <- uniqdealnames[uniqdealnames!="TOTAL"]
- cusips <- grep("COLLAT", uniqdealnames, invert=TRUE, value=TRUE)
- dealnames <- dealnamefromcusip(cusips)
- n.scenarios <- 100
- cusipdata <- list()
- intexfields <- quote(list(Cashflow, Principal, Interest, Balance, `Accum Interest Shortfall`))
- fields <- c("Cashflow", "Principal", "Interest")
- for(i in 1:length(cusips)){
- cusip <- cusips[i]
- dealname <- dealnames[i]
- dealdata <- getdealdata(dealname)
- schedule <- getdealschedule(dealdata)
- r <- matrix(0, n.scenarios, 5)
- colnames(r) <- c(fields, "wal", "duration")
- sqlstring <- sprintf("select curr_balance, spread from latest_cusip_universe where cusip = '%s'", cusip)
- indicdata <- dbGetQuery(dbCon, sqlstring)
- cusipdata[[cusip]]$currbal <- indicdata$curr_balance
- cusipdata[[cusip]]$spread <- indicdata$spread
- alldates <- unique(tb[cusip,Date]$Date)
- futuredates <- alldates[alldates>=L3m$params$tradeDate]
- pastdates <- alldates[alldates<L3m$params$tradeDate]
- DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, futuredates))
- df <- data.table(Date=c(pastdates, futuredates),
- Discounts=c(rep(1, length(pastdates)), DC$discounts))
- setkey(df, "Date")
- for(j in 1:n.scenarios){
- data <- tb[J(cusip,j), list(Date, Cashflow, Principal, Interest,
- Balance, `Accum Interest Shortfall`)]
- setkey(data, "Date")
- data <- data[df]
- pv <-crossprod(data$Discounts, as.matrix(data[,list(Cashflow, Principal, Interest)]))
- data[,Balance:=pmax(data[,Balance]-data[,`Accum Interest Shortfall`], 0)]
- T <- yearFrac(workdate, data$Date)
- wal <- crossprod(yearFrac(workdate, data$Date)[-1], -diff(data[,Balance]))/
- indicdata$curr_balance
- if(pv[1] == 0){
- duration <- 0
- }else{
- duration <- crossprod(data[,Cashflow], data[,Discounts] * T)/pv[1]
- }
- r[j,] <- c(pv, wal, duration)
- }
- val <- crossprod(cfdata[[dealname]]$weight, r[,c("Cashflow", "wal", "duration")])
- cusipdata[[cusip]] <- c(cusipdata[[cusip]],
- fields = r,
- price = 100 * val[,"Cashflow"]/cusipdata[[cusip]]$currbal,
- wal = val[,"wal"],
- duration = val[,"duration"],
- delta = compute.delta(dist, cfdata[[dealname]]$weight,
- r[,"Cashflow"]/cusipdata[[cusip]]$currbal, workdate))
- cat("done", cusip, "\n")
- }
- return(cusipdata)
-}
getdealcf <- function(dealnames, workdate=Sys.Date()){
cfdata <- list()
@@ -434,7 +393,7 @@ compute.delta <- function(indexdist, dealweight, cusip.pv, workdate=Sys.Date()){ cfdata <- getdealcf(dealnames, workdate)
availablecusips <- cusips[dealnamefromcusip(cusips) %in% names(cfdata)]
-## load dist into the namespace
+## load dist into the environment
load(file.path(root.dir, "Scenarios", "Calibration", sprintf("marketdata-%s.RData", calibration.date)))
cusipdata <- getcusipcf(availablecusips, cfdata, dist, workdate)
save.dir <- file.path(root.dir, "Scenarios", paste0("Prices_", workdate))
|
