require(RQuantLib) library(dplyr, quiet = T, warn.conflicts = F) source("db.R") getMarkitIRData <- function(date=Sys.Date(), currency=c("USD", "EUR")) { ## returns Markit rates from serenitasdb currency <- match.arg(currency) table_name <- paste(currency, "OIS", "rates", sep="_") serenitasdb <- dbConn("serenitasdb") return( serenitasdb %>% tbl(table_name) %>% filter(effective_date == date) %>% collect() ) } thirdwed <- function(x) { d <- x - as.POSIXlt(x)$mday + 1 n <- (3-as.POSIXlt(d)$wday) %% 7 + 1 d + 14 + n - 1 } nextthirdwed <- function(x) { y <- thirdwed(x) thirdwed(y + 30 * (y < x)) } buildMarkitYC <- function(MarkitData, currency=c("USD", "EUR"), futurequotes) { oisswaps <- list() for(k in names(MarkitData[2:length(MarkitData)])) { v <- MarkitData[[k]] oisswaps[[paste0("ois", tolower(k))]] <- v } return( oisswaps ) } exportYC <- function(tradedate=Sys.Date(), currency=c("USD", "EUR"), useFutures=FALSE) { ## export the Yield Curve into the environment currency <- match.arg(currency) if(useFutures){ futurefile <- file.path(data.dir, "Yield Curves", sprintf("futures-%s.csv", tradedate)) if(file.exists(futurefile)){ futurequotes <- read.csv(futurefile, header=F) } } MarkitData <- getMarkitIRData(tradedate, currency) setCalendarContext(calendar="WeekendsOnly", fixingDays=2, settleDate=tradedate) settings <- Settings$new() settings$EvaluationDate <- tradedate legparams <- switch(currency, USD = list(fixFreq="Semiannual", floatFreq="Quarterly", dayCounter="Thirty360"), EUR = list(fixFreq="Annual", floatFreq="Semiannual", dayCounter="Thirty360")) cal <- Calendar$new("WeekendsOnly") dc <- DayCounter$new("Actual365Fixed") if(exists("futurequotes")) { tsQuotes <- buildMarkitYC(MarkitData, currency, futurequotes[,2]) } else { tsQuotes <- buildMarkitYC(MarkitData, currency) } YC <<- YieldTermStructure$new("discount", "loglinear", 0L, cal, dc, tsQuotes, legparams) }