diff options
| -rw-r--r-- | python/exploration/beta_trade.py | 41 | ||||
| -rw-r--r-- | python/index_data.py | 20 |
2 files changed, 23 insertions, 38 deletions
diff --git a/python/exploration/beta_trade.py b/python/exploration/beta_trade.py index 8f6825ef..b26eeedb 100644 --- a/python/exploration/beta_trade.py +++ b/python/exploration/beta_trade.py @@ -11,36 +11,27 @@ from statsmodels.tsa.ar_model import AR import matplotlib.pyplot as plt -def calc_returns(save_feather=False, index_pair=['HY','IG']): - returns = (index_returns(index=['EU','IG', 'HY'],tenor='5yr',years=None). - reset_index(['tenor','series'],drop=True)) - returns1 = {} - returns1[index_pair[0]] = (returns. - xs(index_pair[0], level=1). - dropna(). - groupby(level=['date'], as_index=False). - nth(-1)) - returns1[index_pair[1]] = returns.xs(index_pair[1], level=1) - df = pd.merge(returns1[index_pair[0]],returns1[index_pair[1]], - left_index=True,right_index=True, - suffixes=('_'+index_pair[0],'_'+index_pair[1])) - returns = df[['price_return_'+index_pair[0], 'price_return_'+index_pair[1]]] - returns.columns = [index_pair[0], index_pair[1]] - min_date = max(pd.Timestamp('20090320'),returns.index.min()[0]) - returns = returns.dropna()[min_date:] +def calc_returns(index_list=['HY', 'IG'], save_feather=False): + returns = (index_returns(index=index_list, tenor='5yr', years=None). + reset_index(['tenor','series'], drop=True). + set_index(['date', 'maturity'], append=True). + swaplevel(1, 0)) + returns = returns.unstack(level='index').dropna() + returns = returns.groupby(level='date').nth(-1)['price_return'] if save_feather: feather.write_dataframe(returns.reset_index(), os.path.join(os.environ["DATA_DIR"], "index_returns.fth")) - return returns.reset_index('maturity', drop=True) + return returns -def calc_betas(returns=None, spans=[5, 20], index_pair=['HY','IG']): +def calc_betas(returns=None, spans=[5, 20], index_list=['HY', 'IG']): if returns is None: - returns = calc_returns(index_pair=index_pair) - return [(returns. - ewm(span=span). - cov(). - groupby(level='date'). - apply(lambda df: df.values[0,1]/df.values[1,1])) for span in spans] + returns = calc_returns(index_list=index_list) + + return pd.concat([(returns. + ewm(span=span). + cov(). + groupby(level='date'). + apply(lambda df: df / np.diag(df))) for span in spans], axis=1, keys=spans) def plot_betas(betas=None): spans = [5, 20] diff --git a/python/index_data.py b/python/index_data.py index 3be3b20f..dc97a3ed 100644 --- a/python/index_data.py +++ b/python/index_data.py @@ -113,22 +113,16 @@ def index_returns(df=None, index=None, series=None, tenor=None, from_date=None, pct_change(periods=per)) df.columns = ['spread_return', 'price_return'] df = df.groupby(level=['date', 'index', 'series', 'tenor']).nth(0) - coupon_data = pd.read_sql_query("SELECT index, series, tenor, coupon, maturity FROM " \ + coupon_data = pd.read_sql_query("SELECT index, series, tenor, coupon * 1e-4 AS coupon, maturity FROM " \ "index_maturity WHERE coupon is NOT NULL", _serenitas_engine, index_col=['index', 'series', 'tenor']) - def add_accrued(df): - coupon = coupon_data.loc[df.index[0][1:],'coupon'] * 1e-4 - accrued = (df.index.levels[0].to_series().diff(periods=per). - astype('timedelta64[D]')/360 * coupon) - return df + accrued - - df['price_return'] = (df. - groupby(level=['index', 'series', 'tenor'])['price_return']. - transform(add_accrued)) - - df = df.reset_index().merge(coupon_data.maturity.reset_index(),on=['index','series','tenor']) - df.set_index(['date', 'index', 'series', 'tenor', 'maturity'], inplace=True) + df = df.reset_index('date').join(coupon_data) + df['day_frac'] = (df.groupby(level=['index', 'series', 'tenor'])['date']. + diff(). + astype('timedelta64[D]') / 360) + df['price_return'] += df.day_frac * df.coupon + del df['day_frac'] return df def get_singlenames_quotes(indexname, date): |
