summaryrefslogtreecommitdiffstats
path: root/zerocurve.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'zerocurve.pyx')
-rw-r--r--zerocurve.pyx28
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)]