diff options
| author | Guillaume Horel <guillaume.horel@serenitascapital.com> | 2016-06-30 10:37:11 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@serenitascapital.com> | 2016-06-30 10:39:46 -0400 |
| commit | 6b0a14370d244d4ff3b6277c49a23b04b8957678 (patch) | |
| tree | 53cf3a2a557e7d746c2d5a6e89c241c631e4dcad | |
| parent | 41fad2c2e88ef770b22c62c916cf6c5c68268836 (diff) | |
| download | pyisda-6b0a14370d244d4ff3b6277c49a23b04b8957678.tar.gz | |
fix some maturities, still not matching :(
| -rw-r--r-- | date.pxd | 15 | ||||
| -rw-r--r-- | date.pyx | 5 | ||||
| -rw-r--r-- | zerocurve.pxd | 18 | ||||
| -rw-r--r-- | zerocurve.pyx | 28 |
4 files changed, 52 insertions, 14 deletions
@@ -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) @@ -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 = <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)] |
