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