diff options
| -rw-r--r-- | python/analytics/index.py | 16 | ||||
| -rw-r--r-- | python/yieldcurve.py | 3 |
2 files changed, 11 insertions, 8 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index 2277b938..9ec3b7ac 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -88,11 +88,15 @@ class Index(): Unadjusted, CDS) - def survival_probability(self, d): - if d > self.trade_date: - return math.exp( - self.flat_hazard * (d - self.trade_date).days/365) - else: - return 1 + def forward_annuity(self, exercise_date): + step_in_date = exercise_date + datetime.timedelta(days=1) + value_date = (pd.Timestamp(exercise_date) + 3* BDay()).date() + a = self._fee_leg.pv(self.trade_date, step_in_date, self._value_date, + self._yc, self._sc, False) + Delta = self._fee_leg.accrued(step_in_date) + df = self._yc.discount_factor(value_date) + q = self._sc.survival_probability(step_in_date) + return a - Delta * df * q def forward_pv(self, exercise_date): """This is default adjusted forward price at time exercise_date""" @@ -102,7 +106,7 @@ class Index(): Delta = self._fee_leg.accrued(step_in_date) value_date = (pd.Timestamp(exercise_date) + 3* BDay()).date() df = self._yc.discount_factor(value_date) - q = self.survival_probability(exercise_date) + q = self._sc.survival_probability(exercise_date) clean_forward_annuity = a - Delta * df * q dl_pv = self._default_leg.pv( self.trade_date, step_in_date, self._value_date, diff --git a/python/yieldcurve.py b/python/yieldcurve.py index 8c5431e3..c8d6ed01 100644 --- a/python/yieldcurve.py +++ b/python/yieldcurve.py @@ -100,8 +100,7 @@ def get_dates(date, currency="USD"): def roll_yc(yc, forward_date): """returns the expected forward yield cuve on a forward_date""" dates = get_dates(forward_date) - df0 = yc.discount_factor(forward_date) - dfs = array.array('d', [yc.discount_factor(d)/df0 for d in dates]) + dfs = array.array('d', [yc.discount_factor(d, forward_date) for d in dates]) return YieldCurve.from_discount_factors(forward_date, dates, array.array('d', dfs), 'ACT/365F') def YC(helpers = None, currency="USD", MarkitData=None): |
