diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2023-05-31 11:07:14 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2023-05-31 11:07:14 -0400 |
| commit | 6f3011991ab3ada600e0504162b33a1bdb3058a4 (patch) | |
| tree | 6ef8db2036ee8757a623164c6a18d4703241359d | |
| parent | 938c1fde77d4a0b7c54e0207b919f8d936e451c1 (diff) | |
| download | pyisda-6f3011991ab3ada600e0504162b33a1bdb3058a4.tar.gz | |
speed up expected_forward_curve
| -rw-r--r-- | pyisda/curve.pyx | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index 3f2fda5..1f5076d 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -566,29 +566,35 @@ cdef class YieldCurve(Curve): """ return [TDate_to_pydate(self.get_TCurve().fArray[i].fDate) for i in range(self.get_TCurve().fNumItems)] + @cython.cdivision(True) def expected_forward_curve(self, forward_date): """ returns the expected forward curve """ - cdef TDate forward_date_c = pydate_to_TDate(forward_date) - cdef YieldCurve yc = YieldCurve.__new__(YieldCurve) - cdef const TCurve* curve = self.get_TCurve() - cdef size_t i = 0 - cdef int n = curve.fNumItems + cdef: + TDate forward_date_c = pydate_to_TDate(forward_date) + YieldCurve yc = YieldCurve.__new__(YieldCurve) + const TCurve* curve = self.get_TCurve() + size_t i = 0 + int n = curve.fNumItems + double r0 + int t1, t0 + TCurve* forward_curve + TRatePt* arr + while curve.fArray[i].fDate < forward_date_c: i += 1 yc.buf_size = sizeof(TCurve) + (n - i) * sizeof(TRatePt) - cdef TCurve* forward_curve = <TCurve*>malloc(yc.buf_size) + forward_curve = <TCurve*>malloc(yc.buf_size) forward_curve.fNumItems = n - i forward_curve.fDayCountConv = curve.fDayCountConv forward_curve.fBaseDate = forward_date_c - forward_curve.fBasis = 1.0 - cdef double df - cdef TRatePt* arr = forward_curve.fArray + forward_curve.fBasis = <double>Basis.CONTINUOUS + arr = forward_curve.fArray + r0 = JpmcdsZeroRate(curve, forward_date_c) + t0 = forward_date_c - curve.fBaseDate while i < n: arr.fDate = curve.fArray[i].fDate - df = JpmcdsForwardZeroPrice(curve, forward_date_c, arr.fDate) - JpmcdsDiscountToRateYearFrac( - df, <double>(arr.fDate - forward_date_c)/365., - <double>1, &arr.fRate) + t1 = arr.fDate - curve.fBaseDate + arr.fRate = (t1 * curve.fArray[i].fRate - t0 * r0) / (t1 - t0) i += 1 preinc(arr) yc.buf.reset(<char*>forward_curve, char_free) |
