summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@serenitascapital.com>2016-06-30 10:37:11 -0400
committerGuillaume Horel <guillaume.horel@serenitascapital.com>2016-06-30 10:39:46 -0400
commit6b0a14370d244d4ff3b6277c49a23b04b8957678 (patch)
tree53cf3a2a557e7d746c2d5a6e89c241c631e4dcad
parent41fad2c2e88ef770b22c62c916cf6c5c68268836 (diff)
downloadpyisda-6b0a14370d244d4ff3b6277c49a23b04b8957678.tar.gz
fix some maturities, still not matching :(
-rw-r--r--date.pxd15
-rw-r--r--date.pyx5
-rw-r--r--zerocurve.pxd18
-rw-r--r--zerocurve.pyx28
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 = <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)]