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