diff options
Diffstat (limited to 'R/thetas-curve.R')
| -rw-r--r-- | R/thetas-curve.R | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/R/thetas-curve.R b/R/thetas-curve.R new file mode 100644 index 00000000..8ea97ae5 --- /dev/null +++ b/R/thetas-curve.R @@ -0,0 +1,77 @@ +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 %>% 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=26) +} + +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] + exportYC(tradedate, "USD") + index <- set.index.desc(index, tradedate) + index <- set.singlenamesdata(index, tradedate) + index$cs <- couponSchedule(IMMDate(tradedate, noadj=TRUE), + index$maturity, "Q", "FIXED", 1, + 0, tradedate, IMMDate(tradedate, "prev")) + index$quotes <- quotes %>% filter(date == tradedate) %>% + left_join(maturities) %>% arrange(maturity) + tweak <- tweakcurves(index, tradedate) + index$portfolio <- NULL + index <- c(index, tweak) + theta <- numeric(length(index$maturities)) + duration <- numeric(length(index$maturities)) + 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) + dbSendQuery(serenitasdb, sqlstr, + params = list(duration, theta, tradedate, + args$index, args$series, maturities$tenor[j])) + } +} |
