summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2018-07-02 13:15:48 -0400
committerGuillaume Horel <guillaume.horel@gmail.com>2018-07-02 13:25:59 -0400
commit3609fd12612f1e7205010a7e21831495b53c22ae (patch)
tree4e6eb6fab5b995b4a603651734c93416f356b095
parent3811cfd135fcde317dc5d622ac54ee2ca45990f9 (diff)
downloadpyisda-3609fd12612f1e7205010a7e21831495b53c22ae.tar.gz
recompute T vector on the fly
-rw-r--r--pyisda/credit_index.pxd1
-rw-r--r--pyisda/credit_index.pyx25
-rw-r--r--pyisda/curve.pxd2
-rw-r--r--pyisda/curve.pyx31
4 files changed, 17 insertions, 42 deletions
diff --git a/pyisda/credit_index.pxd b/pyisda/credit_index.pxd
index e3e1de1..aa77883 100644
--- a/pyisda/credit_index.pxd
+++ b/pyisda/credit_index.pxd
@@ -8,7 +8,6 @@ from libcpp.string cimport string
cdef class CurveList:
cdef TDate base_date
cdef vector[double] _weights
- cdef vector[double] T
cdef vector[shared_ptr[TCurve]] _curves
cdef map[string, size_t] tickers
cdef vector[shared_ptr[double]] recovery_rates
diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx
index e6c541b..4cc3cbf 100644
--- a/pyisda/credit_index.pyx
+++ b/pyisda/credit_index.pyx
@@ -61,15 +61,11 @@ cdef class CurveList:
else:
raise TypeError("curves need to be a list of SpreadCurve")
- self.T = vector[double](sc._thisptr.get().fNumItems)
if value_date is not None:
self.base_date = pydate_to_TDate(value_date)
else:
self.base_date = sc._thisptr.get().fBaseDate
- for i in range(self.T.size()):
- self.T[i] = (sc._thisptr.get().fArray[i].fDate - self.base_date) / 365.
-
i = 0
cdef int n_skipped = 0
for sc in curves:
@@ -149,11 +145,6 @@ cdef class CurveList:
@value_date.setter
def value_date(self, d):
self.base_date = pydate_to_TDate(d)
- cdef:
- TCurve* sc = self._curves[0].get()
- size_t i
- for i in range(self.T.size()):
- self.T[i] = (sc.fArray[i].fDate - self.base_date) / 365.
@property
def curves(self):
@@ -372,7 +363,6 @@ cdef class CreditIndex(CurveList):
TDate cash_settle_date_c = pydate_to_TDate(cash_settle_date)
TDate maturity_c = pydate_to_TDate(maturity)
unsigned long mask = 0
- vector[double] h
pair[TContingentLeg_ptr,TFeeLeg_ptr] legs
int i = get_maturity_index(maturity_c, self._maturities)
@@ -386,11 +376,10 @@ cdef class CreditIndex(CurveList):
mask = fill_mask(maturity_c, self._maturities, self._curves[0])
if mask == 0:
raise ValueError("maturity is not correct")
- h = vector[double](self.T.size())
with nogil:
r = pv(self._curves, self.base_date, step_in_date_c, cash_settle_date_c,
yc._thisptr.get(), legs, self.recovery_rates, fixed_rate,
- self._weights, epsilon, h, self.T, mask)
+ self._weights, epsilon, mask)
if i == -1:
free(legs.first)
JpmcdsFeeLegFree(legs.second)
@@ -405,7 +394,6 @@ cdef class CreditIndex(CurveList):
TDate cash_settle_date_c = pydate_to_TDate(cash_settle_date)
TDate maturity_c = pydate_to_TDate(maturity)
TDate theta_date_c, temp
- vector[double] h
pair[TContingentLeg_ptr, TFeeLeg_ptr] legs
TDateInterval ivl
int i
@@ -432,7 +420,7 @@ cdef class CreditIndex(CurveList):
old_pv = pv(self._curves, self.base_date, step_in_date_c,
cash_settle_date_c, yc._thisptr.get(), legs,
self.recovery_rates, fixed_rate, self._weights,
- 0., h, self.T, 0)
+ 0., 0)
if i == -1:
free(legs.first)
JpmcdsFeeLegFree(legs.second)
@@ -448,7 +436,7 @@ cdef class CreditIndex(CurveList):
cdef r = old_pv - pv(self._curves, self.base_date, step_in_date_c,
cash_settle_date_c,
yc._thisptr.get(), legs, self.recovery_rates, fixed_rate,
- self._weights, 0., h, self.T, 0) + carry
+ self._weights, 0., 0) + carry
if i == -1:
free(legs.first)
JpmcdsFeeLegFree(legs.second)
@@ -516,11 +504,10 @@ cdef class CreditIndex(CurveList):
cdef:
TDate maturity_c = pydate_to_TDate(maturity)
unsigned long mask = fill_mask(maturity_c, self._maturities, self._curves[0])
- vector[double] h = vector[double](self.T.size())
shared_ptr[TCurve] sc
for sc in self._curves:
- tweak_curve(sc.get(), sc.get(), epsilon, h, self.T, mask)
+ tweak_curve(sc.get(), sc.get(), epsilon, mask)
def survival_matrix(self, TDate[:] schedule):
cdef:
@@ -610,8 +597,6 @@ cdef double pv(vector[shared_ptr[TCurve]]& curves,
double fixed_rate,
vector[double]& weights,
double epsilon,
- vector[double]& h,
- vector[double]& T,
unsigned long mask) nogil:
cdef:
double fl_pv, cl_pv, r = 0
@@ -625,7 +610,7 @@ cdef double pv(vector[shared_ptr[TCurve]]& curves,
for c in curves:
if epsilon != 0.:
- tweak_curve(c.get(), tweaked_curve, epsilon, h, T, mask)
+ tweak_curve(c.get(), tweaked_curve, epsilon, mask)
else:
tweaked_curve = c.get()
# TODO: pick the actual recovery on the curve
diff --git a/pyisda/curve.pxd b/pyisda/curve.pxd
index 76a0a4e..6064c75 100644
--- a/pyisda/curve.pxd
+++ b/pyisda/curve.pxd
@@ -218,4 +218,4 @@ cdef class SpreadCurve(Curve):
cdef fArray_to_list(TRatePt* fArray, int fNumItems)
cdef void tweak_curve(const TCurve* sc, TCurve* sc_tweaked, double epsilon,
- vector[double]& h, const vector[double]& T, unsigned long mask) nogil
+ unsigned long mask) nogil
diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx
index 8dc79a5..e6c64c7 100644
--- a/pyisda/curve.pyx
+++ b/pyisda/curve.pyx
@@ -412,28 +412,24 @@ cdef class YieldCurve(Curve):
@cython.cdivision(True)
cdef void tweak_curve(const TCurve* sc, TCurve* sc_tweaked, double epsilon,
- vector[double]& h, const vector[double]& T, unsigned long mask) nogil:
+ unsigned long mask) nogil:
## We want to tweak in the forward space, so we convert the hazard rates
## into forward rates and then back
- cdef double h1, h2, t1, t2
- h1 = t1 = 0
+ cdef double h1, h2, t1, t2, c
+ h1 = t1 = c = 0
cdef size_t i
- for i in range(T.size()):
+
+ for i in range(sc.fNumItems):
h2 = sc.fArray[i].fRate
- t2 = T[i]
- h[i] = (h2 * t2 - h1 * t1) / (t2 - t1)
+ t2 = (sc.fArray[i].fDate - sc.fBaseDate) / 365.
+ h = (h2 * t2 - h1 * t1) / (t2 - t1)
if mask == 0 or (mask >> i) & 1:
- h[i] *= (1 + epsilon)
+ h *= (1 + epsilon)
+ c += (t2 - t1) * h
+ sc_tweaked.fArray[i].fRate = c / t2
h1 = h2
t1 = t2
- t1 = 0
- cdef double c = 0
- for i in range(T.size()):
- c += (T[i] - t1) * h[i]
- sc_tweaked.fArray[i].fRate = c / T[i]
- t1 = T[i]
-
cdef class SpreadCurve(Curve):
"""
Initialize a SpreadCurve from a list of spreads and maturity.
@@ -709,13 +705,8 @@ cdef class SpreadCurve(Curve):
sc = self
curve_tweaked = self._thisptr.get()
- h = vector[double](num_items)
- T = vector[double](num_items)
- for i in range(num_items):
- T[i] = (curve_tweaked.fArray[i].fDate - curve_tweaked.fBaseDate) / 365.
-
if mask != 0:
- tweak_curve(self._thisptr.get(), curve_tweaked, epsilon, h, T, mask)
+ tweak_curve(self._thisptr.get(), curve_tweaked, epsilon, mask)
return sc
@cython.boundscheck(False)