diff options
Diffstat (limited to 'python/analytics')
| -rw-r--r-- | python/analytics/option.py | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py index 6c2c970d..1cd5d1a6 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -73,7 +73,7 @@ class Swaption(ForwardIndex): tilt = np.exp(-self.sigma**2/2 * T + self.sigma * self._Z * math.sqrt(T)) args = (self.forward_pv, self.exercise_date, self.exercise_date_settle, self.index, self._forward_yc, tilt, self._w) - eta = 1.1 + eta = 1.05 a = self.index.spread b = a * eta while True: @@ -105,19 +105,50 @@ class Swaption(ForwardIndex): self.exercise_date_settle, self.index.start_date, self.index.end_date, self.index.recovery) val = ((a - b * self.index.fixed_rate*1e-4) - self._G) * 1/math.sqrt(2*math.pi) * np.exp(-Z**2/2) - df = self.index._yc.discount_factor(self.exercise_date_settle) - return self.notional * simps(val, Z) * df + return self.notional * simps(val, Z) * self.df + + @pv.setter + def pv(self, val: float): + def handle(x): + self.sigma = x + return self.pv - val + # use sigma as a starting point + self.pv_black = val + eta = 1.1 + a = self.sigma + while True: + if handle(a) < 0: + break + a /= eta + b = a * eta + while True: + if handle(b) > 0: + break + b *= eta + self.sigma = brentq(handle, a, b) @property def pv_black(self): """compute pv using black-scholes formula""" - df = self.index._yc.discount_factor(self.exercise_date_settle) - strike_tilde = self.index.fixed_rate * 1e-4 + self._G / self.forward_annuity * df + strike_tilde = self.index.fixed_rate * 1e-4 + self._G / self.forward_annuity * self.df return self.forward_annuity * black(self.forward_spread * 1e-4, strike_tilde, self.T, self.sigma, self.option_type) * self.notional + @pv_black.setter + def pv_black(self, val: float): + def handle(x): + self.sigma = x + return self.pv_black - val + eta = 1.01 + a = 0.1 + b = a * eta + while True: + if handle(b) > 0: + break + b *= eta + self.sigma = brentq(handle, a, b) @property def delta(self): |
