diff options
| -rw-r--r-- | python/pnl_explain.py | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/python/pnl_explain.py b/python/pnl_explain.py index 2bb3df82..984f1c34 100644 --- a/python/pnl_explain.py +++ b/python/pnl_explain.py @@ -1,13 +1,13 @@ import datetime import pandas as pd -from analytics.utils import get_fx +from analytics.utils import get_fx, prev_business_day from dates import bus_day from psycopg2.errors import SyntaxError from psycopg2.extensions import connection from risk.swaptions import get_swaption_portfolio from risk.indices import get_index_portfolio from risk.tranches import get_tranche_portfolio -from pyisda.date import previous_twentieth, cds_accrued +from pyisda.date import previous_twentieth from typing import Literal, Tuple, Union @@ -170,11 +170,12 @@ def get_tranche_pv( index=pd.to_datetime(dates), ) defaults = pd.DataFrame( - {"upfront": [963398.61 * 3, 738908.68 * 3, 990427.08 * 3]}, + {"upfront": [963398.61 * 3, 738908.68 * 3, 990427.08 * 3, 990260.59 * 3]}, index=[ pd.Timestamp("2020-06-01"), pd.Timestamp("2020-06-10"), pd.Timestamp("2020-06-25"), + pd.Timestamp("2020-07-08"), ], ) return df.sub(defaults, fill_value=0.0) @@ -187,6 +188,7 @@ def get_tranche_pv2( conn: connection, **kwargs, ): + start_date = prev_business_day(start_date) df = pd.read_sql_query( "SELECT date, tranche_id AS id, clean_nav, accrued, folder " "FROM tranche_risk " @@ -322,13 +324,28 @@ def get_bond_pv( return df -def get_pnl(df_instrument, asset_class: Literal["bond", "tranche", "swaption"]): +def get_pnl( + df_instrument, asset_class: Literal["bond", "tranche", "swaption"], pv2=False +): 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 - ) + if pv2: + df_pnl = df_instrument.copy().fillna(0.0) + df_pnl[["clean_nav", "accrued"]] -= ( + df_pnl[["clean_nav", "accrued"]] + .groupby(level="id") + .shift(fill_value=0.0) + ) + df_pnl = df_pnl.rename( + columns={"clean_nav": "unrealized_mtm", "accrued": "unrealized_accrued"} + ) + df_pnl = df_pnl.drop(df_pnl.index.get_level_values("date")[0]) + return df_pnl.groupby(level="date").sum().sum(axis=1) + else: + return df_instrument.pv.diff() + df_instrument[["upfront", "accrued"]].sum( + axis=1 + ) elif asset_class == "swaption": return df_instrument.pv.diff() + df_instrument.daily |
