diff options
Diffstat (limited to 'python/pnl_explain.py')
| -rw-r--r-- | python/pnl_explain.py | 53 |
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( |
