diff options
Diffstat (limited to 'python/risk/indices.py')
| -rw-r--r-- | python/risk/indices.py | 43 |
1 files changed, 21 insertions, 22 deletions
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() |
