aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--R/build_scenarios.R78
1 files changed, 51 insertions, 27 deletions
diff --git a/R/build_scenarios.R b/R/build_scenarios.R
index 10099985..a837f6ad 100644
--- a/R/build_scenarios.R
+++ b/R/build_scenarios.R
@@ -81,9 +81,6 @@ Z <- calibration$Z
w <- calibration$w
Ngrid <- 201
-## dealnames <- list.files(file.path(root.dir, "Scenarios", paste0("Portfolios_", calibration.date)),
-## pattern="*.RData")
-## dealnames <- sapply(strsplit(dealnames, "\\."), function(x)x[1])
MarkitData <- getMarkitIRData(calibration.date)
L1m <- buildMarkitYC(MarkitData, dt = 1/12)
L2m <- buildMarkitYC(MarkitData, dt = 1/6)
@@ -93,9 +90,17 @@ L12m <- buildMarkitYC(MarkitData, dt = 1)
setEvaluationDate(as.Date(MarkitData$effectiveasof))
support <- seq(0, 1, length = Ngrid)
-## 3 months
-recoverylag <- 90
+recoverylag <- 90 ##days
j <- 1
+## reinvestment parameters
+## need to match parameters in build_portfolios.R
+reinvspread <- 0.025
+reinvfixed <- 0.07
+rollingmaturity <- 84 ##months
+reinvlag <- 3 ##months
+n.scenarios <- 100
+recov.adj <- 0.925
+
for(deal.name in dealnames){
load(file.path(root.dir, "Scenarios", paste("Portfolios", workdate, sep="_"),
paste(deal.name, "RData", sep=".")))
@@ -120,7 +125,6 @@ for(deal.name in dealnames){
}
}
- n.scenarios <- 100
## compute scenariosd
scenariosd <- matrix(0, n.scenarios, dim(distDR)[1])
scenariosr <- matrix(0, n.scenarios, dim(distDR)[1])
@@ -142,16 +146,15 @@ for(deal.name in dealnames){
}
}
}
- recov.adj <- 0.925
- ## need to adjust the recover because intex has some embedded amortization assumptions
- ## that we can't turn off
- scenariosr <- scenariosr * recov.adj
+
+ ## we need to adjust the recovery because intex has some embedded amortization assumptions
+ ## that we can't turn off (multiply by recov.adj)
intexrecov <- matrix(0, n.scenarios, dim(distDR)[1])
for(i in 1:dim(distDR)[1]){
if(i==1){
- intexrecov[,i] <- (scenariosr[,i]/scenariosd[,1])
+ intexrecov[,i] <- recov.adj * (scenariosr[,i]/scenariosd[,1])
}else{
- intexrecov[,i] <- (scenariosr[,i]-scenariosr[,i-1])/(scenariosd[,i]-scenariosd[,i-1])
+ intexrecov[,i] <- recov.adj * (scenariosr[,i]-scenariosr[,i-1])/(scenariosd[,i]-scenariosd[,i-1])
}
}
@@ -166,32 +169,53 @@ for(deal.name in dealnames){
for(i in 1:n.scenarios){
cdrmonthly[i,] <- approx(deal.dates, cdr[i,], deal.datesmonthly, rule=2)$y
recoverymonthly[i,] <- approx(deal.dates, intexrecov[i,], deal.datesmonthly, rule=2)$y
- scenariosrmonthly[i,] <- approx(deal.dates, intexrecov[i,], deal.datesmonthly, rule=2)$y
+ scenariosrmonthly[i,] <- approx(deal.dates, scenariosr[i,], deal.datesmonthly, rule=2)$y
}
-
+ recoverymonthly <- pmin(recoverymonthly,1)
## compute reinvestment price
if(reinvflags[j]){
DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, deal.datesmonthlylagged))
df <- DC$discounts
forwards <- DC$forwards
- reinvprices <- compute.reinvprices(df, forwards, cdrmonthly, recoverymonthly, 0.025, 0.07, 84, 3)
+ reinvprices <- compute.reinvprices(df, forwards, cdrmonthly, recoverymonthly, reinvspread,
+ reinvfixed, rollingmaturity, reinvlag)
}
- ## prev <- scenariosrmonthly[,1]
- ## loanprices <- c()
- ## bondprices <- c()
- ## for(t in 2:dim(cdrmonthly)[2]){
- ## w <- scenariosrmonthly[,t]-scenariosrmonthly[,t-1]+
- ## prev*cdrmonthly[,t]/100 * intexrecov[,t] + yearFrac(deal.datesmonthly[t-1], deal.datesmonthly[t])
- ## prev <- w
- ## loanprices <- c(loanprices, crossprod(w, reinvprices$loan)/sum(w))
- ## bondprices <- c(bondprices, crossprod(w, reinvprices$bond)/sum(w))
- ## }
- ## browser()
+ ## all amounts are in units of current collateral balance
+ reinvdollar <- matrix(0, n.scenarios, length(deal.datesmonthly))
+ maturingbalance <- matrix(0, n.scenarios, length(deal.datesmonthly))
+ reinvdollar[,1] <- scenariosrmonthly[,1] + 0.07577 #this should be principal account balance
+ loanprices <- crossprod(reinvdollar[,1], reinvprices$loan[,1])/sum(reinvdollar[,1])
+ bondprices <- c(crossprod(reinvdollar[,1], reinvprices$bond[,1])/sum(reinvdollar[,1]))
+ maturingbalance[,min(1+rollingmaturity, length(deal.datesmonthly))] <-
+ reinvdollar[,1]/(0.85*loanprices[1]+0.15*bondprices[1])
+ reinvbalance <- matrix(0, n.scenarios, length(deal.datesmonthly))
+ for(t in 2:dim(cdrmonthly)[2]){
+ reinvdollar <- scenariosrmonthly[,t]-scenariosrmonthly[,t-1]+
+ reinvbalance*cdrmonthly[,t]/100* recoverymonthly[,t]*yearFrac(deal.datesmonthly[t-1], deal.datesmonthly[t])
+ if(t==(dim(cdrmonthly)[2]-1)){
+ reinvbalance[,t] <- maturingbalance[,length(deal.datesmonthly)]
+ }else if(t==dim(cdrmonthly)[2]){
+ reinvbalance[,t] <- 0
+ }else{
+ reinvbalance[,t] <- rowSums(maturingbalance[,(t+1):length(deal.datesmonthly)])
+ }
+ reinvdollar[,t] <- scenariosrmonthly[,t] - scenariosrmonthly[,t-1] +
+ reinvbalance[,t] * cdrmonthly[,t]/100 * recoverymonthly[,t] *
+ yearFrac(deal.datesmonthly[t-1], deal.datesmonthly[t])
+ loanprices <- c(loanprices, crossprod(reinvdollar[,t], reinvprices$loan[,t])/sum(reinvdollar[,t]))
+ bondprices <- c(bondprices, crossprod(reinvdollar[,t], reinvprices$bond[,t])/sum(reinvdollar[,t]))
+ maturingbalance[,min(t+rollingmaturity, length(deal.datesmonthly))] <-
+ reinvdollar[,t]/(0.85*loanprices[t]+0.15*bondprices[t])
+ maturingbalance[,min(t+rollingmaturity, length(deal.datesmonthly))] <-
+ maturingbalance[,min(t+rollingmaturity, length(deal.datesmonthly))] +
+ reinvdollar[,t]/loanprices[t]
+ }
+
save.dir <- file.path(root.dir, "Scenarios", paste("Intex curves", workdate, sep="_"), "csv")
if(!file.exists(save.dir)){
dir.create(save.dir, recursive = T)
}
- recoverymonthly <- pmin(recoverymonthly,1)
+
write.table(cdrmonthly,
file= file.path(save.dir, paste0(deal.name,"-cdr.csv")),
row.names=F, col.names=F, sep=",")