aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/risk/portfolio.py147
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):