summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--c_layer/cdsbootstrap.c2
-rw-r--r--c_layer/cdsbootstrap.h2
-rw-r--r--pyisda/cdsone.pyx4
-rw-r--r--pyisda/credit_index.pyx22
-rw-r--r--pyisda/curve.pyx25
-rw-r--r--pyisda/legs.pyx4
-rw-r--r--pyisda/optim.pyx4
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,