aboutsummaryrefslogtreecommitdiffstats
path: root/R/thetas-curve.R
diff options
context:
space:
mode:
Diffstat (limited to 'R/thetas-curve.R')
-rw-r--r--R/thetas-curve.R77
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]))
+ }
+}