diff options
| -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) |
