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 :( --- date.pxd | 15 +++++++++++++++ date.pyx | 5 +++++ zerocurve.pxd | 18 +++++++++++++----- zerocurve.pyx | 28 +++++++++++++++++++--------- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/date.pxd b/date.pxd index 24af83f..16b2261 100644 --- a/date.pxd +++ b/date.pxd @@ -2,6 +2,12 @@ cdef extern from "isda/cdate.h": ctypedef struct TDateInterval: pass +cdef extern from "isda/mdydate.h": + ctypedef struct TMonthDayYear: + long month + long day + long year + ctypedef long TDate cdef extern from "isda/convert.h": @@ -14,9 +20,18 @@ cdef extern from "isda/date_sup.h": cdef extern from "isda/dateconv.h": TDate JpmcdsDate(long year, long month, long day) + int JpmcdsDateToMDY(TDate date, TMonthDayYear *mdyDate) cdef extern from "isda/ldate.h": int JpmcdsDateFwdThenAdjust(TDate date, TDateInterval* interval, long badDayMethod, char* holidayFile, TDate *advAdjustedDate) + +cdef extern from "isda/busday.h": + int JpmcdsDateFromBusDaysOffset(TDate fromDate, # (I) input date + long offset, # (I) number of business days + char *holidayFile, # (I) holiday file specification + TDate *result); cdef TDate pydate_to_TDate(d) + +cpdef object TDate_to_pydate(TDate d) diff --git a/date.pyx b/date.pyx index 2852f1b..8df0df8 100644 --- a/date.pyx +++ b/date.pyx @@ -4,3 +4,8 @@ from date cimport JpmcdsDate cdef TDate pydate_to_TDate(d): assert isinstance(d, datetime.date) return JpmcdsDate(d.year, d.month, d.day) + +cpdef object TDate_to_pydate(TDate d): + cdef TMonthDayYear date + if JpmcdsDateToMDY(d, &date) == 0: + return datetime.date(date.year, date.month, date.day) diff --git a/zerocurve.pxd b/zerocurve.pxd index c2c2359..d652ca0 100644 --- a/zerocurve.pxd +++ b/zerocurve.pxd @@ -8,11 +8,18 @@ cdef extern from "isda/zerocurve.h": ctypedef struct TDateInterval: pass - TCurve* JpmcdsBuildIRZeroCurve(TDate valueDate, char* instrNames, - TDate* dates, double* rates, long nInstr, - long mmDCC, long fixedSwapFreq, long floatSwapFreq, - long fixedSwapDCC, long floatSwapDCC, - long badDayConv, char* holidayFile) + TCurve* JpmcdsBuildIRZeroCurve(TDate valueDate, + char* instrNames, + TDate* dates, + double* rates, + long nInstr, + long mmDCC, + long fixedSwapFreq, + long floatSwapFreq, + long fixedSwapDCC, + long floatSwapDCC, + long badDayConv, + char* holidayFile) cdef extern from "isda/tcurve.h": void JpmcdsFreeTCurve(TCurve* curve) @@ -23,3 +30,4 @@ cdef extern from "isda/cxzerocurve.h": cdef class ZeroCurve: cdef TCurve* _thisptr cdef TDate* _dates + cdef size_t _ninstr 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