diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/swaption.py | 63 |
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) |
