diff options
Diffstat (limited to 'python/exploration')
| -rw-r--r-- | python/exploration/curve_trades.py | 59 |
1 files changed, 25 insertions, 34 deletions
diff --git a/python/exploration/curve_trades.py b/python/exploration/curve_trades.py index 154d2595..b6d35d3d 100644 --- a/python/exploration/curve_trades.py +++ b/python/exploration/curve_trades.py @@ -1,10 +1,12 @@ from analytics.index_data import get_index_quotes, index_returns from db import dbengine from analytics import Index, Portfolio +from analytics.utils import roll_date +from dateutil.relativedelta import relativedelta import pandas as pd import math import statsmodels.formula.api as smf -import analytics.basket_index as bkt +from analytics.basket_index import MarkitBasketIndex import numpy as np import matplotlib.pyplot as plt @@ -201,49 +203,38 @@ def spread_fin_crisis(index='IG'): plt.show() -def forward_spread(index = 'IG', series = None): +def forward_spread(index='IG', series=None, tenors=['3yr', '5yr', '7yr', '10yr']): if series is None: series = on_the_run(index = index) - tenors = ['3yr', '5yr', '7yr', '10yr'] - b_index = bkt.MarkitBasketIndex(index, series, tenors) + b_index = MarkitBasketIndex(index, series, tenors) b_index.tweak() - f_spread = {} + f_spread = [] date_range = pd.bdate_range(pd.datetime.today(), max(b_index.maturities), freq='M') for d in date_range.date: b_index.trade_date = d - f_spread[d] = b_index.spread() + f_spread.append(b_index.spread()) + return pd.concat(f_spread, keys=date_range).unstack(-1) - return pd.DataFrame(f_spread).transpose() - -def spot_forward(index = 'IG', series = None): +def spot_forward(index='IG', series=None, tenors=['3yr', '5yr', '7yr', '10yr']): if series is None: - series = on_the_run(index = index) - tenors = ['3yr', '5yr', '7yr', '10yr'] - b_index = bkt.MarkitBasketIndex(index, series, tenors) + series = on_the_run(index) + b_index = MarkitBasketIndex(index, series, tenors) b_index.tweak() - spread = b_index.spread() - new_maturity = [(d - pd.DateOffset(years=1)).date() for d in b_index.maturities] - new_duration = {} - for i, m in enumerate(new_maturity): - new_duration[b_index.index_desc.tenor[i]] = b_index.duration(m) - dur_df = pd.Series(new_duration) - - one_yr = (b_index.trade_date + pd.DateOffset(years=1)).date() - one_yr_pv = b_index.pv(one_yr, coupon = b_index.index_desc.coupon[0]) - one_yr_dur = b_index.duration((b_index.trade_date + pd.DateOffset(years=1)).date()) - new_spread = ((b_index.pv() - b_index.theta() + b_index.index_desc.coupon[0])/ dur_df + b_index.index_desc.coupon[0])* 1e4 - - df = pd.DataFrame(dict(today_spread=spread, spread_in_one_year=new_spread)) - df.index.name = 'tenor' - df = df.reset_index().merge(b_index.index_desc.tenor.reset_index(), on='tenor') - df.loc[-2] = ['0yr', 0, 0, b_index.trade_date] - df.loc[-1] = ['1yr', 0, (one_yr_pv/one_yr_dur + b_index.index_desc.coupon[0])*1e4, one_yr] - - df['maturity'] = pd.to_datetime(df['maturity']) - df = df.sort_values('maturity') - - return df.set_index('maturity')
\ No newline at end of file + spreads_current = b_index.spread() + spreads_current.name = 'current' + spreads_1yr = pd.Series([b_index.spread(m - relativedelta(years=1), b_index.coupon(m)) \ + for m in b_index.maturities], index=tenors) + spreads_1yr.name = '1yr' + df = pd.concat([spreads_current, spreads_1yr], axis=1) + maturity_1yr = roll_date(b_index.index_desc.issue_date[0], 1) + df_0 = pd.DataFrame({'current':[0., b_index.spread(maturity_1yr, + 0.01 if index == "IG" else 0.05)], + '1yr': [0., 0.]}, index=['0yr', '1yr']) + df_0.index.name = 'tenor' + df = df_0.append(df) + df['maturity'] = [b_index.trade_date, maturity_1yr] + b_index.maturities + return df.reset_index().set_index('maturity') |
