diff options
| -rw-r--r-- | pyisda/credit_index.pyx | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx index 1474dd5..e8db882 100644 --- a/pyisda/credit_index.pyx +++ b/pyisda/credit_index.pyx @@ -154,7 +154,6 @@ cdef class CreditIndex(CurveList): TDate step_in_date_c = pydate_to_TDate(step_in_date) TDate value_date_c = pydate_to_TDate(value_date) np.npy_intp[2] n = [self.curves.size(), self.maturities.size()] - double accrued size_t i = 0, j = 0 np.ndarray[np.float64_t,ndim=2] cl_pv = np.PyArray_EMPTY(2, n, np.NPY_DOUBLE, 0) np.ndarray[np.float64_t,ndim=2] fl_pv = np.PyArray_EMPTY(2, n, np.NPY_DOUBLE, 0) @@ -194,13 +193,17 @@ cdef class CreditIndex(CurveList): i += 1 return pd.concat({'duration': - pd.DataFrame(fl_pv - accrued, + pd.DataFrame(fl_pv, columns=d.view('M8[D]'), index=tickers), 'protection_pv': pd.DataFrame(cl_pv, columns=d.view('M8[D]'), index=tickers)}) + def accrued(self): + cdef double accrued + FeeLegAI(self.fee_legs[0], self.base_date, &accrued) + return accrued @cython.boundscheck(False) def pv(self, step_in_date, value_date, maturity, YieldCurve yc not None, @@ -212,7 +215,6 @@ cdef class CreditIndex(CurveList): TDate maturity_c = pydate_to_TDate(maturity) unsigned long mask = 0 vector[double] h - double accrued pair[TContingentLeg,TFeeLeg] legs = get_legs(maturity_c, self.start_date, self.contingent_legs, @@ -224,13 +226,12 @@ cdef class CreditIndex(CurveList): if mask == 0: raise ValueError("maturity is not correct") h = vector[double](self.T.size()) - FeeLegAI(self.fee_legs[0], self.base_date, &accrued) r = pv(self.curves, self.base_date, step_in_date_c, value_date_c, yc._thisptr.get(), legs, recovery_rate, fixed_rate, self.weights, epsilon, h, self.T, mask) - return r - fixed_rate * accrued + return r def theta(self, step_in_date, value_date, maturity, YieldCurve yc not None, double recovery_rate, double fixed_rate): @@ -250,6 +251,11 @@ cdef class CreditIndex(CurveList): recovery_rate, fixed_rate, self.weights, 0., h, self.T, 0) maturity_c = pydate_to_TDate(maturity - relativedelta(years=1)) + legs = get_legs(maturity_c, + self.start_date, + self.contingent_legs, + self.fee_legs, + self.maturities) return pv(self.curves, self.base_date, step_in_date_c, value_date_c, yc._thisptr.get(), legs, recovery_rate, fixed_rate, self.weights, 0., h, self.T, 0) - \ @@ -262,11 +268,6 @@ cdef class CreditIndex(CurveList): TDate step_in_date_c = pydate_to_TDate(step_in_date) TDate value_date_c = pydate_to_TDate(value_date) TDate maturity_c = pydate_to_TDate(maturity) - double accrued - - FeeLegAI(self.fee_legs[0], self.base_date, &accrued) - - cdef: TFeeLeg* fl size_t i @@ -293,7 +294,7 @@ cdef class CreditIndex(CurveList): &fl_pv) r += self.weights[i] * fl_pv i += 1 - return r - accrued + return r @property def maturities(self): |
