aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/pnl_explain.py53
1 files changed, 36 insertions, 17 deletions
diff --git a/python/pnl_explain.py b/python/pnl_explain.py
index c5d27b49..05102cd0 100644
--- a/python/pnl_explain.py
+++ b/python/pnl_explain.py
@@ -20,12 +20,15 @@ def get_index_pv(
):
dr = pd.bdate_range(start_date, end_date, freq=bus_day)
pvs = []
- daily = []
+ upfronts = []
+ accrueds = []
dates = []
for d in dr:
prev_day = (d - bus_day).date()
- if previous_twentieth(d, roll=True) == d.date():
+ if (
+ previous_twentieth(prev_day, roll=True) == prev_day
+ ): # this is a payment date
accrued = 0.0
for t in portf.trades:
_, amount = t._fee_leg.cashflows[0]
@@ -47,10 +50,14 @@ def get_index_pv(
raise e
for (fee, curr) in c:
nav += fee * get_fx(prev_day, curr)
- daily.append(nav + accrued)
+ upfronts.append(nav)
+ accrueds.append(accrued)
pvs.append(portf.pv)
dates.append(prev_day)
- df = pd.DataFrame({"pv": pvs, "daily": daily}, index=pd.to_datetime(dates))
+ df = pd.DataFrame(
+ {"pv": pvs, "upfront": upfronts, "accrued": accrueds},
+ index=pd.to_datetime(dates),
+ )
return df
@@ -67,7 +74,7 @@ def get_swaption_pv(
dates = []
for d in dr:
prev_day = (d - bus_day).date()
- portf = get_swaption_portfolio(prev_day, conn, **kwargs)
+ portf = get_swaption_portfolio(prev_day, conn, fund, **kwargs)
nav = 0.0
# add terminations
with conn.cursor() as c:
@@ -75,8 +82,8 @@ def get_swaption_pv(
"SELECT termination_fee "
"FROM terminations JOIN swaptions USING (dealid) "
"WHERE termination_date=%s AND dealid LIKE 'SWPTN%%' "
- "AND folder !='STEEP'",
- (prev_day,),
+ "AND folder !='STEEP' AND fund = %s",
+ (prev_day, fund),
)
for (fee,) in c:
nav += fee
@@ -84,15 +91,21 @@ def get_swaption_pv(
with conn.cursor() as c:
c.execute(
"SELECT notional * price/100 * (CASE WHEN buysell THEN -1. ELSE 1. END) "
- "FROM swaptions WHERE trade_date=%s AND folder != 'STEEP'",
- (prev_day,),
+ "FROM swaptions WHERE trade_date=%s AND folder != 'STEEP' AND fund=%s",
+ (prev_day, fund),
)
for (fee,) in c:
nav += fee
dates.append(prev_day)
- pv.append(portf.pv)
+ if portf:
+ pv.append(portf.pv)
+ else:
+ pv.append(0.0)
daily.append(nav)
- df = pd.DataFrame({"pv": pv, "daily": daily}, index=pd.to_datetime(dates))
+ df = pd.DataFrame(
+ {"pv": pv, "upfront": upfronts, "accrued": accrueds},
+ index=pd.to_datetime(dates),
+ )
return df
@@ -105,11 +118,12 @@ def get_tranche_pv(
):
dr = pd.bdate_range(start_date, end_date, freq=bus_day)
pv = []
- daily = []
+ upfronts = []
+ accrueds = []
dates = []
for d in dr:
prev_day = (d - bus_day).date()
- if previous_twentieth(d, roll=True) == d.date():
+ if previous_twentieth(prev_day, roll=True) == prev_day:
amount = cds_accrued(prev_day, 1.0, True)
accrued = 0.0
for t in portf.trades:
@@ -147,8 +161,11 @@ def get_tranche_pv(
nav += fee * get_fx(prev_day, currency)
dates.append(prev_day)
pv.append(portf.pv)
- daily.append(nav + accrued)
- df = pd.DataFrame({"pv": pv, "daily": daily}, index=pd.to_datetime(dates))
+ upfronts.append(nav)
+ accrueds.append(accrued)
+ df = pd.DataFrame(
+ {"pv": pv, "upfront": upfronts, "accrued": accrued}, index=pd.to_datetime(dates)
+ )
return df
@@ -326,12 +343,14 @@ if __name__ == "__main__":
}
if args.pnl_type in ("tranche", "swaption"):
df_instrument = get_pv(conn=dawndb, **vars(args))
- pnl_instrument = df_instrument.pv.diff() + df_instrument.daily
+ pnl_instrument = df_instrument.pv.diff() + df_instrument[
+ ["upfront", "accrued"]
+ ].sum(axis=1)
if args.pnl_type != "bond":
df_index = get_index_pv(
args.start_date, args.end_date, args.fund, dawndb, strats[args.pnl_type]
)
- pnl_index = df_index.pv.diff() + df_index.daily
+ pnl_index = df_index.pv.diff() + df_index[["upfront", "accrued"]].sum(axis=1)
if args.pnl_type in ("tranche", "swaption"):
pnl = pd.concat(