aboutsummaryrefslogtreecommitdiffstats
path: root/R
diff options
context:
space:
mode:
Diffstat (limited to 'R')
-rw-r--r--R/backtest.R85
1 files changed, 85 insertions, 0 deletions
diff --git a/R/backtest.R b/R/backtest.R
new file mode 100644
index 00000000..2723be4d
--- /dev/null
+++ b/R/backtest.R
@@ -0,0 +1,85 @@
+## parse command line arguments
+if(.Platform$OS.type == "unix"){
+ root.dir <- "/home/share/CorpCDOs"
+}else{
+ root.dir <- "//WDSENTINEL/share/CorpCDOs"
+}
+library(ggplot2)
+
+source(file.path(root.dir, "code", "R", "serenitasdb.R"))
+source(file.path(root.dir, "code", "R", "cds_functions_generic.R"))
+source(file.path(root.dir, "code", "R", "yieldcurve.R"))
+
+get.indexquotes <- function(index, series, tenors=c("3yr", "5yr", "7yr")){
+ arraystring1 <- paste0("Array[''", paste(tenors, collapse = "'', ''"), "'']::tenor[]")
+ arraystring2 <- paste0('"', paste(tenors, collapse='" float, "'), '" float')
+ sqlstr <- paste("select * from crosstab('select date, tenor, closeprice from index_quotes where index=''%s''",
+ "and series=%s order by date, tenor', 'select unnest(%s)')",
+ "AS ct(date date, %s)")
+ stmt <- sprintf(sqlstr, index, series, arraystring1, arraystring2)
+ df <- dbGetQuery(serenitasdb, stmt)
+ return( df )
+}
+
+get.indexmaturity <- function(index, series){
+ sqlstr <- paste("select maturity, coupon/10000 as running from index_maturity where index='%s'",
+ "and series=%s order by maturity")
+ stmt <- sprintf(sqlstr, index, series)
+ df <- dbGetQuery(serenitasdb, stmt)
+ return( df )
+}
+
+fastduration <- function(sc, cs, tradedate, maturities){
+ startdate <- tradedate+1
+ acc <- cdsAccrued(tradedate, 1)
+ r <- numeric(length(maturities))
+ for(i in seq_along(maturities)){
+ if(startdate>maturities[i]){
+ r[i] <- NA
+ }else{
+ r[i] <- couponleg(cs[cs$unadj.dates<=maturities[i],], sc,
+ startdate, accruedondefault=TRUE)
+ }
+ }
+ r <- r-acc
+ return( r )
+}
+
+index <- 'HY'
+tenors <- c("3yr", "5yr", "7yr")
+recov <- 0.3
+colnames(df) <- c("date", tenors)
+sqlstr <- paste("UPDATE index_quotes set duration=%s where date='%s' and index='%s'",
+ "and series=%s and tenor='%s'")
+
+for(series in c(11, 13, 15, 17, 19, 21, 23){
+ indexquotes <- get.indexquotes(index, series)
+ maturities <- get.indexmaturity(index, series)
+ durations <- matrix(0, nrow(indexquotes), length(tenors))
+ for (i in 1:nrow(indexquotes)){
+ tradedate <- indexquotes[i, "date"]
+ exportYC(tradedate)
+ maturity <- maturities[nrow(maturities), "maturity"]
+ cs <- couponSchedule(IMMDate(tradedate, noadj=TRUE), maturity,"Q", "FIXED", 1,
+ 0, tradedate, IMMDate(tradedate, "prev"))
+ quotes <- data.frame(upfront=(100-as.numeric(indexquotes[i,-1]))/100, maturities)
+ sc <- cdshazardrate(quotes, recov, tradedate, cs)
+ durations[i,] <- fastduration(sc, cs, tradedate, maturities$maturity)
+ }
+
+ df <- data.frame(date=indexquotes$date, durations)
+ colnames(df) <- c("date", tenors)
+ for(i in 1:nrow(df)){
+ for(tenor in tenors){
+ if(!is.na(df[i,tenor])){
+ stmt <- sprintf(sqlstr, df[i,tenor], df[i,"date"], index, series, tenor)
+ dbSendQuery(serenitasdb, stmt)
+ }
+ }
+ }
+}
+
+## nice plot, now I'm just showing off
+ggplot(df, aes(x=date))+geom_line(aes(y=`3yr`, colour="3yr"))+
+ geom_line(aes(y=`5yr`, colour="5yr"))+
+ geom_line(aes(y=`7yr`, colour="7yr"))+ylab("duration")+labs(colour="tenor")