diff options
Diffstat (limited to 'python/exploration')
| -rw-r--r-- | python/exploration/swaption_calendar_spread.py | 110 |
1 files changed, 95 insertions, 15 deletions
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') |
