aboutsummaryrefslogtreecommitdiffstats
path: root/python/swaption_pnl.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/swaption_pnl.py')
-rw-r--r--python/swaption_pnl.py181
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"],
- )
- )