diff options
| -rw-r--r-- | R/cds_functions_generic.R | 63 | ||||
| -rw-r--r-- | R/intex_deal_functions.R | 27 | ||||
| -rw-r--r-- | R/load_cf.R | 35 |
3 files changed, 64 insertions, 61 deletions
diff --git a/R/cds_functions_generic.R b/R/cds_functions_generic.R index a38e38ef..1db5ea7b 100644 --- a/R/cds_functions_generic.R +++ b/R/cds_functions_generic.R @@ -695,29 +695,48 @@ DP2 <- function(sc, dates, startdate=Sys.Date()){ prepayprob = cumsum(pfun(x2T) * Qmid * dT)))
}
-getdealschedule <- function(dealdata, freq="3 months", startdate = Sys.Date(), lag = 0){
- calstring <- "UnitedStates/GovernmentBond"
- settledate <- advance(calendar = calstring,
- dates = startdate,
- n = 3,
- timeUnit = 0)
- nextpaydate <- dealdata$"Deal Next Pay Date"
- ## "Deal Next Pay Date" might be stale in the database
- if(dealdata$"Deal Next Pay Date" < settledate){
- prevpaydate <- nextpaydate
- nextpaydate <- advance(calendar = calstring,
- dates = nextpaydate,
- n = 3,
- timeUnit = 2)
- }else{
- prevpaydate <- advance(calendar = calstring,
- dates = nextpaydate,
- n = -3,
- timeUnit = 2)
+## getdealschedule <- function(dealdata, freq="3 months", startdate = Sys.Date(), lag = 0){
+## calstring <- "UnitedStates/GovernmentBond"
+## settledate <- advance(calendar = calstring,
+## dates = startdate,
+## n = 3,
+## timeUnit = 0)
+## nextpaydate <- dealdata$"Deal Next Pay Date"
+## ## "Deal Next Pay Date" might be stale in the database
+## if(dealdata$"Deal Next Pay Date" < settledate){
+## prevpaydate <- dealdata$"Deal Next Pay Date"
+## nextpaydate <- advance(calendar = calstring,
+## dates = dealdata$"Deal Next Pay Date",
+## n = 3,
+## timeUnit = 2)
+## }else{
+## prevpaydate <- advance(calendar = calstring,
+## dates = dealdata$"Deal Next Pay Date",
+## n = -3,
+## timeUnit = 2)
+## }
+## dates <- seq(prevpaydate, dealdata$maturity + lag, by=freq)
+## dates <- dates[dates>settledate]
+## return( dates )
+## }
+
+getdealschedule <- function(dealdata, freq="1 month", startdate= Sys.Date(), lag=0, adjust=FALSE){
+ if(is.null(dealdata$"Pay Day")||(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="-3 months")[2]
+ }
+ sched <- seq(dealdata$"Pay Day", dealdata$"maturity" + lag, by=freq)
+ ##always add the maturity
+ if(sched[length(sched)] < dealdata$maturity){
+ sched <- c(sched, dealdata$maturity)
}
- dates <- seq(prevpaydate, dealdata$maturity + lag, by=freq)
- dates <- dates[dates>settledate]
- return( dates )
+ if(adjust){
+ calstring <- "UnitedStates"
+ ## never adjust the maturity
+ sched <- c(adjust(calstring, sched[-length(sched)]), sched[length(sched)])
+ base::names(sched) <- NULL
+ }
+
+ return(sched)
}
SPmatrix2 <- function(portfolio, dealdata, freq="3 months", startdate=Sys.Date()){
diff --git a/R/intex_deal_functions.R b/R/intex_deal_functions.R index b464ff01..40791526 100644 --- a/R/intex_deal_functions.R +++ b/R/intex_deal_functions.R @@ -22,21 +22,18 @@ source(file.path(root.dir, "code", "R", "cds_functions_generic.R")) source(file.path(root.dir, "code", "R", "etdb.R"))
source(file.path(root.dir, "code", "R", "tranche_functions.R"))
-getdealdata <- function(dealnames, date){
- if(missing(date)){
- sqlstring <- sprintf("select * from latest_clo_universe where dealname in ('%s')",
- paste(dealnames, collapse="','"))
- }else{
- sqlstring <- paste("SELECT b.* FROM (SELECT MAX(\"Latest Update\") AS latestdate,",
- "dealname FROM clo_universe WHERE \"Latest Update\"<='%s' AND dealname in ('%s')",
- "GROUP BY dealname) a JOIN clo_universe b ON a.dealname = b.dealname",
- "AND a.latestdate= b.\"Latest Update\" ORDER by dealname asc")
- sqlstring <- sprintf(sqlstring, date, paste(dealnames, collapse="','"))
- }
- data <- dbGetQuery(dbCon, sqlstring)
- data <- data[match(dealnames, data$dealname),]
- rownames(data) <- c()
- return( data )
+getdealdata <- function(dealname, workdate){
+ sqlstring <- paste0("select marketvalue from et_deal_model_numbers where dealname='%s' and ",
+ "updatedate in (select max(updatedate) from et_deal_model_numbers where ",
+ "dealname = '%s' and updatedate<='%s')")
+ sqlstring <- sprintf(sqlstring, dealname, dealname, workdate)
+ 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)
+ dealdata <- dbGetQuery(dbCon, sqlstring)
+ dealdata$mv <- mv
+ return(dealdata)
}
getcollateral <- function(dealname, date){
diff --git a/R/load_cf.R b/R/load_cf.R index d7fbe17c..35c792f2 100644 --- a/R/load_cf.R +++ b/R/load_cf.R @@ -84,17 +84,6 @@ getconfig <- function(dealname, workdate){ }
}
-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")
@@ -102,10 +91,7 @@ getdealcf <- function(dealnames, zipfiles, workdate=Sys.Date()){ 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
- alldates <- get_dealschedule(dealdata, "1 month")
+ alldates <- getdealschedule(dealdata, "1 month")
config <- getconfig(dealname, workdate)
T <- ifelse(alldates>=L3m$params$tradeDate, yearFrac(L3m$params$tradeDate, alldates), 0)
@@ -140,9 +126,9 @@ getdealcf <- function(dealnames, zipfiles, workdate=Sys.Date()){ 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))])
+ r[i,] <- as.numeric(df[data, nomatch=NA][,list(sum(Cashflow*Discounts),
+ sum(Principal*Discounts),
+ sum(Interest*Discounts))])
}
k(r)
})
@@ -185,7 +171,7 @@ getcusipcf <- function(params, cfdata, dist, workdate=Sys.Date()){ zip <- params$zipfiles[params$cusips[[cusip]]]
dealname <- dealnames[i]
dealdata <- getdealdata(dealname, workdate)
- alldates <- getdealschedule(dealdata,"1 month", startdate=workdate)
+ alldates <- getdealschedule(dealdata,"1 month", startdate=workdate, adjust=TRUE)
T <- ifelse(alldates>=L3m$params$tradeDate, yearFrac(L3m$params$tradeDate, alldates), 0)
DC <- DiscountCurve(L3m$params, L3m$tsQuotes, T)
df <- data.table(Date=alldates,
@@ -202,6 +188,7 @@ getcusipcf <- function(params, cfdata, dist, workdate=Sys.Date()){ conn <- unz(zip, filename)
data <- data.table(read.table(conn, sep="\t", header=TRUE, colClasses="character",
check.names=FALSE))
+ browser()
data <- data[-c(1,2),]
if("Error" %in% names(data)){
k(NULL)
@@ -209,11 +196,11 @@ getcusipcf <- function(params, cfdata, dist, workdate=Sys.Date()){ 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")
data[,Balance:=max(Balance-`Accum Interest Shortfall`, 0), by=1:nrow(data)]
- r[j,] <- as.numeric(df[data,roll=TRUE][,list(Cashflow=temp <- sum(Cashflow*Discounts),
- Principal=sum(Principal*Discounts),
- Interest=sum(Interest*Discounts),
- wal=sum(-diff(Balance)*T[-1])/indicdata$curr_balance,
- duration=if(temp==0) 0 else sum(Cashflow * Discounts * T)/temp)])
+ r[j,] <- as.numeric(df[data][,list(Cashflow=temp <- sum(Cashflow*Discounts),
+ Principal=sum(Principal*Discounts),
+ Interest=sum(Interest*Discounts),
+ wal=sum(-diff(Balance)*T[-1])/indicdata$curr_balance,
+ duration=if(temp==0) 0 else sum(Cashflow * Discounts * T)/temp)])
}
k(list(currbal=indicdata$curr_balance,
spread=indicdata$spread,
|
