summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyisda/curve.pyx24
1 files changed, 14 insertions, 10 deletions
diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx
index 9df876b..8877877 100644
--- a/pyisda/curve.pyx
+++ b/pyisda/curve.pyx
@@ -506,12 +506,16 @@ cdef class YieldCurve(Curve):
yc.buf.reset(<char*>c2, char_free)
return yc
+ @cython.cdivision(True)
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
def discount_factor(self, d2, d1=None):
""" computes the discount factor at a given date.
Parameters
----------
d2 : either a :class:`datetime.date` or a list of :class:`datetime.date`, or a pandas Series of Timestamp.
+ d1 : start date. If None use curve base_date
Returns
-------
@@ -519,28 +523,28 @@ cdef class YieldCurve(Curve):
"""
cdef:
const TCurve* curve = self.get_TCurve()
- np.ndarray r
+ np.ndarray[np.float64_t, ndim=1] r
c_datetime.date d
size_t i
- long[::1] np_dates
+ TDate[::1] np_dates
+ TDate date_c
+ int scale = 1000000000 * 86400
if d1 is None:
if isinstance(d2, np.ndarray):
r = np.zeros_like(d2)
for i, d in enumerate(d2):
- r[i] = JpmcdsForwardZeroPrice(curve, curve.fBaseDate,
- pydate_to_TDate(d))
+ r[i] = JpmcdsZeroPrice(curve, pydate_to_TDate(d))
return r
elif isinstance(d2, pd.Series):
np_dates = d2.values.view("int")
- r = np.zeros(np_dates.size)
- for i in range(r.size):
- r[i] = JpmcdsForwardZeroPrice(curve, curve.fBaseDate,
- np_dates[i] // (1_000_000_000 * 86400) + 134774)
+ r = np.zeros(np_dates.shape[0], dtype=np.float64)
+ for i in range(r.shape[0]):
+ date_c = np_dates[i] / scale + 134774
+ r[i] = JpmcdsZeroPrice(curve, date_c)
return r
else:
- return JpmcdsForwardZeroPrice(curve, curve.fBaseDate,
- pydate_to_TDate(d2))
+ return JpmcdsZeroPrice(curve, pydate_to_TDate(d2))
else:
return JpmcdsForwardZeroPrice(curve, pydate_to_TDate(d1),
pydate_to_TDate(d2))