summaryrefslogtreecommitdiffstats
path: root/cdsone.pyx
blob: cb567f6a3869c861988a97e0f8471462bad76305 (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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from pyisda.cdsone cimport (JpmcdsCdsoneUpfrontCharge,
                            JpmcdsCdsoneSpread, JpmcdsStringToStubMethod)
from pyisda.zerocurve cimport ZeroCurve
from pyisda.date cimport JpmcdsStringToDateInterval, pydate_to_TDate
from pyisda.yearfrac cimport dcc

cdef int SUCCESS = 0

def upfront_charge(date, value_date, benchmark_start_date, stepin_date,
                   start_date, end_date, double coupon_rate,
                   ZeroCurve zc,
                   double spread,
                   double recovery_rate,
                   TBoolean pay_accrued_at_start = True,
                   TBoolean pay_accrued_on_default = True):

    cdef:
       TDate today = pydate_to_TDate(date)
       TDate value_date_c = pydate_to_TDate(value_date)
       TDate benchmark_start_date_c = pydate_to_TDate(benchmark_start_date)
       TDate stepin_date_c = pydate_to_TDate(stepin_date)
       TDate start_date_c = pydate_to_TDate(start_date)
       TDate end_date_c = pydate_to_TDate(end_date)
       double result
       TStubMethod stub
       TDateInterval ivl
       char* routine = "upfront_charge"

    if JpmcdsStringToStubMethod(b"f/s", &stub) != SUCCESS:
        raise ValueError("can't convert stub")
    if JpmcdsStringToDateInterval(b"3M", routine, &ivl) != SUCCESS:
        raise ValueError("can't convert to date interval")
    if JpmcdsCdsoneUpfrontCharge(today, value_date_c, benchmark_start_date_c, stepin_date_c,
                                 start_date_c, end_date_c, coupon_rate, pay_accrued_on_default,
                                 &ivl, &stub,
                                 dcc("ACT/360"), b'F', b"None", zc._thisptr, spread, recovery_rate,
                                 pay_accrued_at_start, &result) == SUCCESS:
        return result
    else:
        raise ValueError("computation failed")

def spread_from_upfront(date, value_date, benchmark_start_date, stepin_date,
                        start_date, end_date, double coupon_rate,
                        ZeroCurve zc,
                        double upfront,
                        double recovery_rate,
                        TBoolean pay_accrued_at_start = True,
                        TBoolean pay_accrued_on_default = True):
    cdef:
       TDate today = pydate_to_TDate(date)
       TDate value_date_c = pydate_to_TDate(value_date)
       TDate benchmark_start_date_c = pydate_to_TDate(benchmark_start_date)
       TDate stepin_date_c = pydate_to_TDate(stepin_date)
       TDate start_date_c = pydate_to_TDate(start_date)
       TDate end_date_c = pydate_to_TDate(end_date)
       double result
       TStubMethod stub
       TDateInterval ivl
       char* routine = "upfront_charge"

    if JpmcdsStringToStubMethod(b"f/s", &stub) != SUCCESS:
        raise ValueError("can't convert stub")
    if JpmcdsStringToDateInterval(b"3M", routine, &ivl) != SUCCESS:
        raise ValueError("can't convert to date interval")
    if JpmcdsCdsoneSpread(today, value_date_c, benchmark_start_date_c, stepin_date_c,
                          start_date_c, end_date_c, coupon_rate, pay_accrued_on_default,
                          &ivl, &stub,
                          dcc("ACT/360"), b'F', b"None", zc._thisptr, upfront, recovery_rate,
                          pay_accrued_at_start, &result) == SUCCESS:
        return result
    else:
        raise ValueError("computation failed")