diff options
Diffstat (limited to 'python/collateral/__main__.py')
| -rw-r--r-- | python/collateral/__main__.py | 85 |
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) |
