aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/analytics/index.py13
-rw-r--r--python/analytics/scenarios.py4
-rw-r--r--python/exploration/swaption_calendar_spread.py10
3 files changed, 17 insertions, 10 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py
index 1aa2ccc8..400c381f 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -279,6 +279,17 @@ class Index(object):
if self._spread is not None:
self._update()
+ @property
+ def pnl(self):
+ if self._original_clean_pv is None:
+ raise ValueError("original pv not set")
+ else:
+ ## TODO: handle factor change
+ days_accrued = (self.trade_date - self._original_trade_date).days / 360
+ return - self._direction * self.notional * self.factor * \
+ (self._clean_pv - self._original_clean_pv -
+ days_accrued * self.fixed_rate * 1e-4)
+
@classmethod
def from_name(cls, index, series, tenor, trade_date=datetime.date.today(),
notional=10_000_000):
@@ -327,6 +338,8 @@ class Index(object):
instance.direction = rec.protection
instance.trade_date = rec.trade_date
instance.pv = rec.upfront
+ instance._original_clean_pv = instance._clean_pv
+ instance._original_trade_date = rec.trade_date
return instance
def __repr__(self):
diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py
index 9564556b..fe921e4c 100644
--- a/python/analytics/scenarios.py
+++ b/python/analytics/scenarios.py
@@ -45,8 +45,6 @@ def run_index_scenarios(index, date_range, spread_shock):
index.trade_date = date.date()
for s in spread:
index.spread = s
- scen_pv = index.clean_pv +
- index.notional * (date.date()-starting_date).days /360 * index.fixed_rate * 1e-4 - starting_pv
- r.append([date, s, scen_pv])
+ r.append([date, s, index.pnl])
df = pd.DataFrame.from_records(r, columns=['date', 'spread', 'pnl'])
return df.set_index('date')
diff --git a/python/exploration/swaption_calendar_spread.py b/python/exploration/swaption_calendar_spread.py
index 1584fe17..11ad145a 100644
--- a/python/exploration/swaption_calendar_spread.py
+++ b/python/exploration/swaption_calendar_spread.py
@@ -106,15 +106,11 @@ def plot_color_map(df, spread_shock, vol_shock, attr="pv", path="."):
fig.colorbar(chart, shrink=.8)
fig.savefig(os.path.join(path, "payer_swap_{}.png".format(val_date)))
-
-trade_date = datetime.date(2017, 2, 23)
-ig27 = Index.from_name("IG", 27, '5yr', trade_date=trade_date)
-ig27.ref = 62
-ig27.notional = 13e6
+option_delta = Index.from_tradeid(870)
payer1 = BlackSwaption(ig27, datetime.date(2017, 4, 19), 65)
payer2 = BlackSwaption(ig27, datetime.date(2017, 5, 17), 72)
-payer1.notional = 100e6
-payer2.notional = 100e6
+payer1.notional = 100_000_000
+payer2.notional = 100_000_000
date_range = pd.bdate_range(trade_date, pd.Timestamp('2017-04-19') - BDay(), freq = '5B')
vol_shock = np.arange(-0.15, 0.3, 0.01)
spread_shock = np.arange(-0.2, 0.3, 0.01)