aboutsummaryrefslogtreecommitdiffstats
path: root/python/collateral/__main__.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/collateral/__main__.py')
-rw-r--r--python/collateral/__main__.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/python/collateral/__main__.py b/python/collateral/__main__.py
new file mode 100644
index 00000000..3a326f27
--- /dev/null
+++ b/python/collateral/__main__.py
@@ -0,0 +1,85 @@
+import pandas as pd
+
+from importlib import import_module
+from utils import SerenitasFileHandler
+from utils.db import dawn_engine, dbconn
+
+from . import bus_day
+from .common import get_dawn_trades, send_email
+from pandas.tseries.offsets import BDay
+
+import argparse
+import logging
+
+fh = SerenitasFileHandler("collateral_calc.log")
+logger = logging.getLogger("collateral_calc")
+logger.addHandler(fh)
+logger.setLevel(logging.WARNING)
+
+parser = argparse.ArgumentParser()
+parser.add_argument(
+ "workdate",
+ nargs="?",
+ type=lambda s: pd.datetime.strptime(s, "%Y-%m-%d").date(),
+ default=pd.Timestamp.today().normalize(),
+)
+parser.add_argument(
+ "-d", "--download", action="store_true", help="download counterparty reports"
+)
+parser.add_argument(
+ "-s", "--send-email", action="store_true", help="send email to Globeop"
+)
+args = parser.parse_args()
+counterparties = ["citi", "ms", "gs", "baml_fcm", "wells"]
+
+if args.download:
+ for cp in counterparties:
+ cp_mod = import_module(f".{cp}", "collateral")
+ cp_mod.download_files()
+
+dawn_trades = get_dawn_trades(args.workdate, dawn_engine)
+
+df = {}
+mapping = {"baml_fcm": "BAML", "wells": "WF"}
+for cp in counterparties:
+ print(cp)
+ cp_mod = import_module("." + cp, "collateral")
+ if cp in ["baml_fcm", "wells"]:
+ positions = pd.read_sql_query(
+ "SELECT security_id, security_desc, maturity, "
+ "folder, notional, currency "
+ "FROM list_cds_positions_by_strat_fcm(%s, %s)",
+ dawn_engine,
+ params=(args.workdate.date(), mapping[cp]),
+ index_col=["security_id", "maturity"],
+ )
+ else:
+ positions = dawn_trades
+ try:
+ df[cp.upper()] = cp_mod.collateral(args.workdate, positions, dawn_engine)
+ except FileNotFoundError as e:
+ logger.info(e)
+ df[cp.upper()] = cp_mod.collateral(
+ args.workdate - bus_day, positions, dawn_engine
+ )
+ except ValueError as e:
+ logger.error(e)
+ if cp == "citi":
+ args.workdate = args.workdate - BDay()
+
+df = pd.concat(df, names=["broker", "strategy"]).reset_index()
+df.strategy = df.strategy.str.replace("^(M_|SER_)?", "", 1)
+df = df[["date", "broker", "strategy", "Amount", "Currency"]]
+conn = dbconn("dawndb")
+sql_str = (
+ "INSERT INTO strategy_im VALUES(%s, %s, %s, %s, %s) "
+ "ON CONFLICT (date, strategy, broker) DO UPDATE "
+ "SET currency=EXCLUDED.currency, amount=EXCLUDED.amount"
+)
+with conn.cursor() as c:
+ for t in df.itertuples(index=False):
+ c.execute(sql_str, t)
+conn.commit()
+conn.close()
+if args.send_email:
+ send_email(args.workdate, df)