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