diff options
| -rw-r--r-- | c_layer/cdsbootstrap.c | 2 | ||||
| -rw-r--r-- | c_layer/cdsbootstrap.h | 2 | ||||
| -rw-r--r-- | pyisda/cdsone.pyx | 4 | ||||
| -rw-r--r-- | pyisda/credit_index.pyx | 22 | ||||
| -rw-r--r-- | pyisda/curve.pyx | 25 | ||||
| -rw-r--r-- | pyisda/legs.pyx | 4 | ||||
| -rw-r--r-- | pyisda/optim.pyx | 4 |
7 files changed, 33 insertions, 30 deletions
diff --git a/c_layer/cdsbootstrap.c b/c_layer/cdsbootstrap.c index bbecc08..a1b65ca 100644 --- a/c_layer/cdsbootstrap.c +++ b/c_layer/cdsbootstrap.c @@ -9,7 +9,7 @@ int cdsBootstrapPointFunction cds_bootstrap_ctx *context = (cds_bootstrap_ctx*)data; - TCurve *discountCurve = context->discountCurve; + const TCurve *discountCurve = context->discountCurve; TCurve *cdsCurve = context->cdsCurve; TDate cdsBaseDate = cdsCurve->fBaseDate; TDate stepinDate = context->stepinDate; diff --git a/c_layer/cdsbootstrap.h b/c_layer/cdsbootstrap.h index 42d298c..e49808d 100644 --- a/c_layer/cdsbootstrap.h +++ b/c_layer/cdsbootstrap.h @@ -16,7 +16,7 @@ typedef struct { TDate stepinDate; TDate cashSettleDate; - TCurve *discountCurve; + const TCurve *discountCurve; TCurve *cdsCurve; double recoveryRate; double spread; diff --git a/pyisda/cdsone.pyx b/pyisda/cdsone.pyx index 5dd8040..ab567db 100644 --- a/pyisda/cdsone.pyx +++ b/pyisda/cdsone.pyx @@ -60,7 +60,7 @@ def upfront_charge(date, value_date, benchmark_start_date, stepin_date, if JpmcdsCdsoneUpfrontCharge(today, value_date_c, benchmark_start_date_c, stepin_date_c, start_date_c, end_date_c, coupon_rate, pay_accrued_on_default, &ivl, &stub, dcc("ACT/360"), b'F', b"None", - yc._thisptr.get(), spread, recovery_rate, + yc.get_TCurve(), spread, recovery_rate, pay_accrued_at_start, &result) == SUCCESS: return result else: @@ -121,7 +121,7 @@ def spread_from_upfront(date, value_date, benchmark_start_date, stepin_date, if JpmcdsCdsoneSpread(today, value_date_c, benchmark_start_date_c, stepin_date_c, start_date_c, end_date_c, coupon_rate, pay_accrued_on_default, &ivl, &stub, dcc("ACT/360"), b'F', b"None", - yc._thisptr.get(), upfront, recovery_rate, + yc.get_TCurve(), upfront, recovery_rate, pay_accrued_at_start, &result) == SUCCESS: return result else: diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx index b7ab396..0096bc5 100644 --- a/pyisda/credit_index.pyx +++ b/pyisda/credit_index.pyx @@ -361,7 +361,7 @@ cdef class CreditIndex(CurveList): sc.fBaseDate, cash_settle_date_c, step_in_date_c, - get_TCurve(yc), + yc.get_TCurve(), sc, recovery_rate, &cl_pv[i,j]) @@ -369,7 +369,7 @@ cdef class CreditIndex(CurveList): sc.fBaseDate, step_in_date_c, cash_settle_date_c, - get_TCurve(yc), + yc.get_TCurve(), sc, True, &fl_pv[i,j]) @@ -411,7 +411,7 @@ cdef class CreditIndex(CurveList): raise ValueError("maturity is not correct") with nogil: r = pv(self._curves, self.base_date, step_in_date_c, cash_settle_date_c, - get_TCurve(yc), legs, self.recovery_rates, fixed_rate, + yc.get_TCurve(), legs, self.recovery_rates, fixed_rate, self._weights, epsilon, mask) if i == -1: free(legs.first) @@ -451,7 +451,7 @@ cdef class CreditIndex(CurveList): legs.first = self.contingent_legs[i] legs.second = self.fee_legs[i] old_pv = pv(self._curves, self.base_date, step_in_date_c, - cash_settle_date_c, get_TCurve(yc), legs, + cash_settle_date_c, yc.get_TCurve(), legs, self.recovery_rates, fixed_rate, self._weights, 0., 0) if i == -1: @@ -468,7 +468,7 @@ cdef class CreditIndex(CurveList): cdef r = old_pv - pv(self._curves, self.base_date, step_in_date_c, cash_settle_date_c, - get_TCurve(yc), legs, self.recovery_rates, fixed_rate, + yc.get_TCurve(), legs, self.recovery_rates, fixed_rate, self._weights, 0., 0) + carry if i == -1: free(legs.first) @@ -503,7 +503,7 @@ cdef class CreditIndex(CurveList): self.base_date, cash_settle_date_c, step_in_date_c, - yc._thisptr.get(), + yc.get_TCurve(), sc, deref(recovery_rate), &cl_pv) @@ -549,8 +549,8 @@ cdef class CreditIndex(CurveList): self.base_date, step_in_date_c, cash_settle_date_c, - yc._thisptr.get(), - sc.get(), + yc.get_TCurve(), + <TCurve*>sc.get(), True, &fl_pv) r += self._weights[i] * fl_pv @@ -744,9 +744,9 @@ cdef class CreditIndex(CurveList): ACT_360, MODIFIED, b'NONE', - get_TCurve(yc), - sc.get(), - self.recovery_rates[j].get(), + yc.get_TCurve(), + sc, + self.recovery_rates[j], spreads) if first_time: diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index e805e86..f82f6b7 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -63,6 +63,9 @@ cdef double survival_prob(const TCurve* curve, TDate start_date, TDate maturity_ cdef class Curve(object): + cdef inline const TCurve* get_TCurve(self) nogil: + return <TCurve*>self.buf.get() + def __getstate__(self): cdef: size_t curve_size = self.size() @@ -116,7 +119,7 @@ cdef class Curve(object): dict contains `base_date`, `basis`, `day_count_counvention` and `data` """ - cdef const TCurve* curve = get_TCurve(self) + cdef const TCurve* curve = self.get_TCurve() return {'base_date': self.base_date, 'basis': curve.fBasis, 'day_count_convention': dcc_tostring(curve.fDayCountConv), @@ -125,7 +128,7 @@ cdef class Curve(object): @cython.boundscheck(False) @cython.cdivision(True) def to_series(self, bint forward=True): - cdef const TCurve* curve = get_TCurve(self) + cdef const TCurve* curve = self.get_TCurve() cdef np.npy_intp n = curve.fNumItems cdef np.ndarray[np.float64_t,ndim=1] h = np.PyArray_EMPTY(1, &n, np.NPY_DOUBLE, 0) cdef np.ndarray[np.int64_t,ndim=1] d = np.PyArray_EMPTY(1, &n, np.NPY_INT64, 0) @@ -176,7 +179,7 @@ cdef class Curve(object): @cython.cdivision(True) def forward_hazard_rates(self): cdef double t1, h1, t2, h2 - cdef const TCurve* curve = get_TCurve(self) + cdef const TCurve* curve = self.get_TCurve() cdef np.npy_intp shape = curve.fNumItems t1 = 0 h1 = 0 @@ -207,11 +210,11 @@ cdef class Curve(object): @property def base_date(self): - return TDate_to_pydate(get_TCurve(self).fBaseDate) + return TDate_to_pydate(self.get_TCurve().fBaseDate) @property def basis(self): - return <Basis>get_TCurve(self).fBasis + return <Basis>self.get_TCurve().fBasis def __forward_zero_price(self, d2, d1=None): """ computes the forward zero price at a given date. @@ -225,7 +228,7 @@ cdef class Curve(object): float """ cdef: - const TCurve* curve = get_TCurve(self) + const TCurve* curve = self.get_TCurve() np.ndarray r c_datetime.date d size_t i @@ -246,7 +249,7 @@ cdef class Curve(object): def zero_rate(self, d): cdef: - const TCurve* curve = get_TCurve(self) + const TCurve* curve = self.get_TCurve() return JpmcdsZeroRate(curve, pydate_to_TDate(d)) cdef fArray_to_list(TRatePt* fArray, int fNumItems): @@ -526,7 +529,7 @@ cdef class YieldCurve(Curve): float, or numpy array. """ cdef: - const TCurve* curve = get_TCurve(self) + const TCurve* curve = self.get_TCurve() np.ndarray r c_datetime.date d size_t i @@ -664,7 +667,7 @@ cdef class SpreadCurve(Curve): cdef size_t i cdef bint freeup = False - if cash_settle_date_c < get_TCurve(yc).fBaseDate: + if cash_settle_date_c < yc.get_TCurve().fBaseDate: raise ValueError("cash_settle_date: {0} is anterior to yc's base_date: {1}". format(cash_settle_date, yc.base_date)) if defaulted is None: @@ -708,7 +711,7 @@ cdef class SpreadCurve(Curve): stub_type.longStub = False if self.defaulted == -1: curve = JpmcdsCleanSpreadCurve(today_c, - get_TCurve(yc), + yc.get_TCurve(), start_date_c, step_in_date_c, cash_settle_date_c, @@ -773,7 +776,7 @@ cdef class SpreadCurve(Curve): float """ cdef: - const TCurve* curve = get_TCurve(self) + const TCurve* curve = self.get_TCurve() np.ndarray r c_datetime.date d size_t i diff --git a/pyisda/legs.pyx b/pyisda/legs.pyx index a04486c..12c8bff 100644 --- a/pyisda/legs.pyx +++ b/pyisda/legs.pyx @@ -70,7 +70,7 @@ cdef class ContingentLeg: cdef TDate value_date_c = pydate_to_TDate(value_date) cdef double pv if JpmcdsContingentLegPV(self._thisptr, today_c, value_date_c, step_in_date_c, - yc._thisptr.get(), sc._thisptr.get(), + yc.get_TCurve(), sc.get_TCurve(), recovery_rate, &pv) == 0: return pv else: @@ -188,7 +188,7 @@ cdef class FeeLeg: cdef TDate value_date_c = pydate_to_TDate(value_date) cdef double pv if JpmcdsFeeLegPV(self._thisptr, today_c, step_in_date_c, value_date_c, - yc._thisptr.get(), sc._thisptr.get(), pay_accrued_at_start, &pv) == 0: + yc.get_TCurve(), sc.get_TCurve(), pay_accrued_at_start, &pv) == 0: return pv else: raise ValueError diff --git a/pyisda/optim.pyx b/pyisda/optim.pyx index 38867be..ee75f87 100644 --- a/pyisda/optim.pyx +++ b/pyisda/optim.pyx @@ -16,7 +16,7 @@ cdef extern from "cdsbootstrap.h" nogil: ctypedef struct cds_bootstrap_ctx: TDate stepinDate TDate cashSettleDate - TCurve *discountCurve + const TCurve *discountCurve TCurve *cdsCurve; double recoveryRate double spread @@ -93,7 +93,7 @@ def init_context(YieldCurve yc not None, trade_date, value_date, start_date, 1) # protect_start = True params.stepinDate = step_in_date_c params.cashSettleDate = value_date_c - params.discountCurve = yc._thisptr.get() + params.discountCurve = yc.get_TCurve() params.cdsCurve = JpmcdsNewTCurve(trade_date_c, 1, <double>CONTINUOUS, |
