diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/risk/portfolio.py | 147 |
1 files changed, 50 insertions, 97 deletions
diff --git a/python/risk/portfolio.py b/python/risk/portfolio.py index 8a9b3001..05386afe 100644 --- a/python/risk/portfolio.py +++ b/python/risk/portfolio.py @@ -1,16 +1,21 @@ import analytics -import pandas as pd +import numpy as np -from analytics import CreditIndex, Portfolio, BlackSwaptionVolSurface +from analytics import on_the_run, CreditIndex, BlackSwaptionVolSurface from copy import deepcopy -from risk.tranches import get_tranche_portfolio -from risk.swaptions import get_swaption_portfolio -from risk.bonds import subprime_risk, clo_risk, crt_risk -from utils.db import dbconn, dbengine, serenitas_engine, dawn_engine +from .tranches import get_tranche_portfolio +from .swaptions import get_swaption_portfolio +from .bonds import subprime_risk, clo_risk, crt_risk +from .indices import get_index_portfolio +from utils.db import dbconn, dbengine from pandas.tseries.offsets import BDay -def build_portf(position_date, spread_date=None): +def hy_equiv_trade(value_date, notional): + return CreditIndex("HY", on_the_run("HY", value_date), "5yr", value_date, notional) + + +def build_portfolio(position_date, value_date=None, fund="SERCGMAST"): """ Output two portfolios: 1) All synthetic + curve with just delta-proxy + dummy index as cash bonds proxy (portf) @@ -18,107 +23,55 @@ def build_portf(position_date, spread_date=None): """ analytics._local = False - if spread_date is None: - spread_date = position_date - - analytics.init_ontr(spread_date) - conn = dawn_engine.raw_connection() - conn.autocommit = True + if value_date is None: + value_date = position_date - on_the_run_index = analytics._ontr["HY"] - on_the_run_index.value_date = position_date + analytics.init_ontr(value_date) + conn = dbconn("dawndb") + portf = get_tranche_portfolio(position_date, conn, False, fund) + swaption_portf = get_swaption_portfolio(position_date, conn, fund) + portf += swaption_portf + syn_portf = deepcopy(portf) - portf = get_tranche_portfolio(position_date, conn, False, "SERCGMAST") - s_portf = get_swaption_portfolio(position_date, conn) - if bool(s_portf): - for t, id in zip(s_portf.trades, s_portf.trade_ids): - portf.add_trade(t, id) - portf_syn = deepcopy(portf) - - df = pd.read_sql_query( - "SELECT * from list_cds_positions_by_strat(%s)", - dawn_engine, - params=(position_date,), + curve_portf = get_index_portfolio( + position_date, conn, fund, include_strategies="%CURVE" + ) + nocurve_portf = get_index_portfolio( + position_date, conn, fund, exclude_strategies="%CURVE" + ) + portf += nocurve_portf + curve_portf.value_date = value_date + curve_portf.mark() + portf.add_trade( + hy_equiv_trade(value_date, curve_portf.hy_equiv), ("", "curve_trades") ) - if not (df.empty): - for t in df.itertuples(index=False): - portf_syn.add_trade( - CreditIndex( - redcode=t.security_id, maturity=t.maturity, notional=t.notional - ), - (t.folder, t.security_desc), - ) - - df_no_curve = df[~df.folder.str.contains("CURVE")] - for t in df_no_curve.itertuples(index=False): - portf.add_trade( - CreditIndex( - redcode=t.security_id, maturity=t.maturity, notional=t.notional - ), - (t.folder, t.security_desc), - ) - - # separately add in curve delta - df_curve = df[df["folder"].str.contains("CURVE")] - curve_portf = Portfolio( - [ - CreditIndex( - redcode=t.security_id, maturity=t.maturity, notional=t.notional - ) - for t in df_curve.itertuples(index=False) - ] - ) - curve_portf.value_date = spread_date - curve_portf.mark() - - hyontr = deepcopy(on_the_run_index) - hyontr.notional = curve_portf.hy_equiv - portf.add_trade(hyontr, ("curve_trades", "")) - + syn_portf += curve_portf + nocurve_portf # get bond risks: - sql_string = ( - "SELECT distinct timestamp::date FROM priced where normalization = 'current_notional' and model_version = 1 " - "and date(timestamp) <= %s and date(timestamp) >= %s order by timestamp desc" + rmbs_pos = subprime_risk(position_date, conn, dbengine("rmbs_model"),) + crt_pos = crt_risk( + position_date, conn, dbengine("crt"), model_version="hpi5_ir3_btm" ) - with dbconn("etdb") as etconn, dbconn("dawndb") as dawnconn: - timestamps = pd.read_sql_query( - sql_string, - dawn_engine, - parse_dates=["timestamp"], - params=[ - position_date, - position_date - pd.tseries.offsets.DateOffset(15, "D"), - ], - ) - rmbs_pos = subprime_risk( - position_date, - dawnconn, - dbengine("rmbs_model"), - timestamps.iloc[0][0].date(), - ) - clo_pos = clo_risk(position_date, dawnconn, etconn) - crt_pos = crt_risk( - position_date, dawnconn, dbengine("crt"), model_version="hpi5_ir3_btm" + # CRT model version changes with time, need to check + rmbs_notional = ( + rmbs_pos.get("hy_equiv", np.zeros(1)).sum() + + crt_pos.get("hy_equiv", np.zeros(1)).sum() + ) + portf.add_trade(hy_equiv_trade(value_date, -rmbs_notional), ("", "rmbs_bonds")) + with dbconn("etdb") as etconn: + clo_pos = clo_risk(position_date, conn, etconn) + + if clo_pos is not None: + portf.add_trade( + hy_equiv_trade(value_date, -clo_pos["hy_equiv"].sum()), ("", "clo_bonds") ) - # CRT model version changes with time, need to check - rmbs_notional = 0 - for pos in [rmbs_pos, crt_pos]: - rmbs_notional += pos["hy_equiv"].sum() if pos is not None else 0 - hyontr_rmbs = deepcopy(on_the_run_index) - hyontr_rmbs.notional = -rmbs_notional - portf.add_trade(hyontr_rmbs, ("rmbs_bonds", "")) - if isinstance(clo_pos, pd.DataFrame): - hyontr_clos = deepcopy(on_the_run_index) - hyontr_clos.notional = -clo_pos["hy_equiv"].sum() - portf.add_trade(hyontr_clos, ("clo_bonds", "")) - for p in [portf, portf_syn]: - p.value_date = spread_date + for p in [portf, syn_portf]: + p.value_date = value_date p.mark(interp_method="bivariate_linear") p.reset_pv() - return portf, portf_syn + return portf, syn_portf def generate_vol_surface(portf, try_days_back=5): |
