diff options
Diffstat (limited to 'python/exploration/swaption_calendar_spread.py')
| -rw-r--r-- | python/exploration/swaption_calendar_spread.py | 117 |
1 files changed, 43 insertions, 74 deletions
diff --git a/python/exploration/swaption_calendar_spread.py b/python/exploration/swaption_calendar_spread.py index cc548874..f6d73848 100644 --- a/python/exploration/swaption_calendar_spread.py +++ b/python/exploration/swaption_calendar_spread.py @@ -94,7 +94,7 @@ def plot_color_map(df, spread_shock, vol_shock, attr="pnl", path="."): #rows are spread, columns are volatility surface shift fig, ax = plt.subplots() #We are plotting an image, so we have to sort from high to low on the Y axis - df.sort_values(by=['spread_shock','vol_shock'], ascending = [True,False], inplace = True) + df.sort_values(by=['spread','vol_shock'], ascending = [True,False], inplace = True) series = df[attr] #import pdb; pdb.set_trace() @@ -118,7 +118,7 @@ def plot_time_color_map(df, spread_shock, attr="pnl", path=".", color_map = cm.R val_date = df.index[0].date() df = df.reset_index() df['days'] = (df['date'] - val_date).dt.days - df.sort_values(by=['date','spread_shock'], ascending = [True,False], inplace = True) + df.sort_values(by=['date','spread'], ascending = [True,False], inplace = True) date_range = df.days.unique() fig, ax = plt.subplots() @@ -189,66 +189,74 @@ def april_may_2017_trade(): plot_time_color_map(df[round(df.vol_shock,2)==0], option_delta.spread * (1 + spread_shock), 'pnl') -def may_june_2017_trade(): - option_delta = Index.from_tradeid(874) - option1 = BlackSwaption.from_tradeid(7, option_delta) - option2 = BlackSwaption.from_tradeid(8, option_delta) +def june_july_2017_trade(): + option_delta_pf = Index.from_tradeid(874) + option_delta2_pf = Index.from_tradeid(879) - portf = Portfolio([option1, option2, option_delta]) - date_range = pd.bdate_range(option_delta.trade_date, pd.Timestamp('2017-05-17') - BDay(), freq = '2B') + option1_pf = BlackSwaption.from_tradeid(7, option_delta_pf) + option2_pf = BlackSwaption.from_tradeid(9, option_delta_pf) + #option_delta.notional = option_delta.notional - option_delta2.notional + option_delta_pf.notional = 50335169 + + portf = Portfolio([option1_pf, option2_pf, option_delta_pf]) + portf.trade_date = datetime.date(2017,5,17) + portf.mark() + portf.reset_pv() + + date_range = pd.bdate_range(option_delta_pf.trade_date, pd.Timestamp('2017-06-21') - BDay(), freq = '2B') vol_shock = np.arange(-0.15, 0.3, 0.01) spread_shock = np.arange(-0.2, 0.3, 0.01) - vs = VolatilitySurface("IG", 28, trade_date=option_delta.trade_date) + vs = VolatilitySurface("IG", 28, trade_date=option_delta_pf.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] - df = run_portfolio_scenarios(portf, date_range, spread_shock, vol_shock, vol_surface, params=["pnl", "delta"], vol_time_roll=False) + df = run_portfolio_scenarios(portf, date_range, spread_shock, vol_shock, vol_surface, params=["pnl", "delta"], vol_time_roll=True) - #plot it - period = -4 + #period = -4 #plot_df(df.loc[date_range[period]], spread_plot_range, vol_shock_range) #plot_color_map(df.loc[date_range[period]], option_delta.spread * (1 + spread_shock), vol_shock, 'pnl') - plot_time_color_map(df[round(df.vol_shock,2)==0], option_delta.spread * (1 + spread_shock), 'pnl') + plot_time_color_map(df[round(df.vol_shock,2)==0], option_delta_pf.spread * (1 + spread_shock), 'pnl') #plot_time_color_map(df[round(df.vol_shock,2)==0], ref * (1 + spread_shock), 'delta', color_map = cm.coolwarm_r) + return df -def portfolio_scenario_2(): +def hy_trade_scenario(): #Manually Load trades - option_delta = Index.from_name('ig', 28, '5yr') - option_delta.spread = 67 - option1 = BlackSwaption(option_delta, datetime.date(2017, 6, 21), 65, option_type="receiver") - option2 = BlackSwaption(option_delta, datetime.date(2017, 5, 17), 65, option_type="receiver") - option1.sigma = .39 - option2.sigma = .424 - option1.notional = 100_000_000 - option2.notional = -100_000_000 + option_delta = Index.from_name('hy', 28, '5yr') + option_delta.price = 107.5 + option1 = BlackSwaption(option_delta, datetime.date(2017, 8, 16), 106, option_type="payer") + option2 = BlackSwaption(option_delta, datetime.date(2017, 8, 16), 104, option_type="payer") + option1.sigma = .331 + option2.sigma = .388 + option1.notional = 20_000_000 + option2.notional = 40_000_000 + option2.direction = 'Short' option_delta.notional = -(option1.delta * option1.notional + option2.delta*option2.notional) if option_delta.notional < 0: option_delta.direction = 'Seller' option_delta.notional = abs(option_delta.notional) - #setting original pvs for pnl calc - option1._original_pv = option1.pv - option2._original_pv = option2.pv - option_delta._original_clean_pv = option_delta._clean_pv - option_delta._original_trade_date = option_delta._trade_date portf = Portfolio([option1, option2, option_delta]) - date_range = pd.bdate_range(option_delta.trade_date, pd.Timestamp('2017-05-17') - BDay(), freq = '2B') + portf.reset_pv() + date_range = pd.bdate_range(option_delta.trade_date, pd.Timestamp('2017-08-16') - 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", 28, trade_date=option_delta.trade_date) + spread_shock = np.arange(-0.1, 0.4, 0.01) + vs = VolatilitySurface("HY", 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] - df = run_portfolio_scenarios(portf, date_range, spread_shock, vol_shock, vol_surface, params=["pnl", "delta"], vol_time_roll=False) + df = run_portfolio_scenarios(portf, date_range, spread_shock, vol_shock, vol_surface, params=["pnl", "delta"], vol_time_roll=True) - #plot it - period = -4 + #period = -4 #plot_df(df.loc[date_range[period]], spread_plot_range, vol_shock_range) #plot_color_map(df.loc[date_range[period]], option_delta.spread * (1 + spread_shock), vol_shock, 'pnl') - plot_time_color_map(df[round(df.vol_shock,2)==0], option_delta.spread * (1 + spread_shock), 'pnl') + #plot_time_color_map(df[round(df.vol_shock,2)==0], option_delta.spread * (1 + spread_shock), 'pnl') + hy_plot_range = 100 + (500- option_delta.spread * (1 + spread_shock))*option_delta.DV01/option_delta.notional*100 + plot_time_color_map(df[round(df.vol_shock,2)==0], hy_plot_range, 'pnl') #Delta in protection terms: Blue = going short, red = going long - plot_time_color_map(df[round(df.vol_shock,2)==0], ref * (1 + spread_shock), 'delta', color_map = cm.coolwarm_r) + #plot_time_color_map(df[round(df.vol_shock,2)==0], option_delta.spread * (1 + spread_shock), 'delta', color_map = cm.coolwarm_r) + + return df def portfolio(): option_delta = Index.from_tradeid(874) @@ -272,45 +280,6 @@ def portfolio(): plot_time_color_map(df[round(df.vol_shock,2)==0], option_delta.spread * (1 + spread_shock), 'pnl') plot_time_color_map(df[round(df.vol_shock,2)==0], ref * (1 + spread_shock), 'delta', color_map = cm.coolwarm_r) -def portfolio_today(): - option_deltas = {} - options = {} - for trade_id in [870,872,873]: - option_deltas[trade_id] = Index.from_tradeid(trade_id) - option_deltas[trade_id].trade_date = datetime.date.today() - index_type = re.search('CDX (\w+) ', option_deltas[trade_id].name).group(1) - series = re.search('\d+', option_deltas[trade_id].name).group(0) - spread = pd.read_sql_query( - "SELECT closespread FROM index_quotes " \ - "WHERE date <= %s and index= %s and series = %s and tenor = '5yr'" \ - "ORDER BY date DESC limit 1", - engine, - params=(option_deltas[trade_id].trade_date, index_type, series)) - option_deltas[trade_id].spread = spread.iloc[0][0] - option_deltas[trade_id].set_original_pv() - - for trade_id in [6]: - options[trade_id] = BlackSwaption.from_tradeid(trade_id, option_deltas[870]) - #options[trade_id].trade_date = datetime.date.today() - options[trade_id].sigma = .5 - options[trade_id].set_original_pv() - #index_type = re.search('CDX (\w+) ', options[trade_id].index.name).group(1) - #series = re.search('\d+', options[trade_id].index.name).group(0) - #import pdb; pdb.set_trace() - - portf = Portfolio([*option_deltas, *options]) - date_range = pd.bdate_range(option_delta.trade_date, pd.Timestamp('2017-05-17') - BDay(), freq = '2B') - vol_shock = np.arange(-0.15, 0.3, 0.01) - spread_shock = np.arange(-0.2, 0.3, 0.01) - 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] - - df = run_portfolio_scenarios(portf, date_range, spread_shock, vol_shock, vol_surface, params=["pnl", "delta"], vol_time_roll=False) - - #plot it - plot_time_color_map(df[round(df.vol_shock,2)==0], option_delta.spread * (1 + spread_shock), 'pnl') - def probabilities(): from scipy.stats import lognorm |
