diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2018-07-02 13:15:48 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2018-07-02 13:25:59 -0400 |
| commit | 3609fd12612f1e7205010a7e21831495b53c22ae (patch) | |
| tree | 4e6eb6fab5b995b4a603651734c93416f356b095 | |
| parent | 3811cfd135fcde317dc5d622ac54ee2ca45990f9 (diff) | |
| download | pyisda-3609fd12612f1e7205010a7e21831495b53c22ae.tar.gz | |
recompute T vector on the fly
| -rw-r--r-- | pyisda/credit_index.pxd | 1 | ||||
| -rw-r--r-- | pyisda/credit_index.pyx | 25 | ||||
| -rw-r--r-- | pyisda/curve.pxd | 2 | ||||
| -rw-r--r-- | pyisda/curve.pyx | 31 |
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) |
