diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/option.py | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py index 1cd5d1a6..7d90a4fb 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -68,6 +68,11 @@ class Swaption(ForwardIndex): self._G = g(self.index, K, self.exercise_date, self._forward_yc) @property + def intrinsic_value(self): + V = self.df * (self.forward_pv - self._G) + return max(V, 0) if self.option_type == "payer" else max(-V, 0) + + @property def pv(self): T = self.T tilt = np.exp(-self.sigma**2/2 * T + self.sigma * self._Z * math.sqrt(T)) @@ -84,12 +89,7 @@ class Swaption(ForwardIndex): S0 = brentq(calib, a, b, args) if T == 0: - pv = self.notional * ( - g(self.index, self.index.spread, self.exercise_date, self._forward_yc) - self._G) - if self.option_type == "payer": - return pv if self.index.spread > self.strike else 0 - else: - return - pv if self.index.spread < self.strike else 0 + return self.notional * self.intrinsic Zstar = (math.log(self.strike/S0) + self.sigma**2/2 * T) / \ (self.sigma * math.sqrt(T)) @@ -109,6 +109,9 @@ class Swaption(ForwardIndex): @pv.setter def pv(self, val: float): + if val < self.intrinsic_value: + raise ValueError("{}: is less than intrinsic value: {}". + format(val, self.intrinsic_value)) def handle(x): self.sigma = x return self.pv - val @@ -138,6 +141,9 @@ class Swaption(ForwardIndex): self.option_type) * self.notional @pv_black.setter def pv_black(self, val: float): + if val < self.intrinsic_value: + raise ValueError("{}: is less than intrinsic value: {}". + format(val, self.intrinsic_value)) def handle(x): self.sigma = x return self.pv_black - val |
