diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/risk/__main__.py | 6 | ||||
| -rw-r--r-- | python/risk/indices.py | 43 |
2 files changed, 24 insertions, 25 deletions
diff --git a/python/risk/__main__.py b/python/risk/__main__.py index 4ec24b32..d47a511c 100644 --- a/python/risk/__main__.py +++ b/python/risk/__main__.py @@ -1,7 +1,7 @@ import argparse import pandas as pd from . import dbconn, dbengine -from pandas.tseries.offsets import BDay +from dates import bus_day from .bonds import subprime_risk, clo_risk, crt_risk, insert_subprime_risk from analytics import init_ontr from .indices import insert_curve_risk @@ -14,7 +14,7 @@ parser.add_argument( ), args = parser.parse_args() if args.workdate is None: - workdate = (pd.Timestamp.today() - BDay()).date() + workdate = (pd.Timestamp.today() - bus_day).date() else: workdate = args.workdate @@ -30,7 +30,7 @@ with dbconn("dawndb") as conn: insert_swaption_portfolio(portf, conn) portf = get_tranche_portfolio(workdate, conn) insert_tranche_portfolio(portf, conn) - insert_curve_risk(workdate, conn, ("SER_IGCURVE", "SER_ITRXCURVE")) + insert_curve_risk(workdate, conn, ("SER_IGCURVE", "SER_ITRXCURVE", "XCURVE")) with dbconn("etdb") as etconn, dbconn("dawndb") as dawnconn: diff --git a/python/risk/indices.py b/python/risk/indices.py index d473ce18..3c074df7 100644 --- a/python/risk/indices.py +++ b/python/risk/indices.py @@ -5,7 +5,7 @@ from analytics.curve_trades import on_the_run from analytics.index_data import index_returns from math import sqrt from psycopg2.extensions import connection -from typing import Tuple +from typing import Tuple, Union def get_index_portfolio( @@ -41,43 +41,40 @@ def get_index_portfolio( return portf -def VaR( - portf: Portfolio, - index_type: str = "IG", - quantile=0.05, - years: int = 5, - period="monthly", -): +def VaR(portf: Portfolio, quantile=0.05, years: int = 5, period="monthly"): + index_types = tuple(set(t.index_type for t in portf)) df = index_returns( - index=index_type, years=years, tenor=["3yr", "5yr", "7yr", "10yr"] - ) - df = df.reset_index(["index"], drop=True).reorder_levels( - ["date", "series", "tenor"] + index=index_types, years=years, tenor=["3yr", "5yr", "7yr", "10yr"] ) + df = df.reorder_levels(["date", "index", "series", "tenor"]) returns = df.spread_return.dropna().reset_index("series") - returns["dist_on_the_run"] = returns.groupby("date")["series"].transform( + returns["dist_on_the_run"] = returns.groupby(["date", "index"])["series"].transform( lambda x: x.max() - x ) del returns["series"] returns = returns.set_index("dist_on_the_run", append=True).unstack("tenor") returns.columns = returns.columns.droplevel(0) + portf.reset_pv() - otr = on_the_run(index_type) spreads = pd.DataFrame( { "spread": portf.spread, "tenor": [ind.tenor for ind in portf.indices], - "dist_on_the_run": [otr - ind.series for ind in portf.indices], + "index": [ind.index_type for ind in portf.indices], + "dist_on_the_run": [ + on_the_run(ind.index_type, portf.value_date) - ind.series + for ind in portf.indices + ], } ) - spreads = spreads.set_index(["dist_on_the_run", "tenor"]) + spreads = spreads.set_index(["index", "dist_on_the_run", "tenor"]) r = [] for k, g in returns.groupby(level="date", as_index=False): - shocks = g.reset_index("date", drop=True).stack("tenor") + shocks = g.reset_index("date", drop=True).stack(["tenor"]) shocks.name = "shocks" - portf.spread = spreads.spread * (1 + spreads.join(shocks).shocks) - r.append((k, portf.pnl)) + portf.spread = spreads.spread * (1 + spreads.join(shocks).shocks).values + r.append((k, portf.local_pnl)) pnl = pd.DataFrame.from_records(r, columns=["date", "pnl"], index=["date"]) if period == "daily": return float(pnl.quantile(quantile)) @@ -98,7 +95,9 @@ def insert_curve_risk(d: datetime.date, conn: connection, strategies=("SER_IGCUR portf = get_index_portfolio( d, conn, (strat,), exclude_redcode=["2I65BYDU6"] ) - index_type = "IG" if "IG" in strat else "EU" - var = VaR(portf, index_type, period="daily") - c.execute(sql_str, (d, strat, var, "USD" if index_type == "IG" else "EUR")) + var = VaR(portf, period="daily") + c.execute(sql_str, (d, strat, var, "USD")) + portf = get_index_portfolio(d, conn, strategies, exclude_redcode=["2I65BYDU6"]) + var = VaR(portf, period="daily") + c.execute(sql_str, (d, "*", var, "USD")) conn.commit() |
