diff options
Diffstat (limited to 'python/swaption_pnl.py')
| -rw-r--r-- | python/swaption_pnl.py | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/python/swaption_pnl.py b/python/swaption_pnl.py deleted file mode 100644 index 1f8b994f..00000000 --- a/python/swaption_pnl.py +++ /dev/null @@ -1,181 +0,0 @@ -import datetime -import pandas as pd -from analytics.utils import get_fx -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 -from typing import Tuple, Union - - -def get_index_pv( - start_date: datetime.date, - end_date: datetime.date, - conn: connection, - strategies: Union[Tuple[str], None] = None, -): - dr = pd.bdate_range(start_date, end_date, freq=bus_day) - pvs = [] - daily = [] - dates = [] - - for d in dr: - prev_day = (d - bus_day).date() - if previous_twentieth(d, roll=True) == d.date(): - accrued = 0.0 - for t in portf.trades: - _, amount = t._fee_leg.cashflows[0] - amount *= get_fx(d, t.currency) - accrued -= amount * t.notional * t.factor * t.fixed_rate * 1e-4 - else: - accrued = 0.0 - portf = get_index_portfolio(prev_day, conn, strategies) - nav = 0.0 - with conn.cursor() as c: - try: - c.execute( - "SELECT upfront, currency FROM cds WHERE trade_date=%s " - "AND folder in %s", - (prev_day, strategies), - ) - except SyntaxError as e: - conn.reset() - raise e - for (fee, curr) in c: - nav += fee * get_fx(d, curr) - daily.append(nav + accrued) - pvs.append(portf.pv) - dates.append(prev_day) - df = pd.DataFrame({"pv": pvs, "daily": daily}, index=pd.to_datetime(dates)) - return df - - -def get_swaption_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_swaption_portfolio(prev_day, conn, **kwargs) - nav = 0.0 - # add terminations - with conn.cursor() as c: - c.execute( - "SELECT termination_fee " - "FROM terminations JOIN swaptions USING (dealid) " - "WHERE termination_date=%s AND dealid LIKE 'SWPTN%%' " - "AND folder !='STEEP'", - (prev_day,), - ) - for (fee,) in c: - nav += fee - # add new trades - 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,), - ) - 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 - -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' " - "AND fund='SERCGMAST'", - (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 - from utils.db import dbconn - - dawndb = dbconn("dawndb") - parser = argparse.ArgumentParser() - parser.add_argument("start_date", type=datetime.datetime.fromisoformat) - parser.add_argument("end_date", type=datetime.datetime.fromisoformat) - parser.add_argument( - "-e", - "--external", - action="store_true", - default=False, - dest="use_external", - help="use brokers' marks", - ) - parser.add_argument( - "-s", - "--source", - action="append", - default=[], - dest="source_list", - 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, tranche_strats - ) - - if pnl_type == "tranche": - df_instrument = get_tranche_pv(conn=dawndb, **vars(args)) - else: - df_instrument = get_swaption_pv(conn=dawndb, **vars(args)) - - pnl_index = df_index.pv.diff() + df_index.daily - pnl_instrument = df_instrument.pv.diff() + df_instrument.daily - pnl = pd.concat([pnl_index, pnl_instrument], keys=["index", pnl_type], axis=1) - print( - pd.concat( - [pnl.sum(axis=1), pnl.sum(axis=1).cumsum()], - axis=1, - keys=["daily", "cumulative"], - ) - ) |
