aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/risk/__main__.py11
-rw-r--r--python/risk/subprime.py71
2 files changed, 81 insertions, 1 deletions
diff --git a/python/risk/__main__.py b/python/risk/__main__.py
index acc07be3..01e0e052 100644
--- a/python/risk/__main__.py
+++ b/python/risk/__main__.py
@@ -1,7 +1,8 @@
import argparse
import pandas as pd
-from db import dbconn
+from db import dbconn, dbengine
from pandas.tseries.offsets import BDay
+from .subprime import get_rmbs_portfolio, subprime_risk
from .swaptions import get_swaption_portfolio, insert_swaption_portfolio
parser = argparse.ArgumentParser()
@@ -12,6 +13,14 @@ if args.workdate is None:
workdate = (pd.Timestamp.today()-BDay()).date()
else:
workdate = args.workdate
+
with dbconn('dawndb') as conn:
portf = get_swaption_portfolio(workdate, conn, source_list=["GS"])
insert_swaption_portfolio(portf, conn)
+ portf = get_rmbs_portfolio(workdate, conn)
+ crt_portf = portf[portf.strategy.str.contains("CRT")]
+ subprime_portf = portf[~portf.strategy.str.contains("CRT")]
+ subprime_portf_zero = subprime_portf[subprime_portf.identifier.str.endswith("_A")]
+ subprime_portf = subprime_portf[~subprime_portf.identifier.str.endswith("_A")]
+ df = subprime_risk(workdate)
+ subprime_portf = subprime_portf.join(df)
diff --git a/python/risk/subprime.py b/python/risk/subprime.py
new file mode 100644
index 00000000..84f5c70e
--- /dev/null
+++ b/python/risk/subprime.py
@@ -0,0 +1,71 @@
+import pandas as pd
+from . import mysql_engine
+
+def latest_sim(date):
+ sql_string = (
+ "SELECT model_id_sub FROM model_versions "
+ "JOIN model_versions_nonagency USING (model_id_sub) "
+ "JOIN simulations_nonagency USING (simulation_id) "
+ "WHERE (date(start_time) <= %s) AND (description = 'normal') "
+ "ORDER BY start_time DESC")
+ conn = mysql_engine.raw_connection()
+ c = conn.cursor()
+ c.execute(sql_string, (date,))
+ model_id_sub, = next(c)
+ c.close()
+ return model_id_sub
+
+def get_df(date):
+ model_id_sub = latest_sim(date)
+ df_prices = pd.read_sql_query(
+ "SELECT cusip, model_version, pv, modDur, delta_yield, "
+ "wal, pv_io, pv_po, pv_RnW, delta_ir_io, delta_ir_po, "
+ "delta_hpi, delta_RnW, delta_mult, delta_ir, pv_FB "
+ "FROM priced WHERE "
+ "timestamp BETWEEN %s AND date_add(%s, INTERVAL 1 DAY) "
+ "AND model_id_sub=%s "
+ "AND normalization='current_notional'",
+ mysql_engine,
+ ["cusip", "model_version"],
+ params=(date, date, model_id_sub))
+ df_percentiles = pd.read_sql_query("SELECT cusip, PV, percentile "
+ "FROM priced_percentiles WHERE "
+ "timestamp BETWEEN %s AND date_add(%s, INTERVAL 1 DAY) "
+ "AND model_version=3 "
+ "AND model_id_sub=%s "
+ "AND percentile IN (5, 25, 50, 75, 95) "
+ "AND normalization='current_notional'",
+ mysql_engine,
+ ["cusip", "percentile"],
+ params=(date, date, model_id_sub))
+ df_prices = df_prices.unstack("model_version")
+ df_percentiles = df_percentiles.unstack("percentile")
+ return df_prices.join(df_percentiles, how="left")
+
+def subprime_risk(date):
+ df = get_df(date)
+ df_pv = df.xs('pv', axis=1, level=0)
+ df_pv.columns = ['pv1', 'pv2', 'pv3']
+ df_pv_perct = df.xs('PV', axis=1, level=0)
+ df_pv_perct.columns = ['pv5', 'pv25', 'pv50', 'pv75', 'pv95']
+ df_modDur = df[('modDur', 1)]
+ df_modDur.name = 'modDur'
+ df_v1 = df.xs(1, axis=1, level='model_version')[
+ ['pv_RnW', 'delta_mult', 'delta_hpi', 'delta_ir']]
+ df_v1.columns = ['v1pv_RnW', 'v1_lsdel', 'v1_hpidel', 'v1_irdel']
+ df_pv_FB = df[('pv_FB', 3)]
+ df_pv_FB.name = 'pv_FB'
+ return pd.concat([df_pv, df_modDur, df_pv_perct,
+ df.xs(3, axis=1, level='model_version')[
+ ['delta_yield', 'wal', 'pv_io', 'pv_po', 'pv_RnW', 'delta_ir_io',
+ 'delta_ir_po', 'delta_hpi', 'delta_RnW', 'delta_mult']],
+ df_v1, df_pv_FB],
+ axis=1)
+
+def get_rmbs_portfolio(date, conn, fund="SERCGMAST",
+ include_unsettled=True):
+ df = pd.read_sql_query("SELECT * FROM list_positions(%s, 'Subprime', %s, %s)",
+ conn, params=(date, include_unsettled, fund))
+ df["cusip"] = df.identifier.str.slice(0, 9)
+ df = df.set_index("cusip")
+ return df