aboutsummaryrefslogtreecommitdiffstats
path: root/R/serenitasdb.R
blob: 071df3311dfd6cb6ed7a7c8148b9448712777008 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
library(DBI)
serenitasdb <- dbConnect(RPostgres::Postgres(),
                         dbname="serenitasdb",
                         user = "serenitas_user",
                         host="debian")

nameToBasketID <- function(name, date=Sys.Date()){
    sqlstr <- "SELECT * from nametobasketid($1, $2)"
    r <- dbGetQuery(serenitasdb, sqlstr, params=list(name, date))
    return(as.integer(r))
}

set.index.desc <- function(index, date=Sys.Date()){
    ## retrieve factor, loss, and maturity from the database for a given index
    ## depending on date
    if(class(index)!="creditIndex"){
        stop("need to pass a credit index")
    }
    id <- nameToBasketID(index$name, date)
    sqlstr <- paste("SELECT indexfactor, cumulativeloss, maturity from index_desc",
                    "WHERE tenor=$1 and basketid=$2")
    r <- as.list(dbGetQuery(serenitasdb, sqlstr, params=list(index$tenor, id)))
    r$maturity <- as.Date(r$maturity)
    return(c(index,
             list(tradedate = date, factor=r$indexfactor/100,
                  loss=r$cumulativeloss/100, maturity=r$maturity)))
}

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, "SELECT * from curve_quotes($1, $2)",
                    params = list(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){
    return(list(index = toupper(substr(indexname, 0, 2)),
                series=substr(indexname, 3, nchar(indexname))))
}

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=$1 and series=$2 and quotedate::date=$3",
                    "and tenor = $4 order by attach asc")
    r <- dbGetQuery(serenitasdb, sqlstr,
                    params = list(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=$1 and series=$2 and quotedate::date=$3",
                    "and tenor = $4 order by quotedate desc")
    distinct.quotes <- dbGetQuery(serenitasdb, sqlstr,
                                  params = list(temp$index, temp$series, date, tenor))
    flag <- FALSE
    ##we loop through the disctinct quotes until we find a complete set
    if(nrow(distinct.quotes)==0){
        return(NULL)
    }
    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=$1",
                            "and series=$2 and tenor = $3 and quotedate=$4",
                            "and detach-attach!=5  and quotesource=$5 order by attach asc")
        }else{
            sqlstr <- paste("select * from tranche_quotes where index=$1",
                            "and series=$2 and tenor = $3 and quotedate=$4",
                            "and quotesource=$5 order by attach asc")
        }
        r <- dbGetQuery(serenitasdb, sqlstr,
                        params = list(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 )
}

couponfromindex <- function(indexname, tenor){
    temp <- indexsplit(indexname)
    sqlstr <- "select coupon from index_maturity where index=$1 and series=$2 and tenor=$3"
    r <- dbGetQuery(serenitasdb, sqlstr, params = list(temp$index, temp$series, tenor))
    r$coupon
}

getlastdate <- function(indexname, tenor){
    temp <- indexsplit(indexname)
    r <- dbGetQuery(serenitasdb,
                    paste("SELECT max(date)+1 AS date FROM risk_numbers",
                          "WHERE index=$1 and series=$2 and tenor=$3"),
                    params = list(temp$index, temp$series, tenor))
    return(as.Date(r$date, format="%Y-%m-%d"))
}