aboutsummaryrefslogtreecommitdiffstats
path: root/R/build_portfolios.R
blob: c50ceebbc4f6f6e3753960abcd43515a7472920e (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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
library("RQuantLib")

args <- commandArgs(trailingOnly=TRUE)

if(.Platform$OS.type == "unix"){
  root.dir <- "/home/share/CorpCDOs"
}else{
  root.dir <- "//WDSENTINEL/share/CorpCDOs"
}

source(file.path(root.dir, "code", "R", "intex_deal_functions.R"))

if(length(args) >=2){
    dealnames <- args[2:length(args)]
}else{
    data <- read.table(file.path(root.dir, "scripts", "cusips_to_price.txt"))
    dealnames <- dealnamefromcusip(data$V1)
    uniqdealnames <- unique(dealnames)
    uniqdealnames <- uniqdealnames[!is.na(uniqdealnames)]
    disablereinvflags <- data$V2[match(uniqdealnames, dealnames)]
    dealnames <- uniqdealnames
    unlink(file.path(root.dir, "scripts", "cusips_to_price.txt"))
}

source(file.path(root.dir, "code", "R", "index_definitions.R"))
source(file.path(root.dir, "code", "R", "cds_utils.R"))

if(length(args) >= 1){
  workdate <- as.Date(args[1])
}else{
  workdate <- Sys.Date()
}

calibration.date <- prevBusDay(workdate)
MarkitData <- getMarkitIRData(calibration.date)
futurequotes <- read.csv(file.path(root.dir, "data", "Yield Curves",
                                   sprintf("futures-%s.csv", calibration.date)), header=F)
setEvaluationDate(as.Date(MarkitData$effectiveasof))
setCalendarContext("UnitedStates/GovernmentBond")
L1m <- buildMarkitYC(MarkitData, futurequotes[,2], dt = 1/12)
L2m <- buildMarkitYC(MarkitData, futurequotes[,2], dt = 1/6)
L3m <-  buildMarkitYC(MarkitData, futurequotes[,2])

L6m <- buildMarkitYC(MarkitData, futurequotes[,2], dt = 1/2)
L12m <- buildMarkitYC(MarkitData, futurequotes[,2], dt = 1)

bps <- 1e-4
global.params <- list()
global.params$recovery.assumptions <- list("Loan"=0.7,
                                           "Senior Notes"=0.7,
                                           "SecondLien"=0.3,
                                           "Bond"=0.4,
                                           "Mezzanine"=0.15,
                                           "Adj_Covlite"=0.1,
                                           "Credit Default Swap"=0)

global.params$cdoprices <- list("Aaa"=95,
                                "Aa"=90,
                                "A"=88,
                                "Baa"=85,
                                "Ba"=80,
                                "B"=75,
                                "NR"=50)
#reinvest in 7 years assets
global.params$rollingmaturity <- 7 * 365
global.params$defaultedlag <- 90
global.params$defaultcorr <- 0.45
global.params$defaultbondhazardrate <- 2500 * bps
global.params$defaultloanhazardrate <- 2500 * bps
global.params$alpha <- 0.25
global.params$beta <- 15
global.params$shape <- function(T)0.75+(1-0.75)*(1-exp(-T/5))
global.params$reinvflag <- TRUE
cusipdata <- cusip.data()

currdealnames <- dbGetQuery(dbCon, "select updatedate, dealname from latest_deal_model_numbers")
## build portfolio data
i <- 1
for(deal.name in dealnames){
    if(exists("disablereinvflags")){
        global.params$reinvflag <- !disablereinvflags[i]
    }
    i <- i+1
    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 <= today()+90){
        next
    }
    deal.portfolio <- buildSC.portfolio(deal.name, deal.data, cusipdata, global.params, workdate)
    A <- SPmatrix2(deal.portfolio$SC, deal.data, freq="3 months", workdate)
    S <- 1 - sapply(deal.portfolio$SC, attr, "recov")
    deal.weights <- deal.portfolio$notional/sum(deal.portfolio$notional)
    deal.dates <- getdealschedule(deal.data)
    deal.spread5y <- portfoliospread(deal.portfolio, hy19$maturity)
    deal.spreadatmaturity <- portfoliospread(deal.portfolio)
    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.dates, deal.spread5y,
         deal.spreadatmaturity, deal.data, file=file.path(save.dir, paste0(deal.name, ".RData")))
    cat(deal.name, "... done\n")
    dealupdatedate <- currdealnames$updatedate[currdealnames$dealname %in% deal.name]
    if(length(dealupdatedate) && dealupdatedate == workdate){
        sqlstring <- sprintf(
                     paste0("UPDATE et_deal_model_numbers SET dealspread5y = %s,",
                            "dealspread = %s, cdopercentage = %s, stalepercentage= %s, ",
                            "marketvalue = %s",
                            "WHERE dealname= '%s' and updatedate = '%s'"),
                     deal.spread5y,
                     deal.spreadatmaturity,
                     deal.portfolio$cdopercentage,
                     deal.portfolio$stale,
                     crossprod(deal.portfolio$notional, deal.portfolio$price)/100,
                     deal.name,
                     as.Date(workdate))
        dbSendQuery(dbCon, sqlstring)
    }else{
        sqlstring <- sprintf(paste0("INSERT INTO et_deal_model_numbers",
                                    "(dealname, cdopercentage, stalepercentage,",
                                    "dealspread5y, marketvalue, updatedate, dealspread) ",
                                    "VALUES('%s', %s, %s, %s, %s, '%s', %s)"),
                             deal.name,
                             deal.portfolio$cdopercentage,
                             deal.portfolio$stale,
                             deal.spread5y,
                             crossprod(deal.portfolio$notional, deal.portfolio$price)/100,
                             workdate,
                             deal.spreadatmaturity
                             )
        dbSendQuery(dbCon, sqlstring)
        currdealnames <- c(currdealnames, deal.name)
    }
}

if(length(args)<1){
    write.table(data.frame(dealnames, as.integer(!disablereinvflags)),
                file = file.path(root.dir, "scripts", "scenarios.txt"), row.names = F, col.names = F)
}