aboutsummaryrefslogtreecommitdiffstats
path: root/python/exploration/curve_trades.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/exploration/curve_trades.py')
-rw-r--r--python/exploration/curve_trades.py57
1 files changed, 54 insertions, 3 deletions
diff --git a/python/exploration/curve_trades.py b/python/exploration/curve_trades.py
index 310cc9a6..154d2595 100644
--- a/python/exploration/curve_trades.py
+++ b/python/exploration/curve_trades.py
@@ -1,15 +1,19 @@
-from analytics.index_data import get_index_quotes, index_returns, _serenitas_engine
+from analytics.index_data import get_index_quotes, index_returns
+from db import dbengine
from analytics import Index, Portfolio
import pandas as pd
import math
import statsmodels.formula.api as smf
+import analytics.basket_index as bkt
import numpy as np
+import matplotlib.pyplot as plt
+
from statsmodels.sandbox.regression.predstd import wls_prediction_std
-import matplotlib.pyplot as plt
+_engine = dbengine('serenitasdb')
def on_the_run(index):
- r = _serenitas_engine.execute("SELECT max(series) FROM index_version WHERE index=%s",
+ r = _engine.execute("SELECT max(series) FROM index_version WHERE index=%s",
(index,))
series, = r.fetchone()
return series
@@ -196,3 +200,50 @@ def spread_fin_crisis(index='IG'):
plt.legend(bbox_to_anchor=(.5, -.1), ncol = 2)
plt.show()
+
+def forward_spread(index = 'IG', series = None):
+
+ if series is None:
+ series = on_the_run(index = index)
+ tenors = ['3yr', '5yr', '7yr', '10yr']
+ b_index = bkt.MarkitBasketIndex(index, series, tenors)
+ b_index.tweak()
+
+ 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()
+
+ return pd.DataFrame(f_spread).transpose()
+
+def spot_forward(index = 'IG', series = None):
+
+ if series is None:
+ series = on_the_run(index = index)
+ tenors = ['3yr', '5yr', '7yr', '10yr']
+ b_index = bkt.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