diff options
Diffstat (limited to 'python/exploration/hybb.py')
| -rw-r--r-- | python/exploration/hybb.py | 70 |
1 files changed, 49 insertions, 21 deletions
diff --git a/python/exploration/hybb.py b/python/exploration/hybb.py index e429e84a..3f3e7c97 100644 --- a/python/exploration/hybb.py +++ b/python/exploration/hybb.py @@ -2,14 +2,26 @@ from analytics import on_the_run from analytics.basket_index import BasketIndex from analytics.utils import bus_day from analytics.index_data import index_returns +from utils.db import serenitas_pool import datetime import numpy as np import pandas as pd +from typing import Tuple +from cds_rebook import default_adjustment + +def get_defaulted_info(conn, auction_date: datetime.date) -> Tuple[int, str]: + with conn.cursor() as c: + c.execute("SELECT id, seniority FROM defaulted WHERE auction_date=%s", + (auction_date,)) + cid, seniority = c.fetchone() + conn.commit() + return cid, seniority dr = pd.date_range("2015-09-27", "2019-11-25", freq=bus_day) prices = {} s = -1 index_list = [] +conn = serenitas_pool.getconn() for d in dr: print(d) otr = on_the_run("HY", d) @@ -18,32 +30,48 @@ for d in dr: index_list.append(BasketIndex("HYBB", s, ["5yr"], value_date=d)) for index in index_list: index.value_date = d - prices[(index.series, d)] = 100 * (1 - index.pv()["5yr"]) -hybb = pd.DataFrame.from_dict(prices, orient="index") -hybb.index = pd.MultiIndex.from_tuples(hybb.index) + prices[(index.series, index.version, d)] = 100 * (1 - index.pv()['5yr']) + if index._lastdate == d.date(): + cid, seniority = get_defaulted_info(conn, d.date()) + _, fee = default_adjustment(cid, seniority, index.maturities[0]) + weight = next(w for _, w, c in index.items() if c.defaulted) + old_price = 1 - index.pv()['5yr'] + new_price = (index.factor * old_price - weight * (1 - fee))/(index.factor - weight) + prices[(index.series, index.version + 1, d)] = new_price * 100 +serenitas_pool.putconn(conn) -breakpoint() -hybb.columns = ["HYBB"] -hybb = hybb.pct_change().reset_index(level=0, drop=True) -df = index_returns( - index="HY", - tenor="5yr", - series=[25, 26, 27, 28, 29, 30, 31, 32, 33], - from_date=datetime.date(2015, 9, 27), - years=None, +hybb = pd.DataFrame.from_dict(prices, orient='index') +hybb.index = pd.MultiIndex.from_tuples(hybb.index) +hybb.index.names = ['series', 'version', 'date'] +hybb.columns = ['HYBB'] +hybb = hybb.sort_index() +hybb = hybb.groupby(['series', 'version']).pct_change() +hybb['day_frac'] = hybb.groupby(["series", "version"]).transform( + lambda s: s.index.get_level_values('date').to_series().diff().astype("timedelta64[D]") / 360 ) -hy_returns = df["price_return"].groupby("date").nth(-1) -hy_returns.name = "HY" +hybb["HYBB"] += hybb.day_frac * 0.05 +hybb = hybb.dropna().groupby('date').nth(-1) +df = index_returns(index="HY", tenor="5yr", series=[25, 26, 27, 28, 29, 30, 31, 32, 33], + from_date=datetime.date(2015, 9, 27), + years=None) +df = df["price_return"].reset_index(level=["index", "tenor"], drop=True) -returns = pd.concat([hybb["HYBB"], hy_returns], axis=1) +hy_returns = df.dropna().groupby('date').nth(-1) +hy_returns.name = 'HY' + +returns = pd.concat([hybb['HYBB'], hy_returns], axis=1) # weekly -beta_weekly = ( - returns.ewm(span=5).cov().groupby(level=0).apply(lambda df: df / np.diag(df)) -) +beta_weekly = (returns + .ewm(span=5) + .cov() + .groupby(level=0) + .apply(lambda df: df / np.diag(df))) beta_weekly = beta_weekly.xs("HY", level=1)["HYBB"] ## monthly -beta_monthly = ( - returns.ewm(span=20).cov().groupby(level=0).apply(lambda df: df / np.diag(df)) -) +beta_monthly = (returns + .ewm(span=20) + .cov() + .groupby(level=0) + .apply(lambda df: df / np.diag(df))) beta_monthly = beta_monthly.xs("HY", level=1)["HYBB"] |
