aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/option.py41
1 files changed, 36 insertions, 5 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py
index 6c2c970d..1cd5d1a6 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -73,7 +73,7 @@ class Swaption(ForwardIndex):
tilt = np.exp(-self.sigma**2/2 * T + self.sigma * self._Z * math.sqrt(T))
args = (self.forward_pv, self.exercise_date, self.exercise_date_settle,
self.index, self._forward_yc, tilt, self._w)
- eta = 1.1
+ eta = 1.05
a = self.index.spread
b = a * eta
while True:
@@ -105,19 +105,50 @@ class Swaption(ForwardIndex):
self.exercise_date_settle,
self.index.start_date, self.index.end_date, self.index.recovery)
val = ((a - b * self.index.fixed_rate*1e-4) - self._G) * 1/math.sqrt(2*math.pi) * np.exp(-Z**2/2)
- df = self.index._yc.discount_factor(self.exercise_date_settle)
- return self.notional * simps(val, Z) * df
+ return self.notional * simps(val, Z) * self.df
+
+ @pv.setter
+ def pv(self, val: float):
+ def handle(x):
+ self.sigma = x
+ return self.pv - val
+ # use sigma as a starting point
+ self.pv_black = val
+ eta = 1.1
+ a = self.sigma
+ while True:
+ if handle(a) < 0:
+ break
+ a /= eta
+ b = a * eta
+ while True:
+ if handle(b) > 0:
+ break
+ b *= eta
+ self.sigma = brentq(handle, a, b)
@property
def pv_black(self):
"""compute pv using black-scholes formula"""
- df = self.index._yc.discount_factor(self.exercise_date_settle)
- strike_tilde = self.index.fixed_rate * 1e-4 + self._G / self.forward_annuity * df
+ strike_tilde = self.index.fixed_rate * 1e-4 + self._G / self.forward_annuity * self.df
return self.forward_annuity * black(self.forward_spread * 1e-4,
strike_tilde,
self.T,
self.sigma,
self.option_type) * self.notional
+ @pv_black.setter
+ def pv_black(self, val: float):
+ def handle(x):
+ self.sigma = x
+ return self.pv_black - val
+ eta = 1.01
+ a = 0.1
+ b = a * eta
+ while True:
+ if handle(b) > 0:
+ break
+ b *= eta
+ self.sigma = brentq(handle, a, b)
@property
def delta(self):