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