diff options
Diffstat (limited to 'python/pnl_explain.py')
| -rw-r--r-- | python/pnl_explain.py | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/python/pnl_explain.py b/python/pnl_explain.py index fe75f429..c2b4cb48 100644 --- a/python/pnl_explain.py +++ b/python/pnl_explain.py @@ -200,7 +200,6 @@ def get_tranche_pv2( df = df.sort_index() strategies = df.folder df = df[["clean_nav", "accrued"]] - df -= df.groupby(level="id")[["clean_nav", "accrued"]].shift(fill_value=0.0) df = df.drop(start_date) with conn.cursor() as c: c.execute( @@ -236,16 +235,21 @@ def get_tranche_pv2( principal = pd.concat([df_terminations, df_upfronts], axis=1).sum(axis=1) principal.name = "principal" df_cashflows = pd.read_sql_query( - "SELECT * FROM tranche_cashflows " "WHERE date BETWEEN %s AND %s", + "SELECT date, principal, accrued, " + "tranche_id FROM tranche_cashflows " + "join cds on tranche_id =id " + "WHERE date BETWEEN %s AND %s " + "and fund = %s", conn, - params=(start_date, end_date), + params=(start_date, end_date, fund), parse_dates=["date"], index_col=["date", "tranche_id"], ).fillna(0.0) df_cashflows.index.names = ["date", "id"] df_cashflows = principal.to_frame().add(df_cashflows, fill_value=0.0) df_cashflows = df_cashflows.rename(columns={"accrued": "realized_accrued"}) - return pd.concat([df, df_cashflows], axis=1).join(strategies).sort_index() + df = pd.concat([df, df_cashflows], axis=1).join(strategies).sort_index() + return df.rename(columns={"clean_nav": "pv"}) def get_pv(**kwargs): @@ -253,7 +257,7 @@ def get_pv(**kwargs): if pnl_type == "swaption": return get_swaption_pv(**kwargs) elif pnl_type == "tranche": - return get_tranche_pv(**kwargs) + return get_tranche_pv2(**kwargs) else: return get_bond_pv(**kwargs) @@ -323,9 +327,13 @@ def get_pnl(df_instrument, asset_class: Literal["bond", "tranche", "swaption"]): if asset_class == "bond": return df_instrument.drop("notional", axis=1).groupby("date").sum().sum(axis=1) elif asset_class == "tranche": - return df_instrument.pv.diff() + df_instrument[["upfront", "accrued"]].sum( - axis=1 + df_pnl = df_instrument.groupby(level="id")[["pv", "accrued"]].diff().sum(axis=1) + cashflows = ( + df_instrument.dropna(subset=["realized_accrued", "principal"], how="all") + .fillna(0) + .sum(axis=1) ) + return pd.concat([df_pnl, cashflows]).groupby("date").sum() elif asset_class == "swaption": return df_instrument.pv.diff() + df_instrument.daily |
