summaryrefslogtreecommitdiffstats
path: root/c_layer/cdsbootstrap.c
blob: b0aa0048c32c37dcbe38fbea97d565dc88031c46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "cdsbootstrap.h"

int cdsBootstrapPointFunction
(double   hazardRate,
 void    *data,
 double  *pv)
{
    int         status    = FAILURE;

    cds_bootstrap_ctx *context = (cds_bootstrap_ctx*)data;

    TCurve         *discountCurve = context->discountCurve;
    TCurve         *cdsCurve      = context->cdsCurve;
    TDate           cdsBaseDate   = cdsCurve->fBaseDate;
    TDate           stepinDate    = context->stepinDate;
    TDate           cashSettleDate = context->cashSettleDate;

    double          pvC; /* PV of contingent leg */
    double          pvF; /* PV of fee leg */
    cdsCurve->fArray[0].fRate = hazardRate;

    if (JpmcdsContingentLegPV (context->cl,
                               cdsBaseDate,
                               cashSettleDate,
                               stepinDate,
                               discountCurve,
                               cdsCurve,
                               context->recoveryRate,
                               &pvC) != SUCCESS)
        goto done;

    if (JpmcdsFeeLegPV(context->fl,
                       cdsBaseDate,
                       stepinDate,
                       cashSettleDate,
                       discountCurve,
                       cdsCurve,
                       1,
                       &pvF) != SUCCESS)
        goto done;
    /* Note: price is discounted to cdsBaseDate */
    *pv = pvC - context->spread * pvF;
    status = SUCCESS;

 done:

    if (status != SUCCESS)
        printf("Something went wrong: %f\n", hazardRate);
    return status;
}