diff options
Diffstat (limited to 'R/cds_functions_generic.R')
| -rw-r--r-- | R/cds_functions_generic.R | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/R/cds_functions_generic.R b/R/cds_functions_generic.R index d404992f..8b05d666 100644 --- a/R/cds_functions_generic.R +++ b/R/cds_functions_generic.R @@ -1,4 +1,6 @@ library("methods")
+library("doParallel")
+library("itertools")
if(.Platform$OS.type == "unix"){
root.dir <- "/home/share/CorpCDOs/"
@@ -522,6 +524,7 @@ indexpv <- function(portfolio, index, epsilon=0){ pl <- rep(0, length(portfolio))
cl <- rep(0, length(portfolio))
cs <- couponSchedule(nextIMMDate(Sys.Date()), index$maturity, "Q", "FIXED", index$coupon)
+
for(i in 1:length(portfolio)){
if(epsilon!=0){
tweakedcurve <- portfolio[[i]]@curve
@@ -558,31 +561,22 @@ portfoliospread <- function(portfolio, maturity){ ## computes the spread of a portfolio defined by notionals and survivalcurves
## for a given maturity.
## if maturity is missing, we use the intrinsic maturity for each curve
- S <- 0
- d <- rep_len(0, length(portfolio$SC))
- ## Svec <- rep(0, length(portfolio$SC))
if(missing(maturity)){
maturityvec <- as.Date(sapply(portfolio$SC, creditcurve.maturity), origin="1970-01-01")
}else{
maturityvec <- rep(maturity, length(portfolio$SC))
}
- for(i in seq_along(portfolio$SC)){
- if(length(portfolio$SC[[i]]@curve@hazardrates)==0||maturityvec[i]<=portfolio$SC[[i]]@startdate){
- d[i] <- 0
- ## Svec[i] <- 0
- }else{
- if(portfolio$SC[[i]]@curve@hazardrates[1]>10){
- d[i] <- 0
- }else{
- d[i] <- cdsduration(portfolio$SC[[i]]@curve, maturityvec[i])
+
+ data <- foreach(it = izip(creditcurve = portfolio$SC, notional = portfolio$notional,
+ maturity = maturityvec, count=icount(length(portfolio$notional))), .combine=rbind) %:% {
+ when(length(it$creditcurve@curve@hazardrates)!=0 && it$maturity > it$creditcurve@startdate
+ && it$creditcurve@curve@hazardrates[1]<=10)
+ } %dopar% {
+ d <- cdsduration(it$creditcurve@curve, it$maturity)
+ S <- cdsspread(it$creditcurve@curve, it$maturity, it$creditcurve@recovery)
+ c(d * S * it$notional, d * it$notional)
}
- S <- S + d[i] * portfolio$notional[i] *
- cdsspread(portfolio$SC[[i]]@curve, maturityvec[i], portfolio$SC[[i]]@recovery)
- ## Svec[i] <- cdsspread(portfolio$SC[[i]]@curve, maturityvec[i], portfolio$SC[[i]]@recovery)
- }
- }
- S <- S/crossprod(d, portfolio$notional)
- return(S)
+ return(sum(data[,1])/sum(data[,2]))
}
portfolioduration <- function(portfolio, maturity){
@@ -600,10 +594,9 @@ tweakcurves <- function(portfolio, index){ abs(indexpv(portfolio, index, epsilon)$bp-index$indexref)
}
epsilon <- optimize(f, c(-0.5, 0.5), portfolio, index, tol=1e-6)$minimum
- portfolio.new <- portfolio
- for(i in seq_along(portfolio)){
- portfolio.new[[i]]@curve@hazardrates <- portfolio[[i]]@curve@hazardrates * (1 + epsilon)
- }
+ portfolio.new <- lapply(portfolio, function(x, ...) {
+ x@curve@hazardrates <- x@curve@hazardrates * (1+epsilon)
+ return(x)})
cat("tweak = ", epsilon, "\n")
return( portfolio.new )
}
|
