From 6b0a14370d244d4ff3b6277c49a23b04b8957678 Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Thu, 30 Jun 2016 10:37:11 -0400 Subject: fix some maturities, still not matching :( --- zerocurve.pyx | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'zerocurve.pyx') 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 = 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), fixed_freq, - float_freq, - dcc(fixed_swap_dcc), dcc(float_swap_dcc), bad_day_conv, b"None" + 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)] -- cgit v1.2.3-70-g09d2