diff options
Diffstat (limited to 'python/analytics/index.py')
| -rw-r--r-- | python/analytics/index.py | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index 34f8d47d..5a94415f 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -55,6 +55,7 @@ class Index(): self._default_leg = ContingentLeg(self._start_date, end_date, 1) self._trade_date = None self._yc = None + self._sc = None self._risky_annuity = None self._spread = None self.name = None @@ -111,7 +112,10 @@ class Index(): @property def spread(self): - return self._spread * 1e4 + if self._spread is not None: + return self._spread * 1e4 + else: + return None def _update(self): self._sc = SpreadCurve(self.trade_date, self._yc, self.start_date, @@ -131,8 +135,9 @@ class Index(): @spread.setter def spread(self, s: float): """ s: spread in bps """ - self._spread = s * 1e-4 - self._update() + if self.spread is None or s != self.spread: + self._spread = s * 1e-4 + self._update() @property def flat_hazard(self): @@ -318,21 +323,13 @@ class Index(): return "\n".join(s) -class ForwardIndex(Index): +class ForwardIndex(): def __init__(self, index, forward_date): self.index = index - step_in_date = forward_date + datetime.timedelta(days=1) + self.forward_date = forward_date self.exercise_date_settle = (pd.Timestamp(forward_date) + 3* BDay()).date() - a = index._fee_leg.pv(index.trade_date, step_in_date, - index.trade_date, index._yc, index._sc, False) - Delta = index._fee_leg.accrued(step_in_date) self.df = index._yc.discount_factor(self.exercise_date_settle) - q = index._sc.survival_probability(forward_date) - self._forward_annuity = a - Delta * self.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 / self.df + fep - self._forward_spread = index._spread + fep * self.df / self._forward_annuity + self._update() @property def forward_annuity(self): @@ -345,3 +342,30 @@ class ForwardIndex(Index): @property def forward_spread(self): return self._forward_spread * 1e4 + + @property + def ref(self): + return self.index.spread + + @ref.setter + def ref(self, val : float): + if val != self.index.spread: + self.index.spread = val + self._update() + + def _update(self): + if self.index._sc is not None: + step_in_date = self.forward_date + datetime.timedelta(days=1) + a = self.index._fee_leg.pv(self.index.trade_date, step_in_date, + self.index.trade_date, self.index._yc, self.index._sc, False) + Delta = self.index._fee_leg.accrued(step_in_date) + q = self.index._sc.survival_probability(self.forward_date) + self._forward_annuity = a - Delta * self.df * q + self._forward_pv = self._forward_annuity * (self.index.spread - self.index.fixed_rate) * 1e-4 + fep = (1 - self.index.recovery) * (1 - q) + self._forward_pv = self._forward_pv / self.df + fep + self._forward_spread = self.index._spread + fep * self.df / self._forward_annuity + else: + self._forward_annuity = None + self._forward_pv = None + self._forward_spread = None |
