aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/__init__.py2
-rw-r--r--python/analytics/index.py11
-rw-r--r--python/analytics/option.py27
3 files changed, 17 insertions, 23 deletions
diff --git a/python/analytics/__init__.py b/python/analytics/__init__.py
index 1d5c0c0f..5802457d 100644
--- a/python/analytics/__init__.py
+++ b/python/analytics/__init__.py
@@ -1,2 +1,2 @@
-from .index import Index
+from .index import Index, ForwardIndex
from .option import Swaption
diff --git a/python/analytics/index.py b/python/analytics/index.py
index f8504916..1ff01b8b 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -313,13 +313,12 @@ class Index():
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,
+ step_in_date = forward_date + datetime.timedelta(days=1)
+ 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(self.step_in_date)
- df = index._yc.discount_factor(value_date)
+ Delta = index._fee_leg.accrued(step_in_date)
+ df = index._yc.discount_factor(self.exercise_date_settle)
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
diff --git a/python/analytics/option.py b/python/analytics/option.py
index 85f58f00..6c2c970d 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -6,7 +6,7 @@ import pandas as pd
from .black import black
from .utils import GHquad
-from .index import g
+from .index import g, ForwardIndex
from yieldcurve import roll_yc
from pandas.tseries.offsets import BDay
from pyisda.curve import SpreadCurve
@@ -35,19 +35,17 @@ def ATMstrike(index, exercise_date : datetime.date):
b *= eta
return brentq(closure, a, b)
-class Swaption:
+class Swaption(ForwardIndex):
def __init__(self, index, exercise_date : datetime.date, strike : float, option_type="payer"):
- self.index = index
+ ForwardIndex.__init__(self, index, exercise_date)
self._exercise_date = exercise_date
self._forward_yc = roll_yc(index._yc, exercise_date)
- self.exercise_date_settle = (pd.Timestamp(exercise_date) + 3* BDay()).date()
self._T = None
self._strike = strike
self.option_type = option_type.lower()
self._Z, self._w = GHquad(50)
self.notional = 1
self._G = g(index, strike, exercise_date, self._forward_yc)
- self._fp = self.index.forward_pv(self.exercise_date) / self.index.notional
@property
def exercise_date(self):
@@ -56,10 +54,9 @@ class Swaption:
@exercise_date.setter
def exercise_date(self, d : datetime.date):
self._exercise_date = d
- self.exercise_date_settle = (pd.Timestamp(d) + 3* BDay()).date()
+ ForwardIndex.__init__(self, self.index, d)
self._forward_yc = roll_yc(self.index._yc, d)
self._G = g(self.index, self.strike, self.exercise_date, self._forward_yc)
- self._fp = self.index.forward_pv(self.exercise_date) / self.index.notional
@property
def strike(self):
@@ -74,7 +71,7 @@ class Swaption:
def pv(self):
T = self.T
tilt = np.exp(-self.sigma**2/2 * T + self.sigma * self._Z * math.sqrt(T))
- args = (self._fp, self.exercise_date, self.exercise_date_settle,
+ args = (self.forward_pv, self.exercise_date, self.exercise_date_settle,
self.index, self._forward_yc, tilt, self._w)
eta = 1.1
a = self.index.spread
@@ -115,14 +112,12 @@ class Swaption:
def pv_black(self):
"""compute pv using black-scholes formula"""
df = self.index._yc.discount_factor(self.exercise_date_settle)
- forward_annuity = self.index.forward_annuity(self.exercise_date)
- DA_forward_spread = self._fp / forward_annuity * df + self.index.fixed_rate * 1e-4
- strike_tilde = self.index.fixed_rate * 1e-4 + self._G / forward_annuity * df
- return forward_annuity * black(DA_forward_spread,
- strike_tilde,
- self.T,
- self.sigma,
- self.option_type) * self.notional
+ strike_tilde = self.index.fixed_rate * 1e-4 + self._G / self.forward_annuity * df
+ return self.forward_annuity * black(self.forward_spread * 1e-4,
+ strike_tilde,
+ self.T,
+ self.sigma,
+ self.option_type) * self.notional
@property
def delta(self):