aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics/option.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics/option.py')
-rw-r--r--python/analytics/option.py27
1 files changed, 11 insertions, 16 deletions
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):