aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/tranche_data.py45
1 files changed, 32 insertions, 13 deletions
diff --git a/python/analytics/tranche_data.py b/python/analytics/tranche_data.py
index e3c2de96..b27b09f5 100644
--- a/python/analytics/tranche_data.py
+++ b/python/analytics/tranche_data.py
@@ -45,7 +45,7 @@ def get_tranche_quotes(
sql_str = (
"SELECT * from "
"(SELECT quotedate as date, b.index, b.series, a.tenor, b.version, "
- "a.attach, a.detach, (1-upfront_mid) as close_price, a.index_price, indexfactor, "
+ "a.attach, a.detach, (1-upfront_mid) as close_price, a.index_price, indexfactor/100 as indexfactor, "
"cumulativeloss, c.delta, a.tranche_spread "
"from markit_tranche_quotes a "
"left join index_version b using (basketid)"
@@ -75,12 +75,14 @@ def get_tranche_quotes(
df.sort_index(inplace=True)
df = df.assign(
attach_adj=lambda x: np.maximum(
- (x.attach - x.cumulativeloss) / df.indexfactor, 0
+ (x.attach - x.cumulativeloss) / (x.indexfactor * 100), 0
),
detach_adj=lambda x: np.minimum(
- (x.detach - x.cumulativeloss) / df.indexfactor, 1
+ (x.detach - x.cumulativeloss) / (x.indexfactor * 100), 1
),
+ orig_thickness=lambda x: (x.detach - x.attach) / 100,
adj_thickness=lambda x: x.detach_adj - x.attach_adj,
+ tranche_factor=lambda x: x.adj_thickness * x.indexfactor / x.orig_thickness,
)
df.set_index("attach", append=True, inplace=True)
# get rid of US holidays
@@ -130,24 +132,41 @@ def tranche_returns(
day_frac = g["date_1"].transform(
lambda s: s.diff().astype("timedelta64[D]") / 360
)
- tranche_return = g.close_price.shift(0) * g.adj_thickness.shift(
- 0
- ) / g.adj_thickness.shift(1) - g.close_price.shift(1)
- index_return = g.index_price.diff()
+ index_loss = g.cumulativeloss - g.cumulativeloss.shift(1)
+ tranche_loss = np.maximum(
+ (
+ g.orig_thickness * g.indexfactor
+ - g.orig_thickness.shift(1) * g.indexfactor.shift(1)
+ )
+ / g.orig_thickness,
+ 0,
+ )
+ tranche_return = (
+ 1
+ - ((1 - g.close_price) * g.tranche_factor - tranche_loss)
+ / g.tranche_factor.shift(1)
+ - g.close_price.shift(1)
+ )
+ index_return = (
+ 1
+ - ((1 - g.index_price) * g.indexfactor - index_loss)
+ / g.indexfactor.shift(1)
+ - g.index_price.shift(1)
+ )
tranche_return += day_frac * g.tranche_spread / 10000
index_return += day_frac * g.coupon
- deladj_return = tranche_return - g.delta.shift(1) * index_return
+ delhedged_return = (
+ tranche_return - g.delta.shift(1) * index_return * g.indexfactor
+ )
returns.append(
pd.concat(
- [index_return, tranche_return, deladj_return],
+ [index_return, tranche_return, delhedged_return],
axis=1,
- keys=["index_return", "tranche_return", "deladj_return"],
+ keys=["index_return", "tranche_return", "delhedged_return"],
)
)
df = df.merge(pd.concat(returns), left_index=True, right_index=True, how="left")
- df = df.drop(
- ["date_1", "tranche_spread", "cumulativeloss", "detach", "coupon"], axis=1
- )
+ df = df.drop(["date_1", "tranche_spread", "detach", "coupon"], axis=1)
return df