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