aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/swaption.py63
1 files changed, 32 insertions, 31 deletions
diff --git a/python/swaption.py b/python/swaption.py
index a39ebbad..50dbdc4d 100644
--- a/python/swaption.py
+++ b/python/swaption.py
@@ -67,23 +67,22 @@ class Index():
def forward_pv(self, exercise_date):
step_in_date = exercise_date + datetime.timedelta(days=1)
value_date = (pd.Timestamp(exercise_date) + 3* BDay()).date()
- a = self._fee_leg.pv(self.trade_date, step_in_date, value_date, self._yc, self._sc, False)
+ a = self._fee_leg.pv(self.trade_date, step_in_date, self._value_date,
+ self._yc, self._sc, False)
Delta = self._fee_leg.accrued(step_in_date)
df = self._yc.discount_factor(value_date)
if exercise_date > self.trade_date:
- Delta *= math.exp(-self.flat_hazard * year_frac(self.trade_date, exercise_date))
- clean_forward_annuity = a - Delta * df
- print(clean_forward_annuity)
+ q = math.exp(-self.flat_hazard * year_frac(self._step_in_date, exercise_date))
+ else:
+ q = 1
+ clean_forward_annuity = a - Delta * df * q
dl_pv = self._default_leg.pv(
- self.trade_date, step_in_date, value_date,
+ self.trade_date, step_in_date, self._value_date,
self._yc, self._sc, self.recovery)
- print(dl_pv)
- forward_price = self.notional*(dl_pv - clean_forward_annuity * self.fixed_rate*1e-4)
- fep = (1 - self.recovery) * (1 - math.exp(- self.flat_hazard *
- year_frac(self.trade_date, exercise_date)))
-
- price = 1/df * forward_price
- return price
+ forward_price = self.notional * (dl_pv - clean_forward_annuity * self.fixed_rate*1e-4)
+ fep = self.notional * (1 - self.recovery) * (1 - q) * df / \
+ self._yc.discount_factor(self._value_date)
+ return forward_price + fep
@property
def spread(self):
@@ -194,38 +193,40 @@ def calib(S0, fp, forward_yield_curve, exercise_date_settle, index, tilt, w):
df = forward_yield_curve.discount_factor(exercise_date_settle)
return 1/df*np.inner(vec - fp, w)
-def g(spread, forward_yield_curve, index):
+def g(index, spread, exercise_date):
""" computes the strike price using the expected forward yield curve """
- exercise_date = forward_yield_curve.base_date
step_in_date = exercise_date + datetime.timedelta(days=1)
exercise_date_settle = (pd.Timestamp(exercise_date) + 3* BDay()).date()
- sc = SpreadCurve(exercise_date, forward_yield_curve, exercise_date, step_in_date,
- exercise_date_settle,
- [index.end_date], array.array('d', [spread]), index.recovery)
- a = index._fee_leg.pv(exercise_date, step_in_date, exercise_date,
- forward_yield_curve, sc, True)
+ sc = SpreadCurve(exercise_date, index._yc, index.start_date,
+ step_in_date, exercise_date_settle,
+ [index.end_date], array.array('d', [spread * 1e-4]),
+ index.recovery)
+ a = index._fee_leg.pv(exercise_date, step_in_date, exercise_date_settle,
+ index._yc, sc, True)
dl_pv = index._default_leg.pv(
- exercise_date, step_in_date, exercise_date, forward_yield_curve,
+ exercise_date, step_in_date, exercise_date_settle, index._yc,
sc, index.recovery)
- df = forward_yield_curve.discount_factor(exercise_date_settle)
- return 1/df * (dl_pv - a * index.fixed_rate)
+ return index.notional * (dl_pv - a * index.fixed_rate * 1e-4)
-def ATMstrike(spread, trade_date, exercise_date, yield_curve, index):
- fp = DAforward_price(spread, trade_date, exercise_date, yc, index)
- yc_forward = yc.expected_forward_curve(exercise_date)
- closure = lambda S: g(S, yc_forward, index) - fp
+def ATMstrike(index, exercise_date):
+ exercise_date_settle = (pd.Timestamp(exercise_date) + 3* BDay()).date()
+ df = index._yc.discount_factor(exercise_date_settle) / \
+ index._yc.discount_factor(index._value_date)
+ fp = index.forward_pv(exercise_date)
+ closure = lambda S: g(index, S, exercise_date) * df - fp
eta = 1.1
- a = spread
- b = spread * eta
+ a = index.spread
+ b = index.spread * eta
while True:
if closure(b) > 0:
break
+ b *= eta
return brentq(closure, a, b)
-def option(index, ref, trade_date, exercise_date, yield_curve, sigma, K, option_type="payer"):
+def option(index, exercise_date, sigma, K, option_type="payer"):
""" computes the pv of an option using Pedersen's model """
- fp = DAforward_price(ref, trade_date, exercise_date, yield_curve, index)
- forward_yc = yield_curve.expected_forward_curve(exercise_date)
+ fp = index.forward_price(exercise_date)
+ #forward_yc = yield_curve.expected_forward_curve(exercise_date)
#expiry is end of day (not sure if this is right)
T = year_frac(trade_date, exercise_date)
Z, w = GHquad(50)