From 91f3637b0ca5c543fe288dfd9c1d7312dcafeda9 Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Wed, 25 Jan 2023 23:32:42 -0500 Subject: bring back par_spread method --- pyisda/curve.pyx | 104 +++++++++++++++++++++++++++---------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index a3821c2..924eeb8 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -950,58 +950,58 @@ cdef class SpreadCurve(Curve): # tweak_curve(curve_orig, curve_tweaked, epsilon, mask) # return sc -# @cython.boundscheck(False) -# def par_spread(self, today, step_in_date, start_date, end_dates, -# const double[:] recovery_rates, YieldCurve yc not None, -# bint pay_accrued_on_default=True): -# """ -# Parameters -# ---------- -# recovery_rates : should be same length as end_dates -# """ -# cdef TDate today_c = pydate_to_TDate(today) -# cdef TDate step_in_date_c = pydate_to_TDate(step_in_date) -# cdef TDate start_date_c = pydate_to_TDate(start_date) -# cdef int n_dates = len(end_dates) -# cdef TDate* end_dates_c = malloc(n_dates * sizeof(TDate)) -# cdef size_t i -# for i, d in enumerate(end_dates): -# end_dates_c[i] = pydate_to_TDate(d) -# cdef double* par_spreads - -# cdef TStubMethod stub_type -# if JpmcdsStringToStubMethod(b"f/s", &stub_type) != 0: -# free(end_dates_c) -# raise ValueError("can't convert stub") - -# cdef int result -# with nogil: -# par_spreads = malloc(n_dates * sizeof(double)) -# result = JpmcdsCdsParSpreads(today_c, -# step_in_date_c, -# start_date_c, -# n_dates, -# end_dates_c, -# pay_accrued_on_default, -# NULL, -# &stub_type, -# ACT_360, -# MODIFIED, -# b'NONE', -# get_TCurve(yc), -# get_TCurve(self), -# &recovery_rates[0], -# par_spreads) -# free(end_dates_c) -# cdef list r = [] -# if result != SUCCESS: -# free(par_spreads) -# raise ValueError("can't compute par spread") -# else: -# for i in range(n_dates): -# r.append(par_spreads[i]) -# free(par_spreads) -# return r + @cython.boundscheck(False) + def par_spread(self, today, step_in_date, start_date, end_dates, + const double[:] recovery_rates, YieldCurve yc not None, + bint pay_accrued_on_default=True): + """ + Parameters + ---------- + recovery_rates : should be same length as end_dates + """ + cdef TDate today_c = pydate_to_TDate(today) + cdef TDate step_in_date_c = pydate_to_TDate(step_in_date) + cdef TDate start_date_c = pydate_to_TDate(start_date) + cdef int n_dates = len(end_dates) + cdef TDate* end_dates_c = malloc(n_dates * sizeof(TDate)) + cdef size_t i + for i, d in enumerate(end_dates): + end_dates_c[i] = pydate_to_TDate(d) + cdef double* par_spreads + + cdef TStubMethod stub_type + if JpmcdsStringToStubMethod(b"f/s", &stub_type) != 0: + free(end_dates_c) + raise ValueError("can't convert stub") + + cdef int result + with nogil: + par_spreads = malloc(n_dates * sizeof(double)) + result = JpmcdsCdsParSpreads(today_c, + step_in_date_c, + start_date_c, + n_dates, + end_dates_c, + pay_accrued_on_default, + NULL, + &stub_type, + ACT_360, + MODIFIED, + b'NONE', + yc.get_TCurve(), + self.get_TCurve(), + &recovery_rates[0], + par_spreads) + free(end_dates_c) + cdef list r = [] + if result != SUCCESS: + free(par_spreads) + raise ValueError("can't compute par spread") + else: + for i in range(n_dates): + r.append(par_spreads[i]) + free(par_spreads) + return r @property def recovery_rates(self): -- cgit v1.2.3-70-g09d2