diff options
Diffstat (limited to 'zerocurve.pyx')
| -rw-r--r-- | zerocurve.pyx | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/zerocurve.pyx b/zerocurve.pyx index 93b505d..a5eb2d2 100644 --- a/zerocurve.pyx +++ b/zerocurve.pyx @@ -1,9 +1,10 @@ from cpython cimport datetime from libc.stdlib cimport malloc, free -from pyisda.zerocurve cimport JpmcdsBuildIRZeroCurve +from pyisda.zerocurve cimport JpmcdsBuildIRZeroCurve, JpmcdsZeroPrice from pyisda.yearfrac cimport dcc from pyisda.date cimport (JpmcdsStringToDateInterval, pydate_to_TDate, - JpmcdsDateIntervalToFreq, JpmcdsDateFwdThenAdjust) + JpmcdsDateIntervalToFreq, JpmcdsDateFwdThenAdjust, TDate_to_pydate, + JpmcdsDateFromBusDaysOffset) cdef int SUCCESS = 0 @@ -16,9 +17,9 @@ cpdef public enum BadDay: cdef class ZeroCurve: def __init__(self, date, str types, - list periods, double[:] rates, - str mm_dcc, str fixed_swap_period, str float_swap_period, - str fixed_swap_dcc, str float_swap_dcc, BadDay bad_day_conv): + list periods, double[:] rates, + str mm_dcc, str fixed_swap_period, str float_swap_period, + str fixed_swap_dcc, str float_swap_dcc, BadDay bad_day_conv): """ Initialize a zero coupon curve instruments need to be sorted by tenor @@ -31,13 +32,18 @@ cdef class ZeroCurve: TDate value_date = pydate_to_TDate(date) self._dates = <TDate*>malloc(len(periods) * sizeof(TDate)) - cdef TDateInterval tmp + self._ninstr = len(periods) + + cdef TDate settle_date + if JpmcdsDateFromBusDaysOffset(value_date, 2, "None", &settle_date)!= SUCCESS: + raise ValueError + cdef TDateInterval tmp for i, p in enumerate(periods): period_bytes = p.encode('utf-8') if JpmcdsStringToDateInterval(period_bytes, routine, &tmp) != SUCCESS: raise ValueError - if JpmcdsDateFwdThenAdjust(value_date, &tmp, NONE, + if JpmcdsDateFwdThenAdjust(settle_date, &tmp, NONE, "None", &self._dates[i]) != SUCCESS: raise ValueError('Invalid interval') @@ -57,8 +63,8 @@ cdef class ZeroCurve: self._thisptr = JpmcdsBuildIRZeroCurve( value_date, types_bytes, self._dates, &rates[0], len(periods), dcc(mm_dcc), <long> fixed_freq, - <long> float_freq, - dcc(fixed_swap_dcc), dcc(float_swap_dcc), bad_day_conv, b"None" + <long> float_freq, dcc(fixed_swap_dcc), dcc(float_swap_dcc), + bad_day_conv, b"None" ) def __dealloc__(self): @@ -72,3 +78,7 @@ cdef class ZeroCurve: raise ValueError('curve is empty') cdef TDate discount_date = pydate_to_TDate(date) return JpmcdsZeroPrice(self._thisptr, discount_date) + + def list_dates(self): + cdef size_t i + return [TDate_to_pydate(self._dates[i]) for i in range(self._ninstr)] |
