aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/index.py52
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