summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyisda/curve.pxd2
-rw-r--r--pyisda/curve.pyx68
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)