aboutsummaryrefslogtreecommitdiffstats
path: root/python/pnl_explain.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/pnl_explain.py')
-rw-r--r--python/pnl_explain.py22
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