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