diff options
Diffstat (limited to 'R/cds_functions_generic.R')
| -rw-r--r-- | R/cds_functions_generic.R | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/R/cds_functions_generic.R b/R/cds_functions_generic.R index 1cd89c76..47a8d489 100644 --- a/R/cds_functions_generic.R +++ b/R/cds_functions_generic.R @@ -519,29 +519,39 @@ bondhazardrate.shaped <- function(collateral, shape, R=0.4, alpha=0.25, beta=15) return( shapedtodpc(cs, sc) )
}
+tweakportfolio <- function(portfolio, epsilon, multiplicative=TRUE){
+ ## tweak a portfolio of creditcurves
+ ## if multiplicative is TRUE apply a multiplicative tweak
+ ## otherwise apply an additive one
+ if(multiplicative){
+ r <- lapply(portfolio, function(x) {
+ x@curve@hazardrates <- x@curve@hazardrates * (1+epsilon)
+ x
+ })
+ }else{
+ ## we do a tweak to the spread
+ r <- lapply(portfolio, function(x) {
+ x@curve@hazardrates <- x@curve@hazardrates + epsilon/(1-x@recovery)
+ x
+ })
+ }
+ return( r )
+}
+
indexpv <- function(portfolio, index, epsilon=0){
## computes the intrinsic index pv of a portfolio of cds
- 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
- tweakedcurve@hazardrates <- tweakedcurve@hazardrates * (1 + epsilon)
- cl[i] <- couponleg(cs, tweakedcurve)
- pl[i] <- defaultleg(cs, tweakedcurve, portfolio[[i]]@recovery)
- }else{
- cl[i] <- couponleg(cs, portfolio[[i]]@curve)
- pl[i] <- defaultleg(cs, portfolio[[i]]@curve, portfolio[[i]]@recovery)
- }
+ if(epsilon!=0){
+ portfolio <- tweakportfolio(portfolio, epsilon)
}
- return( list(cl=mean(cl), pl=mean(pl), bp=1+mean(cl-pl)))
+ cl.list <- unlist(lapply(portfolio, function(x){couponleg(cs, x@curve)}))
+ pl.list <- unlist(lapply(portfolio, function(x){defaultleg(cs, x@curve, x@recovery)}))
+ return(list(cl = mean(cl.list), pl = mean(pl.list), bp = 1+mean(cl.list-pl.list)))
}
indexduration <- function(portfolio, index){
## compute the duration of a portfolio of survival curves
- durations <- sapply(sapply(portfolio, attr, "curve"), cdsduration, index$maturity)
+ durations <- unlist(lapply(portfolio, function(x){cdsduration(x@curve, index$maturity)}))
return( mean(durations) )
}
@@ -553,7 +563,7 @@ indexspread <- function(portfolio, index){ ## d[i] <- cdsduration(portfolio[[i]]@curve, index$maturity)
## S <- S + d[i] * cdsspread(portfolio[[i]]@curve, index$maturity, portfolio[[i]]@recovery)
## }
- S <- index$coupon-(indexpv(portfolio, index)-1)/indexduration(portfolio, index)
+ S <- index$coupon-(indexpv(portfolio, index)$bp-1)/indexduration(portfolio, index)
return(S)
}
@@ -580,11 +590,8 @@ portfoliospread <- function(portfolio, maturity){ }
portfolioduration <- function(portfolio, maturity){
- d <- rep(0, length(portfolio$SC))
- for(i in seq_along(portfolio$SC)){
- d[i] <- cdsduration(portfolio$SC[[i]]@curve, maturity) * portfolio$notional[i]
- }
- return(sum(d)/sum(portfolio$notional))
+ durations <- unlist(lapply(portfolio$SC, function(x){cdsduration(x@curve, maturity)}))
+ return( crossprod(durations, portfolio$notional)/sum(portfolio$notional) )
}
tweakcurves <- function(portfolio, index){
@@ -594,11 +601,8 @@ 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 <- lapply(portfolio, function(x, ...) {
- x@curve@hazardrates <- x@curve@hazardrates * (1+epsilon)
- return(x)})
cat("tweak = ", epsilon, "\n")
- return( portfolio.new )
+ return( tweakportfolio(portfolio, epsilon) )
}
survivalProbability1 <- function(startdate, date, survival.curve) {
@@ -653,7 +657,6 @@ SP <- function(sc){ return( cumprod(exp(-sc@hazardrates * dT)) )
}
-
SPmatrix <- function(portfolio, index){
## computes matrix of survival probability
## inputs:
|
