aboutsummaryrefslogtreecommitdiffstats
path: root/python/risk
diff options
context:
space:
mode:
Diffstat (limited to 'python/risk')
-rw-r--r--python/risk/__main__.py6
-rw-r--r--python/risk/indices.py43
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()