aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/pnl_explain.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/python/pnl_explain.py b/python/pnl_explain.py
index a631eeb7..56e35634 100644
--- a/python/pnl_explain.py
+++ b/python/pnl_explain.py
@@ -4,6 +4,7 @@ import serenitas.analytics
from serenitas.analytics.dates import bus_day, prev_business_day, next_business_day
from serenitas.analytics.utils import get_fx
+from serenitas.analytics.api import FxForward
from psycopg2.errors import SyntaxError
from psycopg2.extensions import connection
from risk.swaptions import get_swaption_portfolio
@@ -283,6 +284,28 @@ def get_tranche_pv2(
return pd.concat([df, df_cashflows], axis=1).join(strategies).sort_index()
+def get_fx_pv(start_date: datetime.date, end_date: datetime.date, fund: str, **kwargs):
+ dr = pd.bdate_range(start_date - bus_day, end_date, freq=bus_day)
+ df_pv, df_upfront = {}, {}
+ for d in dr.date:
+ portf = FxForward.get_portfolio(d, fund=fund)
+ df_pv[d] = portf.pv
+ upfront = 0
+ pv = 0
+ for t in portf.trades:
+ if t.settle_date == d:
+ upfront += t.pnl
+ else:
+ pv += t.pnl
+ df_upfront[d] = upfront
+ df_pv[d] = pv
+ df_pv = pd.DataFrame.from_dict(df_pv, orient="index", columns=["pv"])
+ df_upfront = pd.DataFrame.from_dict(
+ df_upfront, orient="index", columns=["net_settle"]
+ )
+ return pd.concat([df_pv, df_upfront], axis=1)
+
+
def get_pv(**kwargs):
pnl_type = kwargs.pop("pnl_type")
if "pv2" in kwargs: