diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/swaption_pnl.py | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/python/swaption_pnl.py b/python/swaption_pnl.py index f47a233e..3ae5c8bb 100644 --- a/python/swaption_pnl.py +++ b/python/swaption_pnl.py @@ -6,7 +6,7 @@ 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 pandas.tseries.offsets import BDay +from risk.tranches import get_tranche_portfolio from pyisda.date import previous_twentieth from typing import Tuple, Union @@ -90,6 +90,42 @@ def get_swaption_pv( df = pd.DataFrame({"pv": pv, "daily": daily}, index=pd.to_datetime(dates)) return df +def get_tranche_pv( + start_date: datetime.date, end_date: datetime.date, conn: connection, **kwargs +): + dr = pd.bdate_range(start_date, end_date, freq=bus_day) + pv = [] + daily = [] + dates = [] + for d in dr: + prev_day = (d - bus_day).date() + portf = get_tranche_portfolio(prev_day, conn, **kwargs) + nav = 0.0 + # add terminations + with conn.cursor() as c: + c.execute( + "SELECT termination_fee " + "FROM terminations JOIN cds USING (dealid) " + "WHERE termination_date=%s AND dealid LIKE 'SCCDS%%' ", + (prev_day,), + ) + for (fee,) in c: + nav += fee + # add new trades + with conn.cursor() as c: + c.execute( + "SELECT upfront " + "FROM cds WHERE trade_date=%s AND swap_type = 'CD_INDEX_TRANCHE'", + (prev_day,), + ) + for (fee,) in c: + nav += fee + dates.append(prev_day) + pv.append(portf.pv) + daily.append(nav) + df = pd.DataFrame({"pv": pv, "daily": daily}, index=pd.to_datetime(dates)) + return df + if __name__ == "__main__": import argparse @@ -116,13 +152,25 @@ if __name__ == "__main__": help="quote source", ) args = parser.parse_args() + swaption_strats = ("IGTOPTDEL", "HYOPTDEL") + tranche_strats = ("IGINX", "HYINX", "XOINX") + pnl_type = "tranche" + if pnl_type == "tranche": + index_strats = tranche_strats + else: + index_strats = swaption_strats df_index = get_index_pv( - args.start_date, args.end_date, dawndb, ("IGOPTDEL", "HYOPTDEL") + args.start_date, args.end_date, dawndb, tranche_strats ) - df_swaption = get_swaption_pv(conn=dawndb, **vars(args)) + + if pnl_type == "tranche": + df_instrument = get_swaption_pv(conn=dawndb, **vars(args)) + else: + df_instrument = get_tranche_pv(conn=dawndb, **vars(args)) + pnl_index = df_index.pv.diff() + df_index.daily - pnl_swaption = df_swaption.pv.diff() + df_swaption.daily - pnl = pd.concat([pnl_index, pnl_swaption], keys=["index", "swaption"], axis=1) + pnl_instrument = df_instrument.diff() + df_instrument.daily + pnl = pd.concat([pnl_index, pnl_swaption], keys=["index", pnl_type], axis=1) print( pd.concat( [pnl.sum(axis=1), pnl.sum(axis=1).cumsum()], |
