summaryrefslogtreecommitdiffstats
path: root/zerocurve.pyx
blob: 2918baec5436961bf3c24b5bd85e5df7453f079d (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
from cpython cimport datetime
from libc.stdlib cimport malloc, free
from pyisda.zerocurve cimport JpmcdsBuildIRZeroCurve
from pyisda.yearfrac cimport dcc
from pyisda.convert cimport JpmcdsStringToDateInterval, JpmcdsDateIntervalToFreq, JpmcdsDate

cdef int SUCCESS = 0

cdef class Tcurve:
    cdef TCurve* _thisptr
    cdef TDate* _dates

    def __cinit__(self, date, str types,
                  list dates, double[:] rates,
                  str mm_dcc, str fixed_swap_period, str float_swap_period,
                  str fixed_swap_dcc, str float_swap_dcc, char bad_day_conv,
                  char* holidayFile):

        cdef:
           double fixed_freq
           double float_freq
           TDateInterval ivl
           char* routine = 'zerocurve'
           TDate value_date

        if isinstance(date, datetime.date):
            value_date = JpmcdsDate(date.year, date.month, date.day)
        else:
            raise ValueError

        cdef TDate* _dates = <TDate*>malloc(len(dates) * sizeof(TDate))

        for i, d in enumerate(date):
            _dates[i] = JpmcdsDate(d.year, d.month, d.day)

        fixed_bytes = fixed_swap_period.encode('utf-8')
        float_bytes = float_swap_period.encode('utf-8')
        types_bytes = types.encode('utf-8')

        if JpmcdsStringToDateInterval(fixed_bytes, routine, &ivl) != SUCCESS:
            raise ValueError
        if JpmcdsDateIntervalToFreq(&ivl, &fixed_freq) != SUCCESS:
            raise ValueError
        if JpmcdsStringToDateInterval(float_bytes, routine, &ivl) != SUCCESS:
            raise ValueError
        if JpmcdsDateIntervalToFreq(&ivl, &float_freq) != SUCCESS:
            raise ValueError
        self._thisptr = JpmcdsBuildIRZeroCurve(
            value_date, types_bytes, _dates,
            &rates[0], len(dates), dcc(mm_dcc), <long> fixed_freq,
            <long> float_freq,
            dcc(fixed_swap_dcc), dcc(fixed_swap_dcc), <long>bad_day_conv, "None"
        )

    def __dealloc__(self):
        if self._thisptr is not NULL:
            JpmcdsFreeTCurve(self._thisptr)
        if self._dates is not NULL:
            free(self._dates)

    def discount_factor(self, date):
        cdef TDate discount_date
        if isinstance(date, datetime.date):
            discount_date = JpmcdsDate(date.year, date.month, date.day)
        else:
            raise ValueError

        return JpmcdsZeroPrice(self._thisptr, discount_date)