aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics/option.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics/option.py')
-rw-r--r--python/analytics/option.py22
1 files changed, 4 insertions, 18 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py
index ef931701..1669803a 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -319,6 +319,9 @@ class BlackSwaption(ForwardIndex):
def pv(self, val):
if np.isnan(val):
raise ValueError("val is nan")
+ # early exit
+ if self.sigma is not None and abs(self.pv - val) < 1e-12:
+ return
if self._direction * (val - self.intrinsic_value) < 0:
raise ValueError(
f"{val}: is less than intrinsic value: {self.intrinsic_value}"
@@ -571,7 +574,7 @@ class Swaption(BlackSwaption):
@pv.setter
def pv(self, val):
# use sigma_black as a starting point
- self.pv_black = val
+ BlackSwaption.pv.fset(self, val)
if self.sigma == 0.0:
self.sigma = 1e-6
@@ -592,23 +595,6 @@ class Swaption(BlackSwaption):
b *= eta
self.sigma = brentq(handle, a, b)
- def __setpv_black(self, val):
- black_self = BlackSwaption.__new__(BlackSwaption)
- for k in chain.from_iterable(
- c.__slots__ for c in type(black_self).__mro__[:-1]
- ):
- if k != "__weakref__":
- setattr(black_self, k, getattr(self, k))
- black_self.pv = val
- self.sigma = black_self.sigma
-
- pv_black = property(None, __setpv_black)
-
- def __setprice_black(self, p):
- self.pv_black = p * 1e-2 * self.notional * self.index.factor * self._direction
-
- price_black = property(None, __setprice_black)
-
def _get_keys(df, models=["black", "precise"]):
for quotedate, source in (