diff options
Diffstat (limited to 'python/analytics/tranche_data.py')
| -rw-r--r-- | python/analytics/tranche_data.py | 45 |
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 |
