diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/index.py | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index bc3db1e1..f8504916 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -18,7 +18,7 @@ from yieldcurve import YC, ql_to_jp, roll_yc, rate_helpers serenitasdb = dbconn('serenitasdb') def g(index, spread : float, exercise_date : datetime.date, forward_yc = None): - """ computes the strike clean price using the expected forward yield curve """ + """computes the strike clean price using the expected forward yield curve """ if forward_yc is None: forward_yc = index._yc step_in_date = exercise_date + datetime.timedelta(days=1) @@ -89,6 +89,12 @@ class Index(): q = self._sc.survival_probability(exercise_date) return a - Delta * df * q + def forward_spread(self, exercise_date): + value_date = (pd.Timestamp(exercise_date) + 3* BDay()).date() + df = self._yc.discount_factor(value_date) + q = self._sc.survival_probability(exercise_date) + return self._spread + (1 - self.recovery) * (1 - q) * df / self.forward_annuity(exercise_date) + def forward_pv(self, exercise_date): """This is default adjusted forward price at time exercise_date""" step_in_date = exercise_date + datetime.timedelta(days=1) @@ -99,11 +105,9 @@ class Index(): df = self._yc.discount_factor(value_date) q = self._sc.survival_probability(exercise_date) clean_forward_annuity = a - Delta * df * q - forward_price = self.notional * clean_forward_annuity * (self._spread - - self.fixed_rate*1e-4) - - fep = self.notional * (1 - self.recovery) * (1 - q) - return forward_price / df + fep + forward_price = clean_forward_annuity * (self.spread - self.fixed_rate) * 1e-4 + fep = (1 - self.recovery) * (1-q) + return self.notional * (forward_price / df + fep) @property def spread(self): @@ -304,3 +308,33 @@ class Index(): self.jump_to_default) ] return "\n".join(s) + + +class ForwardIndex(Index): + def __init__(self, index, forward_date): + self.index = index + self.forward_date = forward_date + self.step_in_date = forward_date + datetime.timedelta(days=1) + value_date = (pd.Timestamp(forward_date) + 3* BDay()).date() + a = index._fee_leg.pv(index.trade_date, self.step_in_date, + index.trade_date, index._yc, index._sc, False) + Delta = index._fee_leg.accrued(self.step_in_date) + df = index._yc.discount_factor(value_date) + q = index._sc.survival_probability(forward_date) + self._forward_annuity = a - Delta * df * q + self._forward_pv = self._forward_annuity * (index.spread - index.fixed_rate) * 1e-4 + fep = (1 - index.recovery) * (1 - q) + self._forward_pv = self._forward_pv /df + fep + self._forward_spread = index._spread + fep * df / self._forward_annuity + + @property + def forward_annuity(self): + return self._forward_annuity + + @property + def forward_pv(self): + return self._forward_pv + + @property + def forward_spread(self): + return self._forward_spread * 1e4 |
