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