aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build_SC.R89
1 files changed, 82 insertions, 7 deletions
diff --git a/build_SC.R b/build_SC.R
index 43cf2907..d8faec02 100644
--- a/build_SC.R
+++ b/build_SC.R
@@ -19,7 +19,7 @@ bps <- 1e-4
global.params <- list()
global.params$recovery.assumptions <- list("Loan"=0.7,
"SecondLien"=0.3,
- "Bond"=0.3,
+ "Bond"=0.4,
"Mezzanine"=0.15,
"Adj_Covlite"=0.1)
@@ -311,13 +311,88 @@ buildSC.portfolio <- function(dealname, global.params, startdate=today()) {
## }
stonln1.portfolio <- buildSC.portfolio("stonln1", global.params)
+stonln1.data <- getdealdata("stonln1")
A <- SPmatrix2(stonln1.portfolio$SC, getdealdata("stonln1"))
S <- 1 - sapply(stonln1.portfolio$SC, attr, "recov")
-w <- stonln1.portfolio$notional/sum(stonln1.portfolio$notional)
-lu <- 0.01
-test <- lossrecovdist(A$DP[,39], A$PP[,39], w, S, lu, useC=FALSE)
-test2 <- lossdistribprepayC.joint(A$DP[,39], A$PP[,39], w, S, lu)
+issuerweights <- stonln1.portfolio$notional/sum(stonln1.portfolio$notional)
+testC <- lossrecovdist(A$DP[,39], A$PP[,39], issuerweights, S, 100)
+test <- lossrecovdist(A$DP[,39], A$PP[,39], issuerweights, S, 100, useC=FALSE)
+poire <- recovdistC(A$DP[,39], A$PP[,39], issuerweights, S, 100)
+test2 <- lossdistribprepayC.joint(A$DP[,39], A$PP[,39], w, S, 100)
+dp <- A$DP
+pp <- A$PP
+dpmod <- MFupdate.prob(Z, w.mod, rho, dp)
+ppmod <- MFupdate.prob(-Z, w.mod, rho, pp)
+cl <- makeCluster(6)
+clusterExport(cl, list("shockprob", "rho", "Z", "issuerweights", "lossdistribprepayC.joint",
+ "lossrecovdist.joint.term", "lossdistribC.joint", "Ngrid"))
+MFtest.joint <- MFlossrecovdist2(cl, w.mod, Z, rho, dp, dpmod, pp, ppmod, issuerweights, 1-S, Ngrid=201)
+MFtest <- MFlossrecovdist(w.mod, Z, rho, dp, dpmod, pp, ppmod, issuerweights, 1-S, Ngrid=201)
-defaultprob <- A$DP[,39]
-prepayprob <- A$PP[,39]
+## build scenarios:
+
+## compute the joint density of (R/D, D)
+## u=y/(x+y)
+## v=x+y
+## colSums(distchv[t,,]) is the density of D
+## rowSums(distchv[t,,]) is the density of R/D, which is
+distchv <- array(0, dim=dim(MFtest.joint))
+for(t in 1:ncol(dp)){
+ dist <- MFtest.joint[t,,]
+ u <- seq(0, 1, length=Ngrid)
+ v <- seq(0, 1, length=Ngrid)
+ y <- u %o% v
+ x <- sweep(-y, 2, v, "+")
+ xgrid <- round(x*(Ngrid-1))
+ ygrid <- round(y*(Ngrid-1))
+ for(i in 1:Ngrid){
+ for(j in 1:Ngrid){
+ distchv[t,i,j] <- dist[xgrid[i,j]+1, ygrid[i,j]+1]*seq(0,1, length=Ngrid)[j]
+ }
+ }
+}
+
+n.scenarios <- 50
+percentiles <- (seq(0, 1, length=n.scenarios+1)[-1]+
+ seq(0, 1, length=n.scenarios+1)[-(n.scenarios+1)])/2
+
+scenariosd <- matrix(0, n.scenarios, ncol(dp))
+scenariosr <- matrix(0, n.scenarios, ncol(dp))
+for(t in 1:39){
+ D <- colSums(distchv[t,,])/sum(colSums(distchv[t,,]))
+ Dfun <- splinefun(c(0, cumsum(D)),c(0, seq(0, 1, length=Ngrid)), "monoH.FC")
+ dval <- round(Dfun(percentiles)*(Ngrid-1))
+ dvallow <- floor(Dfun(percentiles)*(Ngrid-1))
+ dvalup <- floor(Dfun(percentiles)*(Ngrid-1))
+ scenariosd[,t] <- Dfun(percentiles)
+ for(i in 1:n.scenarios){
+ scenariosd[i,t]*
+ scenariosr[i,t] <- seq(0,1,length=Ngrid)[which(cumsum(distchv[t,,dval[i]])/
+ sum(distchv[t,,dval[i]])>=0.5)[1]]
+ }
+}
+
+dates <- seq(stonln1.data$"Deal Next Pay Date", stonln1.data$maturity, by="3 months")
+
+cdrfromscenarios <- function(scenario, dates){
+ cdr <- matrix(0, nrow(scenarios), ncol(scenarios))
+ for(i in 1:nrow(scenarios)){
+ cdr[i,] <- 100*(1-exp(diff(c(0, log(1-scenarios[i])))))/diff(c(0, yearFrac(today(), dates)))
+ }
+ return( cdr )
+}
+
+cdrmonthly <- matrix(0, n.scenarios, 38*3)
+for(i in 1:n.scenarios){
+ cdrmonthly[i,] <- cdr[i, as.numeric(rbind(1:38, 1:38, 1:38))]
+}
+scenariosr.temp <- scenariosr[,-1]
+recoverymonthly <- matrix(0, n.scenarios, 38*3)
+for(i in 1:n.scenarios){
+ recoverymonthly[i,] <- scenariosr[i, as.numeric(rbind(1:38, 1:38, 1:38))]
+}
+
+recoverymonthly[is.na(recoverymonthly)] <- 0.7
+write.table(cdrmonthly, file="stonln1cdr.csv", row.names=F, col.names=F, sep=",")
+write.table(recoverymonthly * 100, file="stonln1recovery.csv", row.names=F, col.names=F, sep=",")