library(dplyr) library(lazyeval) library(logging) basicConfig() code.dir <- "~/projects/code/" source(file.path(code.dir, "R", "yieldcurve.R")) source(file.path(code.dir, "R", "calibration.R"), chdir=TRUE) source(file.path(code.dir, "R", "serenitasdb.R")) source(file.path(code.dir, "R", "creditIndex.R")) data.src <- src_postgres("serenitasdb", "debian", 5432, "serenitas_user") index.closeprice <- function(index=c("IG", "HY", "EU", "XO"), series) { index <- match.arg(index) index.quotes <- tbl(data.src, "index_quotes") df <- index.quotes %>% filter_(lazyeval::interp(~series == s, s=series)) %>% filter_(interp(~index == i, i=index)) %>% arrange(date) df <- df %>% filter(theta2 %is% `NULL`) %>% select(date, tenor, closeprice) %>% rename(price=closeprice) %>% mutate(price=price/100) %>% collect() return( df ) } get.maturities <- function(index=c("IG", "HY", "EU", "XO"), series) { index <- match.arg(index) df <- tbl(data.src, "index_maturity") df <- df %>% filter_(lazyeval::interp(~series == s, s=series)) %>% filter_(interp(~index == i, i=index)) %>% select(tenor, maturity, coupon) %>% rename(spread=coupon) %>% mutate(spread=spread*1e-4) %>% arrange(maturity) %>% collect() return( df ) } if(!interactive()) { library(optparse) option_list <- list( make_option(c("-i", "--index"), help="Index name we want to run"), make_option(c("-s", "--series"), help="Index series")) args <- parse_args(OptionParser(option_list=option_list)) } else { args <- list(index="IG", series=27) } maturities <- get.maturities(args$index, args$series) quotes <- index.closeprice(args$index, args$series) index <- creditIndex(paste0(args$index, args$series), "10yr") sqlstr <- paste("UPDATE index_quotes SET duration2=$1, theta2=$2", "WHERE date=$3 AND index=$4 AND series=$5 AND tenor=$6") unique.dates <- quotes$date %>% unique() for(i in seq_along(unique.dates)) { tradedate <- unique.dates[i] loginfo(paste("calibrating", index$name, tradedate)) exportYC(tradedate, "USD") index <- set.index.desc(index, tradedate) index$quotes <- quotes %>% filter(date == tradedate) %>% inner_join(maturities, by="tenor") %>% arrange(maturity) if(nrow(index$quotes) == 0) { next } index <- set.singlenamesdata(index, tradedate) if(is.null(index$portfolio)){ next } index$cs <- couponSchedule(IMMDate(tradedate, noadj=TRUE), index$maturity, "Q", "FIXED", 1, 0, tradedate, IMMDate(tradedate, "prev")) tweak <- tweakcurves(index, tradedate) index$portfolio <- tweak$portfolio index$basis <- tweak$basis acc <- cdsAccrued(tradedate, 1) for(j in seq_along(maturities$maturity)) { maturity <- maturities$maturity[j] theta <- index %>% indextheta(tradedate=tradedate, maturity=maturity) duration <- (index %>% indexduration(tradedate=tradedate, maturity=maturity)) - acc dbSendQuery(serenitasdb, sqlstr, params = list(duration, theta, tradedate, args$index, args$series, maturities$tenor[j])) } }