diff options
| -rw-r--r-- | pyisda/curve.pxd | 2 | ||||
| -rw-r--r-- | pyisda/curve.pyx | 68 |
2 files changed, 43 insertions, 27 deletions
diff --git a/pyisda/curve.pxd b/pyisda/curve.pxd index b30ffe1..2e5e999 100644 --- a/pyisda/curve.pxd +++ b/pyisda/curve.pxd @@ -122,6 +122,6 @@ cdef class BasketIndex: cdef TContingentLeg* _contingent_leg cdef TFeeLeg* _fee_leg cdef double* _T - cdef double[:,::1] _rate + cdef double[:,::1] _hazard_rates cdef fArray_to_list(TRatePt* fArray, int fNumItems) diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index 1afb9f9..cd38398 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -7,10 +7,11 @@ from date cimport (JpmcdsStringToDateInterval, pydate_to_TDate, dcc, from date import dcc_tostring from cdsone cimport JpmcdsStringToStubMethod, TStubMethod from legs cimport (JpmcdsCdsContingentLegMake, JpmcdsCdsFeeLegMake, - JpmcdsContingentLegPV, JpmcdsFeeLegPV) + JpmcdsContingentLegPV, JpmcdsFeeLegPV, FeeLegAI, JpmcdsFeeLegFree) cimport cython cimport numpy as np +import numpy as np np.import_array() cdef extern from "numpy/arrayobject.h": @@ -454,11 +455,12 @@ cdef class BasketIndex: cdef TDate end_date_c = pydate_to_TDate(end_date) self._sc = JpmcdsNewTCurve(base_date_c, n_dates, 5000., 2L) cdef TDate date + self._T = <double*>malloc(sizeof(double)*n_dates) for i, d in enumerate(end_dates): date = pydate_to_TDate(d) self._T[i] = (date - base_date_c) / 365. - self._thisptr.fArray[i].fDate = date - self._hazard_rates[:] = hazard_rates + self._sc.fArray[i].fDate = date + self._hazard_rates = hazard_rates self._contingent_leg = JpmcdsCdsContingentLegMake(start_date_c, end_date_c, 1., @@ -473,33 +475,47 @@ cdef class BasketIndex: NULL, &stub_type, 1., - 0.01, + 1.0, 3, #ACT_360 MODIFIED, b'NONE', True) + def __dealloc__(self): + if self._T is not NULL: + free(self._T) + JpmcdsFreeTCurve(self._sc) + if self._contingent_leg is not NULL: + free(self._contingent_leg) + JpmcdsFeeLegFree(self._fee_leg) + @cython.initializedcheck(False) + @cython.boundscheck(False) def pv(self, step_in_date, value_date, YieldCurve yc, double recovery_rate): - cdef step_in_date_c = pydate_to_TDate(step_in_date) - cdef value_date_c = pydate_to_TDate(value_date) - cdef size_t n = self._hazard_rates.shape[0] - cdef double cl_pv, fl_pv + cdef TDate step_in_date_c = pydate_to_TDate(step_in_date) + cdef TDate value_date_c = pydate_to_TDate(value_date) + cdef np.npy_intp n = self._hazard_rates.shape[0] + cdef double accrued + FeeLegAI(self._fee_leg, self._sc.fBaseDate, &accrued) + cdef size_t i, j + cdef np.ndarray[np.float64_t,ndim=1] cl_pv = np.PyArray_EMPTY(1, &n, np.NPY_DOUBLE, 0) + cdef np.ndarray[np.float64_t,ndim=1] fl_pv = np.PyArray_EMPTY(1, &n, np.NPY_DOUBLE, 0) for i in range(n): - for j in range(self._thisptr.fNumItems): - self._thisptr.fArray[j].fRate = self._rate[i][j] - JpmcdsContingentLegPV(self._contingent_leg, - self._sc.fBaseDate, - value_date_c, - step_in_date_c, - yc._thisptr, - self._sc, - recovery_rate, - &cl_pv) - JpmcdsFeeLegPV(self._fee_leg, - self._sc.fBaseDate, - step_in_date_c, - value_date_c, - yc._thisptr, - self._sc, - True, - &fl_pv) + for j in range(self._sc.fNumItems): + self._sc.fArray[j].fRate = self._hazard_rates[i,j] + JpmcdsContingentLegPV(self._contingent_leg, + self._sc.fBaseDate, + value_date_c, + step_in_date_c, + yc._thisptr, + self._sc, + recovery_rate, + &cl_pv[i]) + JpmcdsFeeLegPV(self._fee_leg, + self._sc.fBaseDate, + step_in_date_c, + value_date_c, + yc._thisptr, + self._sc, + True, + &fl_pv[i]) + return (fl_pv-accrued, cl_pv) |
