aboutsummaryrefslogtreecommitdiffstats
path: root/R/build_portfolios.R
blob: cb21140c3fae4758a72cb3476ad6bc4e7e7ebe99 (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
library(RQuantLib)
library(yaml)
library(dplyr, quiet = TRUE, warn.conflict = F)

args <- commandArgs(trailingOnly = TRUE)

stopifnot((root.dir <- Sys.getenv("SERENITAS_BASE_DIR")) != "")
stopifnot((config.dir <- Sys.getenv("SERENITAS_CONFIG_DIR")) != "")
source("intex_deal_functions.R")
source("yieldcurve.R")
source("creditIndex.R")
source("serenitasdb.R")

if(interactive()) {
    ## enter the parameters here
    workdate <- as.Date("2016-02-17")
    dealnames <- c("cent15")
    reinvflags <- c(TRUE)
} else {
    if(length(args) >=2){
        argslist <- strsplit(args[-1], ",")
        dealnames <- unlist(lapply(argslist, function(x)x[1]))
        reinvflags <- as.logical(unlist(lapply(argslist, function(x)x[2])))
    }
    workdate <- if(length(args) >=1) as.Date(args[1]) else Sys.Date()
}

calibration.date <- addBusDay(workdate, -1)
exportYC(calibration.date)
index <- creditIndex("hy39")
index <- set.index.desc(index, calibration.date)
global.params <- yaml.load_file(file.path(config.dir, "params.yml"),
                                handlers = list(expr = function(x) eval(parse(text = x))))

tranchedata <- tranche.data(workdate)
cashspread.discount <- 0
currdealnames <- etdb %>% tbl("et_deal_model_numbers") %>%
    filter(updatedate == !!workdate) %>%
    select(dealname) %>% collect()
## build portfolio data
for(i in seq_along(dealnames)){
    deal.name <- dealnames[i]
    global.params$reinvflag <- reinvflags[i]
    if(is.na(deal.name)){
        next
    }
    deal.data <- getdealdata(deal.name, calibration.date)
    if(is.na(deal.data$reinv_end_date)){
        global.params$reinvflag <- FALSE
    }
    if(deal.data$"Curr Collat Bal" < 1 ||is.na(deal.data$maturity)||
       deal.data$maturity <= Sys.Date()+90){
        next
    }
    deal.portfolio <- buildSC.portfolio(deal.name, deal.data, tranchedata, global.params, workdate)
    ##deal.portfolio$SC <- tweakportfolio(deal.portfolio$SC, -cashspread.discount, multiplicative=FALSE)
    mv <- crossprod(deal.portfolio$notional, deal.portfolio$price)/100
    nullcurves <- unlist(lapply(deal.portfolio$SC, is.null))
    deal.portfolio$SC <- deal.portfolio$SC[!nullcurves]
    deal.portfolio$notional <- deal.portfolio$notional[!nullcurves]
    A <- SPmatrix2(deal.portfolio$SC, deal.data, freq="Quarterly", workdate)
    S <- 1 - sapply(deal.portfolio$SC, attr, "recov")
    deal.weights <- deal.portfolio$notional/sum(deal.portfolio$notional)
    deal.spread5y <- portfoliospread(deal.portfolio, index$maturity, workdate)
    deal.spreadatmaturity <- portfoliospread(deal.portfolio, ,workdate)
    save.dir <- file.path(root.dir, "Scenarios", paste("Portfolios", workdate, sep="_"))
    if(!file.exists(save.dir)){
        dir.create(save.dir)
    }
    save(deal.portfolio, A, S, deal.weights, deal.spread5y,
         deal.spreadatmaturity, deal.data, file=file.path(save.dir, paste0(deal.name, ".RData")),
        version=2)
    cat(deal.name, "... done\n")
    if(deal.name %in% currdealnames$dealname){
        sqlstring <- paste0("UPDATE et_deal_model_numbers SET dealspread5y = $1,",
                            "dealspread = $2, cdopercentage = $3, stalepercentage= $4, ",
                            "marketvalue = $5 ",
                            "WHERE dealname= $6 and updatedate = $7")
        r <- dbSendQuery(etdb, sqlstring,params = list(deal.spread5y,
                                             deal.spreadatmaturity,
                                             deal.portfolio$cdopercentage,
                                             deal.portfolio$stale,
                                             mv,
                                             deal.name,
                                             workdate))
        if(dbHasCompleted(r)){
            dbClearResult(r)
        }
    }else{
        sqlstring <- paste0("INSERT INTO et_deal_model_numbers",
                            "(dealname, cdopercentage, stalepercentage,",
                            "dealspread5y, marketvalue, updatedate, dealspread) ",
                            "VALUES($1, $2, $3, $4, $5, $6, $7)")
        r <- dbSendQuery(etdb, sqlstring, params = list(deal.name,
                                              deal.portfolio$cdopercentage,
                                              deal.portfolio$stale,
                                              deal.spread5y, mv,
                                              workdate,
                                              deal.spreadatmaturity))
        if(dbHasCompleted(r)){
            dbClearResult(r)
        }
        currdealnames <- c(currdealnames, deal.name)
    }
}