aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/option.py29
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: