import pandas as pd from exchange import ExchangeMessage from importlib import import_module from utils import SerenitasFileHandler from utils.db import dawn_engine, dbconn from .common import get_dawn_trades, send_email from pandas.tseries.offsets import BDay import argparse import datetime 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=datetime.datetime.fromisoformat, default=datetime.date.today(), ) 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", "baml_isda", "ms", "gs", "bnp", "baml_fcm", "wells", "cs"] if args.download: em = ExchangeMessage() for cp in counterparties: cp_mod = import_module(f".{cp}", "collateral") for fund in ("Serenitas", "Brinker", "BowdSt"): cp_mod.download_files(em, fund=fund) dawn_trades = get_dawn_trades(args.workdate, dawn_engine) df = {} mapping = {"baml_fcm": "BAML", "wells": "WF"} args.workdate -= BDay() for cp in counterparties: 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 lookback = 0 while lookback < 2: try: df[cp.upper()] = cp_mod.collateral( args.workdate - BDay(lookback), positions, engine=dawn_engine ) except FileNotFoundError as e: logger.info(e) lookback += 1 except ValueError as e: logger.error(e) break else: break 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)