summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyisda/credit_index.pyx25
1 files changed, 18 insertions, 7 deletions
diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx
index afe441d..d642acf 100644
--- a/pyisda/credit_index.pyx
+++ b/pyisda/credit_index.pyx
@@ -387,18 +387,28 @@ cdef class CreditIndex(CurveList):
return r
def theta(self, step_in_date, cash_settle_date, maturity, YieldCurve yc not None,
- double recovery_rate, double fixed_rate, double old_pv=nan("")):
+ double recovery_rate, double fixed_rate, double old_pv=nan(""),
+ theta_date=None):
+ """ computes the theta (carry net of roll down)
+ if theta_date is None, this is 1 year theta, otherwise theta to that date"""
cdef:
TDate step_in_date_c = pydate_to_TDate(step_in_date)
TDate cash_settle_date_c = pydate_to_TDate(cash_settle_date)
TDate maturity_c = pydate_to_TDate(maturity)
- TDate temp
+ TDate theta_date_c, temp
vector[double] h
pair[TContingentLeg_ptr,TFeeLeg_ptr] legs
TDateInterval ivl
int i
- JpmcdsMakeDateInterval(-1, "Y", &ivl)
- JpmcdsDtFwdAny(maturity_c, &ivl, &temp)
+ double carry
+ if theta_date is None:
+ JpmcdsMakeDateInterval(-1, "Y", &ivl)
+ JpmcdsDtFwdAny(maturity_c, &ivl, &temp)
+ carry = fixed_rate * 365 / 360
+ else:
+ theta_date_c = pydate_to_TDate(theta_date)
+ temp = maturity_c - (theta_date_c - step_in_date_c)
+ carry = fixed_rate * (theta_date_c - step_in_date_c) / 360
if temp < step_in_date_c:
return nan("")
@@ -426,9 +436,10 @@ cdef class CreditIndex(CurveList):
legs.first = self.contingent_legs[i]
legs.second = self.fee_legs[i]
- cdef r = old_pv - pv(self._curves, self.base_date, step_in_date_c, cash_settle_date_c,
- yc._thisptr.get(), legs, recovery_rate, fixed_rate,
- self._weights, 0., h, self.T, 0) + fixed_rate
+ cdef r = old_pv - pv(self._curves, self.base_date, step_in_date_c,
+ cash_settle_date_c,
+ yc._thisptr.get(), legs, recovery_rate, fixed_rate,
+ self._weights, 0., h, self.T, 0) + carry
if i == -1:
free(legs.first)
JpmcdsFeeLegFree(legs.second)