From 2f7102e723dde762f9962f78c5f4fadb81b4d8ef Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Wed, 31 May 2023 10:20:13 -0400 Subject: speed up discount_factor --- pyisda/curve.pyx | 24 ++++++++++++++---------- 1 file 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(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)) -- cgit v1.2.3-70-g09d2