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