summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2023-05-31 11:07:14 -0400
committerGuillaume Horel <guillaume.horel@gmail.com>2023-05-31 11:07:14 -0400
commit6f3011991ab3ada600e0504162b33a1bdb3058a4 (patch)
tree6ef8db2036ee8757a623164c6a18d4703241359d
parent938c1fde77d4a0b7c54e0207b919f8d936e451c1 (diff)
downloadpyisda-6f3011991ab3ada600e0504162b33a1bdb3058a4.tar.gz
speed up expected_forward_curve
-rw-r--r--pyisda/curve.pyx32
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)