aboutsummaryrefslogtreecommitdiffstats
path: root/R/calibrate_tranches_BC.R
blob: afebb179f70c0a980254ecab8aa78ae27727e44c (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
if(.Platform$OS.type == "unix"){
  root.dir <- "/home/share/CorpCDOs"
}else{
  root.dir <- "//WDSENTINEL/share/CorpCDOs"
}

options(warn=2, stringsAsFactors = FALSE)

source(file.path(root.dir, "code", "R", "yieldcurve.R"))
source(file.path(root.dir, "code", "R", "optimization.R"))
source(file.path(root.dir, "code", "R", "calibration.R"), chdir=TRUE)
source(file.path(root.dir, "code", "R", "mlpdb.R"))
library(lossdistrib)

n.int <- 250
list2env(GHquad(n.int), envir=parent.frame())
Ngrid <- 201

aux <- function(rho, index, K, quote, spread){
    temp <- BCtranche.legs(index, K, rho)
    return(abs(temp$pl+temp$cl*spread + quote))
}
args <- commandArgs(trailingOnly=TRUE)

index.name <- args[1]
if(length(args)>=2&&args[2]!="update"){
    tenor <- args[2]
}else{
    tenor <- "5yr"
}

updateflag <- args[length(args)]=="update"
if(updateflag){##ghetto way of getting the last row of the file
    runfile <- read.csv(file.path(root.dir,"Tranche_data","Runs", paste0(index.name,tenor,".csv")))
    begin.date <- as.Date(runfile[nrow(runfile),1])+1
}

begin.date <- switch(index.name,
                     hy10=as.Date("2014-06-10"),
                     ig19=as.Date("2013-05-01"),
                     ig21=as.Date("2013-09-26"),
                     hy19=as.Date("2013-02-01"),
                     hy21=as.Date("2013-10-04"))
alldates <- seq(begin.date, Sys.Date()-1, by="1 day")
if(index.name=="ig19"){
    alldates <- alldates[alldates!=as.Date("2013-11-29")] ##people are lazy the day after Thanksgiving
}

bus.dates <- as.Date(names(which(isBusinessDay(calendar="UnitedStates/GovernmentBond", alldates))))

##check if we have all the quotes and save them
n.tranches <- 4
quotes <- matrix(0, length(bus.dates), 2+2*n.tranches)
for(j in seq_along(bus.dates)){
    tradedate <- bus.dates[j]
    index <- load.index(index.name, tradedate, tenor, Z, w, Ngrid)
    temp <- get.tranchequotes(index$name, index$tenor, tradedate)
    quotes[j, 1] <- temp$indexrefprice[1]
    quotes[j, 2] <- temp$indexrefspread[1]
    quotes[j, 2+1:n.tranches] <- temp$trancheupfront
    quotes[j, 2+n.tranches+1:n.tranches] <- temp$tranchedelta
}

tranche.names <- paste(temp$attach, temp$detach, sep="-")
colnames(quotes) <- c("indexprice", "indexref",paste(tranche.names, "Upfront"),
                      paste(tranche.names, "Dealer Delta"))
Attach <- temp$detach
#preallocate all the risk matrices
indexEL <- rep(0, length(bus.dates))
indexTheta <- rep(0, length(bus.dates))
deltas <- matrix(0, length(bus.dates), n.tranches)
gammas <- matrix(0, length(bus.dates), n.tranches)
thetas <- matrix(0, length(bus.dates), n.tranches)
rhos <- matrix(0, length(bus.dates), n.tranches)
corr01 <- matrix(0, length(bus.dates), n.tranches)
durations <- matrix(0, length(bus.dates), n.tranches)
EL <- matrix(0, length(bus.dates), n.tranches)

for(i in seq_along(bus.dates)){
    tradedate <- bus.dates[i]
    exportYC(tradedate)
    index <- load.index(index.name, tradedate, tenor, Z, w, Ngrid)
    ## calibrate the single names curves
    index <- set.singlenamesdata(index, tradedate)
    index <- set.tranchedata(index, tradedate)
    indexEL[i] <- EL(index)
    indexTheta[i] <- indextheta(index, tradedate)
    ## calibrate the tranches using base correlation
    rhovec <- c(0)
    for(j in 1:(length(index$K)-2)){
        ##use the current tranche coupon
        ## we compute the 0-index$K[j+1] equivalent quote using the coupon of the jth quote
        if(j==1){
            q <- index$tranche.quotes[j]*index$K[j+1]
        }else{
            temp <- BCtranche.legs(index, index$K[j], rhovec[j])
            q <- index$tranche.quotes[j] * (index$K[j+1]-index$K[j])-
                temp$pl - temp$cl*index$tranche.running[j]
        }
        rho <- optimize(aux, interval=c(0,1), index=index, K=index$K[j+1], quote=q,
                        spread=index$tranche.running[j])$minimum
        rhovec <- c(rhovec, rho)
    }
    index$rho <- c(rhovec, NA)
    temp <- BCtranche.delta(index, tradedate)
    deltas[i,] <- temp$deltas
    gammas[i,] <- temp$gammas
    thetas[i,] <- BCtranche.theta(index)
    rhos[i,] <- index$rho[-1]
    corr01[i,] <- BCtranche.corr01(index)
    temp <- BCtranche.pv(index, protection=TRUE)
    durations[i,] <- (temp$cl-cdsAccrued(tradedate, index$tranche.running))/index$tranche.running
    EL[i,] <- -temp$pl*diff(index$K)
    print(tradedate)
}
risk.numbers <- data.frame(deltas, gammas, thetas, rhos, corr01, durations, EL)
colnames(risk.numbers) <- c(paste(tranche.names, "Model Delta"),
                            paste(tranche.names, "Gamma"),
                            paste(tranche.names, "Theta"),
                            paste(Attach, "Corr"),
                            paste(tranche.names, "Corr01"),
                            paste(tranche.names, "Dur"),
                            paste(tranche.names, "EL"))
data <- cbind(quotes, indexEL, indexTheta, risk.numbers)
row.names(data) <- as.character(bus.dates)

write.csv(data, file.path(root.dir,"Tranche_data","Runs", paste(index.name,tenor,"csv",sep=".")),
          append=updateflag, col.names=!updateflag)