diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2023-01-25 23:32:42 -0500 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2023-01-25 23:32:42 -0500 |
| commit | 91f3637b0ca5c543fe288dfd9c1d7312dcafeda9 (patch) | |
| tree | 281f5ee5f751d12ea3b3269043b1633b38ffc6a3 | |
| parent | 4c9228b51dbf06e2f932368400f6a34fea324f31 (diff) | |
| download | pyisda-91f3637b0ca5c543fe288dfd9c1d7312dcafeda9.tar.gz | |
bring back par_spread method
| -rw-r--r-- | pyisda/curve.pyx | 100 |
1 files changed, 50 insertions, 50 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 = <TDate*>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 + @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 = <TDate*>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 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 = <double*>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 + cdef int result + with nogil: + par_spreads = <double*>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): |
