diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/option.py | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py index 02f6a784..ebbf6303 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -114,6 +114,18 @@ class BlackSwaption(ForwardIndex): #self._G = g(self.index, K, self.exercise_date) @property + def atm_strike(self): + fp = self.forward_pv + if self.index._quote_is_price: + return 100 * (1 - fp) + else: + return g(self.index, self.index.fixed_rate, self.exercise_date, pv=fp) + + @property + def moneyness(self): + return self.strike / self.atm_strike + + @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) @@ -123,7 +135,6 @@ class BlackSwaption(ForwardIndex): ['_cache', '_Z', '_w']], protocol=pickle.HIGHEST_PROTOCOL)) @property - @memoize def pv(self): """compute pv using black-scholes formula""" if self.sigma == 0: @@ -330,11 +341,7 @@ class Swaption(BlackSwaption): @pv.setter def pv(self, val): # use sigma_black as a starting point - black_self = BlackSwaption.__new__(BlackSwaption) - black_self.__dict__ = vars(self).copy() - black_self._cache = {} - black_self.pv = val - self.sigma = black_self.sigma + self.pv_black = val def handle(x): self.sigma = x @@ -352,6 +359,16 @@ class Swaption(BlackSwaption): b *= eta self.sigma = brentq(handle, a, b) + def __setpv_black(self, val): + black_self = BlackSwaption.__new__(BlackSwaption) + black_self.__dict__ = vars(self).copy() + black_self._cache = {} + black_self.pv = val + self.sigma = black_self.sigma + + pv_black = property(None, __setpv_black) + + def compute_vol(option, strike, mid): option.strike = strike try: |
