diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/swaption.py | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/python/swaption.py b/python/swaption.py index 49be1339..a39ebbad 100644 --- a/python/swaption.py +++ b/python/swaption.py @@ -64,18 +64,26 @@ class Index(): self._default_leg = ContingentLeg(self.start_date, d, 1) self._end_date = d - def forward_pv(self, trade_date, exercise_date, yc, sc, h = None): + def forward_pv(self, exercise_date): step_in_date = exercise_date + datetime.timedelta(days=1) - value_date = (pd.Timestamp(trade_date) + 3* BDay()).date() - a = self._fee_leg.pv(trade_date, step_in_date, value_date, yc, sc, False) + 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) Delta = self._fee_leg.accrued(step_in_date) - if exercise_date > trade_date: - Delta *= math.exp(-h * year_frac(trade_date, exercise_date)) - clean_forward_annuity = a - Delta - + 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) dl_pv = self._default_leg.pv( - trade_date, step_in_date, value_date, yc, sc, self.recovery) - return self.notional*(dl_pv - clean_forward_annuity * self.fixed_rate*1e-4), clean_forward_annuity + self.trade_date, step_in_date, 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 @property def spread(self): @@ -94,10 +102,16 @@ class Index(): self._sc, False) self._accrued = self._fee_leg.accrued(self._step_in_date) self._dl_pv = self._default_leg.pv( - self._trade_date, self._step_in_date, self._value_date, + self.trade_date, self._step_in_date, self._value_date, self._yc, self._sc, self.recovery) @property + def flat_hazard(self): + sc_data = self._sc.inspect()['data'] + ## conversion to continuous compounding + return math.log(1 + sc_data[0][1]) + + @property def pv(self): return self.notional * (self._dl_pv - self._risky_annuity * self.fixed_rate*1e-4) @@ -156,34 +170,21 @@ def year_frac(d1, d2, day_count_conv = "Actual/365"): elif day_count_conv.lower() in ["actual/360", "act/360"]: return (d2-d1).days/360 -def DAforward_price(spread, trade_date, exercise_date, yield_curve, index): - cash_settle_date = (pd.Timestamp(trade_date) + 3* BDay()).date() - h, sc = flat_hazard(spread, yc, trade_date, cash_settle_date, - start_date = trade_date, - end_date = index.end_date, - recovery_rate = index.recovery) - exercise_date_settle = (pd.Timestamp(exercise_date) + 3* BDay()).date() - forward_price = index.pv(trade_date, exercise_date, yield_curve, sc, h)[0] - fep = (1 - index.recovery) * (1-math.exp(-h*year_frac(trade_date, exercise_date))) - df = yc.discount_factor(exercise_date_settle) - price = fep + 1/df * forward_price - return price - -def flat_hazard(spread, yc, trade_date=datetime.date.today(), - cash_settle_date = None, - start_date = datetime.date.today(), - end_date = datetime.date(2021, 6, 20), - recovery_rate = 0.4): - step_in_date = trade_date + datetime.timedelta(days=1) - if cash_settle_date is None: - cash_settle_date = (pd.Timestamp(trade_date) + 3* BDay()).date() - sc = SpreadCurve(trade_date, yc, start_date, step_in_date, - cash_settle_date, - [end_date], array.array('d', [spread]), recovery_rate) - sc_data = sc.inspect()['data'] - ## conversion to continuous compounding - hazard_rate = math.log(1 + sc_data[0][1]) - return (hazard_rate, SpreadCurve.from_flat_hazard(trade_date, hazard_rate)) +# def flat_hazard(spread, yc, trade_date=datetime.date.today(), +# cash_settle_date = None, +# start_date = datetime.date.today(), +# end_date = datetime.date(2021, 6, 20), +# recovery_rate = 0.4): +# step_in_date = trade_date + datetime.timedelta(days=1) +# if cash_settle_date is None: +# cash_settle_date = (pd.Timestamp(trade_date) + 3* BDay()).date() +# sc = SpreadCurve(trade_date, yc, start_date, step_in_date, +# cash_settle_date, +# [end_date], array.array('d', [spread]), recovery_rate) +# sc_data = sc.inspect()['data'] +# ## conversion to continuous compounding +# hazard_rate = math.log(1 + sc_data[0][1]) +# return (hazard_rate, SpreadCurve.from_flat_hazard(trade_date, hazard_rate)) def calib(S0, fp, forward_yield_curve, exercise_date_settle, index, tilt, w): S = S0 * tilt |
