aboutsummaryrefslogtreecommitdiffstats
path: root/R/backtest.R
diff options
context:
space:
mode:
Diffstat (limited to 'R/backtest.R')
-rw-r--r--R/backtest.R138
1 files changed, 0 insertions, 138 deletions
diff --git a/R/backtest.R b/R/backtest.R
deleted file mode 100644
index 8ef74b7c..00000000
--- a/R/backtest.R
+++ /dev/null
@@ -1,138 +0,0 @@
-library(ggplot2)
-library(lubridate)
-library(doParallel)
-
-if(.Platform$OS.type == "unix"){
- root.dir <- "/home/share/CorpCDOs"
-}else{
- root.dir <- "//WDSENTINEL/share/CorpCDOs"
-}
-
-hostname <- system("hostname", intern=TRUE)
-if(hostname=="debian"){
- registerDoParallel(4)
-}else{
- registerDoParallel(8)
-}
-
-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/cast(10000 as float)as running, tenor",
- "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){
- r <- rep(NA, length(maturities))
- if(is.null(sc)){
- return( r )
- }
- startdate <- tradedate+1
- acc <- cdsAccrued(tradedate, 1)
- 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)-acc
- }
- }
- return( r )
-}
-
-fasttheta <- function(sc, cs, recov, tradedate, maturities, quotes){
- r <- rep(NA, length(maturities))
- if(is.null(sc)){
- return(r)
- }
- startdate <- tradedate+1
- acc <- cdsAccrued(tradedate, 1)
-
- newmaturities <- maturities+years(-1)
- for(i in seq_along(newmaturities)){
- ## never extrapolate, and do not attempt to compute theta if within 1 year
- if(startdate>newmaturities[i] || is.na(quotes[i])){
- next
- }else{
- newcs <- cs[cs$unadj.dates<=newmaturities[i],]
- upfront <- defaultleg(newcs, sc, recov, startdate) -
- (couponleg(newcs, sc, startdate, accruedondefault=TRUE)-acc)*0.05
- r[i] <- quotes[i]-upfront+0.05
- }
- }
- return( r )
-}
-
-convertNA <- function(x){
- if(is.na(x)){
- return( "Null" )
- }else{
- return( x )
- }
-}
-
-
-index <- 'HY'
-tenors <- c("3yr", "5yr", "7yr")
-recov <- 0.3
-sqlstr <- paste("UPDATE index_quotes set duration=%s, theta=%s where date='%s' and index='%s'",
- "and series=%s and tenor='%s'")
-
-for(series in c(9, 10, 11, 13, 15, 17, 19, 21, 23)){
- indexquotes <- get.indexquotes(index, series)
- maturities <- get.indexmaturity(index, series)
- maturities <- maturities[maturities$tenor %in% tenors,]
- indexquotes <- indexquotes[indexquotes$date<=maturities$maturity[3],]
- durations <- matrix(0, nrow(indexquotes), length(tenors))
- thetas <- matrix(0, nrow(indexquotes), length(tenors))
- maturity <- maturities[nrow(maturities), "maturity"]
- durandthetas <- foreach(i = 1:nrow(indexquotes), .combine='rbind') %dopar% {
- tradedate <- indexquotes[i, "date"]
- exportYC(tradedate)
- 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)
- c(fastduration(sc, cs, tradedate, maturities$maturity),
- fasttheta(sc, cs, recov, tradedate, maturities$maturity, quotes$upfront))
- }
- df.durations <- data.frame(date=indexquotes$date, durandthetas[,1:3])
- df.thetas <- data.frame(date=indexquotes$date, durandthetas[,4:6])
- colnames(df.durations) <- c("date", tenors)
- colnames(df.thetas) <- c("date", tenors)
- for(i in 1:nrow(df.durations)){
- for(tenor in tenors){
- stmt <- sprintf(sqlstr, convertNA(df.durations[i,tenor]), convertNA(df.thetas[i, tenor]),
- df.durations[i,"date"], index, series, tenor)
- dbSendQuery(serenitasdb, stmt)
- }
- }
- ## nice plot, now I'm just showing off
- ggplot(df.durations, 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")
- ggsave(filename=paste0("HY", series, " durations.png"))
- ## plot thetas
- ggplot(df.thetas, 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("theta")+labs(colour="tenor")
- ggsave(filename=paste0("HY", series, " thetas.png"))
-}