diff options
Diffstat (limited to 'R/serenitasdb.R')
| -rw-r--r-- | R/serenitasdb.R | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/R/serenitasdb.R b/R/serenitasdb.R new file mode 100644 index 00000000..80b50ed6 --- /dev/null +++ b/R/serenitasdb.R @@ -0,0 +1,104 @@ +library(RPostgreSQL) +drv <- dbDriver("PostgreSQL") +serenitasdb <- dbConnect(drv, dbname="serenitasdb", user="serenitas_user", password="Serenitas1", + host="debian") + +nameToBasketID <- function(name, date=Sys.Date()){ + sqlstr <- "SELECT * from nametobasketid('%s', '%s')" + r <- dbGetQuery(serenitasdb, sprintf(sqlstr, name, date)) + return(as.integer(r)) +} + +load.index <- function(name, date=Sys.Date(), tenor="5yr", Z, w, N){ + id <- nameToBasketID(name, date) + sqlstr <- "SELECT indexfactor, cumulativeloss, maturity from index_desc where basketid=%s and tenor='%s'" + r <- as.list(dbGetQuery(serenitasdb, sprintf(sqlstr, id, tenor))) + if(any(c(missing(Z), missing(w), missing(N)))){ + return( list(tenor=tenor, factor=r$indexfactor/100, maturity=r$maturity, + loss=r$cumulativeloss/100, recovery=0.4, name=name)) + }else{ + return( list(tenor=tenor, factor=r$indexfactor/100, maturity=r$maturity, + loss=r$cumulativeloss/100, recovery=0.4, name=name, Z=Z, w=w, N=N)) + } +} + +cdslist <- function(indexname, date=Sys.Date()){ + basketid <- nameToBasketID(indexname, date) + sqlstr <- "select * from CDS_Issuers where index_list @> '{%s}'" + return( dbGetQuery(serenitasdb, sprintf(sqlstr, basketid))) +} + +arr.convert <- function(arr){ + arr <- unlist(lapply(arr, function(x)strsplit(substr(x,2,nchar(x)-1),",",fixed=TRUE))) + arr[arr=="NULL"] <- NA + arr <- matrix(as.numeric(arr), nrow=length(arr)/8, ncol=8, byrow=T) + colnames(arr) <- c("6m", "1y", "2y", "3y", "4y", "5y", "7y", "10y") + return(arr) +} + +get.indexquotes <- function(indexname, date=Sys.Date()){ + r <- dbGetQuery(serenitasdb, sprintf("select * from curve_quotes('%s', '%s')", indexname, date)) + quotes <- list(tickers=r[,1], + spread_curve = arr.convert(r$spread_curve), + upfront_curve =arr.convert(r$upfront_curve), + recovery_curve = arr.convert(r$recovery_curve)) + return( quotes ) +} + +indexsplit <- function(indexname){ + r <- regexpr("(\\D*)(\\d*)", indexname, perl=T) + cs <- attr(r, "capture.start") + cl <- attr(r, "capture.length") + index <- substr(indexname, cs[1], cs[1]+cl[1]-1) + series <- substr(indexname, cs[2], cs[2]+cl[2]-1) + return(list(index=toupper(index), series=series)) +} + +get.tranchequotes <- function(indexname, tenor='5yr', date=Sys.Date()){ + temp <- indexsplit(indexname) + ## first try the easy way: + sqlstr <- paste("select * from tranche_quotes", + "where index='%s' and series=%s and quotedate::date='%s'", + "and tenor = '%s' order by attach asc") + r <- dbGetQuery(serenitasdb, sprintf(sqlstr, temp$index, temp$series, date, tenor)) + ## check if set is unique and complete + ## hy9 and hy10 tranche is gone + if(tolower(indexname) %in% c("hy9", "hy10")){ + lower.attach <- 10 + }else{ + lower.attach <- 0 + } + if(length(unique(r$attach))==length(r$attach) && all(c(r$attach, 100)==c(lower.attach, r$detach))){ + return(r) + } + ##else we work harder + ##we get the list of distinct quotes + sqlstr <- paste("select distinct quotesource, quotedate from tranche_quotes", + "where index='%s' and series=%s and quotedate::date='%s'", + "and tenor = '%s' order by quotedate desc") + distinct.quotes <- dbGetQuery(serenitasdb, sprintf(sqlstr, temp$index, temp$series, date, tenor)) + flag <- FALSE + ##we loop through the disctinct quotes until we find a complete set + for(i in 1:nrow(distinct.quotes)){ + if(temp$index == 'HY' && temp$series>=15){ ##don't want the tranchelets quoted by CITI + sqlstr <- paste("select * from tranche_quotes where index='%s'", + "and series=%s and tenor = '%s' and quotedate='%s'", + "and detach-attach!=5 and quotesource='%s' order by attach asc") + }else{ + sqlstr <- paste("select * from tranche_quotes where index='%s'", + "and series=%s and tenor = '%s' and quotedate='%s'", + "and quotesource='%s' order by attach asc") + } + r <- dbGetQuery(serenitasdb, sprintf(sqlstr, temp$index, temp$series, tenor, + distinct.quotes$quotedate[i], + distinct.quotes$quotesource[i])) + if(all(c(r$attach, 100)==c(lower.attach, r$detach))){#set is complete + flag <- TRUE + break + } + } + if(!flag){ + stop("no quotes for that day") + } + return( r ) +} |
