diff options
| -rw-r--r-- | pyisda/curve.pyx | 24 |
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)) |
