diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/__init__.py | 2 | ||||
| -rw-r--r-- | python/analytics/index.py | 11 | ||||
| -rw-r--r-- | python/analytics/option.py | 27 |
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): |
