From 8966b9753f876250182ef75a8c4294d523f2126a Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Thu, 8 May 2014 13:40:58 -0400 Subject: implement skew mapping by doing tranche loss proportion mapping --- src/lossdistrib.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/lossdistrib.c b/src/lossdistrib.c index f12ab2f..e5f2c53 100644 --- a/src/lossdistrib.c +++ b/src/lossdistrib.c @@ -728,10 +728,10 @@ void lossdistrib_joint_Z(double *dp, int *ndp, double *w, free(qmat); } -void BClossdist(double *defaultprob, int *dim1, int *dim2, - double *issuerweights, double *recov, double *Z, double *w, - int *n, double *rho, int *N, int *defaultflag, - double *L, double *R) { +void BCloss_recov_dist(double *defaultprob, int *dim1, int *dim2, + double *issuerweights, double *recov, double *Z, double *w, + int *n, double *rho, int *N, int *defaultflag, + double *L, double *R) { /* computes the loss and recovery distribution over time with a flat gaussian correlation @@ -788,3 +788,54 @@ void BClossdist(double *defaultprob, int *dim1, int *dim2, free(Lw); free(Rw); } + + +void BCloss_dist(double *defaultprob, int *dim1, int *dim2, + double *issuerweights, double *recov, double *Z, double *w, + int *n, double *rho, int *N, int *defaultflag, + double *L) { + /* + computes the loss distribution over time with a flat gaussian + correlation + inputs: + defaultprob: matrix of size dim1 x dim2. dim1 is the number of issuers + and dim2 number of time steps + issuerweights: vector of issuer weights (length dim1) + recov: vector of recoveries (length dim1) + Z: vector of factor values (length n) + w: vector of factor weights (length n) + rho: correlation beta vector (length dim1) + N: number of ticks in the grid + defaultflag: if true, computes the default distribution + outputs: + L: matrix of size (N, dim2) + */ + int t, i, j; + double g; + double *gshocked, *Sshocked, *Lw; + int one = 1; + double alpha = 1; + double beta = 0; + + gshocked = malloc((*dim1) * (*n) * sizeof(double)); + Sshocked = malloc((*dim1) * (*n) * sizeof(double)); + Lw = malloc((*N) * (*n) * sizeof(double)); + + for(t=0; t < (*dim2); t++) { + memset(Lw, 0, (*N) * (*n) * sizeof(double)); + #pragma omp parallel for private(j, g) + for(i=0; i < *n; i++){ + for(j=0; j < (*dim1); j++){ + g = defaultprob[j + (*dim1) * t]; + gshocked[j+(*dim1)*i] = shockprob(g, rho[j], Z[i], 0); + Sshocked[j+(*dim1)*i] = shockseverity(1-recov[j], Z[i], rho[j], g); + } + lossdistrib_blas(gshocked + (*dim1) * i, dim1, issuerweights, Sshocked + (*dim1)*i, N, defaultflag, + Lw + i * (*N)); + } + dgemv_("n", N, n, &alpha, Lw, N, w, &one, &beta, L + t * (*N), &one); + } + free(gshocked); + free(Sshocked); + free(Lw); +} -- cgit v1.2.3-70-g09d2