1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
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
import datetime
import numpy as np
import pandas as pd
dr = pd.date_range("2015-09-27", "2019-11-25", freq=bus_day)
prices = {}
s = -1
index_list = []
for d in dr:
print(d)
otr = on_the_run("HY", d)
if otr > s:
s = otr
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)
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,
)
hy_returns = df["price_return"].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 = 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 = beta_monthly.xs("HY", level=1)["HYBB"]
|