aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/scenarios.py6
-rw-r--r--python/exploration/swaption_calendar_spread.py110
2 files changed, 98 insertions, 18 deletions
diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py
index fe921e4c..07c0f042 100644
--- a/python/analytics/scenarios.py
+++ b/python/analytics/scenarios.py
@@ -26,7 +26,7 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock,
T = swaption.T
for s in spreads:
swaption.ref = s
- curr_vol = float(vol_surface(T, swaption.moneyness))
+ curr_vol = float(max(0, vol_surface(T, swaption.moneyness)))
for vs in vol_shock:
swaption.sigma = curr_vol * (1 + vs)
r.append([date, s, vs] + [getattr(swaption, p) for p in params])
@@ -43,8 +43,8 @@ def run_index_scenarios(index, date_range, spread_shock):
for date in date_range:
index.trade_date = date.date()
- for s in spread:
+ for s in spreads:
index.spread = s
r.append([date, s, index.pnl])
- df = pd.DataFrame.from_records(r, columns=['date', 'spread', 'pnl'])
+ df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock', 'pnl'])
return df.set_index('date')
diff --git a/python/exploration/swaption_calendar_spread.py b/python/exploration/swaption_calendar_spread.py
index 11ad145a..f399a931 100644
--- a/python/exploration/swaption_calendar_spread.py
+++ b/python/exploration/swaption_calendar_spread.py
@@ -104,27 +104,107 @@ def plot_color_map(df, spread_shock, vol_shock, attr="pv", path="."):
ax.set_title('{} of Trade on {}'.format(attr.title(), val_date))
fig.colorbar(chart, shrink=.8)
- fig.savefig(os.path.join(path, "payer_swap_{}.png".format(val_date)))
+ #fig.savefig(os.path.join(path, "payer_swap_", attr, "_{}.png".format(val_date)))
-option_delta = Index.from_tradeid(870)
-payer1 = BlackSwaption(ig27, datetime.date(2017, 4, 19), 65)
-payer2 = BlackSwaption(ig27, datetime.date(2017, 5, 17), 72)
+def plot_time_color_map(df, spread_shock, attr="pv", path="."):
+
+ val_date = df.index[0].date()
+ dftemp = df.reset_index()
+ dftemp['days'] = (dftemp['date'] - val_date).dt.days
+ date_range = dftemp.days.unique()
+
+ #rows are spread, columns are volatility surface shift
+ fig, ax = plt.subplots()
+ series = df[attr]
+ #Different ways to do a colormap: imshow and pcolormesh. using imshow here
+ midpoint = 1 - series.max() / (series.max() + abs(series.min()))
+ #import pdb; pdb.set_trace()
+ shifted_cmap = shiftedColorMap(cm.RdYlGn, midpoint=midpoint, name='shifted')
+
+ chart = ax.imshow(series.values.reshape(date_range.size, spread_shock.size).T,
+ extent=(date_range.min(), date_range.max(),
+ spread_shock.min(), spread_shock.max()),
+ aspect='auto', interpolation='bilinear', cmap=shifted_cmap)
+
+ ax.set_xlabel('Days')
+ ax.set_ylabel('Spread')
+ ax.set_title('{} of Trade'.format(attr.title()))
+
+ fig.colorbar(chart, shrink=.8)
+ #fig.savefig(os.path.join(path, "payer_swap_", attr, "_{}.png".format(val_date)))
+
+def april_may_2017_trade():
+ option_delta = Index.from_tradeid(870)
+ ref = option_delta.spread
+ payer1 = BlackSwaption(option_delta, datetime.date(2017, 4, 19), 65)
+ payer2 = BlackSwaption(option_delta, datetime.date(2017, 5, 17), 72)
+ payer1.notional = 100_000_000
+ payer2.notional = 100_000_000
+ date_range = pd.bdate_range(option_delta.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)
+ vs = VolatilitySurface("IG", 27, trade_date=option_delta.trade_date)
+ vol_surface = vs[vs.list()[-1]]
+ # #
+ df1 = run_swaption_scenarios(payer1, date_range, spread_shock, vol_shock, vol_surface)
+ df2 = run_swaption_scenarios(payer2, date_range, spread_shock, vol_shock, vol_surface)
+ df3 = run_index_scenarios(option_delta, date_range, spread_shock)
+
+ # #plot it
+ week = -1
+ df = df1.reset_index()
+ df3 = df3.reset_index()
+ df = df.merge(df3, on=['date','spread_shock'])
+ df = df.set_index('date')
+ df = df.assign(pv=df1.pv-df2.pv+df.pnl)
+
+ spread_plot_range = ref * (1 + np.arange(-0.2, 0.3, 0.001))
+ vol_shock_range = np.arange(-0.15, 0.3, 0.001)
+ plot_df(df.loc[date_range[week]], spread_plot_range, vol_shock_range)
+ plot_color_map(df.loc[date_range[week]], ref * (1 + spread_shock), vol_shock)
+
+#def june_july_2017_trade():
+
+option_delta = Index.from_name('ig', 28, '5yr')
+option_delta.spread = 67
+payer1 = BlackSwaption(option_delta, datetime.date(2017, 7, 19), 80)
+payer2 = BlackSwaption(option_delta, datetime.date(2017, 5, 17), 80)
+payer1.sigma = .438
+payer2.sigma = .479
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')
+
+ref = option_delta.spread
+option_delta.notional = payer1.notional * payer1.delta - payer2.notional * payer2.delta
+if option_delta.notional > 0: option_delta.direction = 'Seller'
+option_delta._original_clean_pv = option_delta._clean_pv
+option_delta._original_trade_date = option_delta.trade_date
+cost = payer1.pv - payer2.pv
+
+date_range = pd.bdate_range(option_delta.trade_date, pd.Timestamp('2017-05-17') - BDay(), freq = '3B')
vol_shock = np.arange(-0.15, 0.3, 0.01)
spread_shock = np.arange(-0.2, 0.3, 0.01)
-vs = VolatilitySurface("IG", 27, trade_date=trade_date)
-vol_surface = vs[vs.list()[-1]]
+vs = VolatilitySurface("IG", 28, trade_date=option_delta.trade_date)
+vol_select = max([t for t in vs.list() if t[1] == 'BAML' and t[2] == 'payer' and t[3] == 'black'])
+vol_surface = vs[vol_select]
# #
-df1 = run_swaption_scenarios(payer1, date_range, spread_shock, vol_shock, vol_surface)
-df2 = run_swaption_scenarios(payer2, date_range, spread_shock, vol_shock, vol_surface)
+df1 = run_swaption_scenarios(payer1, date_range, spread_shock, vol_shock, vol_surface, ['pv','delta'])
+df2 = run_swaption_scenarios(payer2, date_range, spread_shock, vol_shock, vol_surface, ['pv','delta'])
+df3 = run_index_scenarios(option_delta, date_range, spread_shock)
# #plot it
-week = -1
-df = df1
-df = df.assign(pv=df1.pv-df2.pv)
-spread_plot_range = ig27.ref * (1 + np.arange(-0.2, 0.3, 0.001))
+week = -2
+df = df1.reset_index()
+df3 = df3.reset_index()
+df = df.merge(df3, on=['date','spread_shock'])
+df = df.set_index('date')
+df = df.assign(pv=df1.pv-df2.pv+df.pnl-cost)
+df = df.assign(delta=df1.delta*payer1.notional-df2.delta*payer2.notional+option_delta.notional)
+
+spread_plot_range = ref * (1 + np.arange(-0.2, 0.3, 0.001))
vol_shock_range = np.arange(-0.15, 0.3, 0.001)
-plot_df(df.loc[date_range[week]], spread_plot_range, vol_shock_range)
-plot_color_map(df.loc[date_range[week]], ig27.ref * (1 + spread_shock), vol_shock)
+
+#plot_df(df.loc[date_range[week]], spread_plot_range, vol_shock_range)
+plot_color_map(df.loc[date_range[week]], ref * (1 + spread_shock), vol_shock)
+plot_time_color_map(df[round(df.vol_shock,2)==0], ref * (1 + spread_shock), 'delta')
+plot_time_color_map(df[round(df.vol_shock,2)==0], ref * (1 + spread_shock), 'pv')