import datetime import argparse from serenitas.utils.db import dbconn from serenitas.analytics.dates import prev_business_day from collateral.citi import get_total_collateral as get_collateral_citi from report_ops.utils import MarginEstimatesMonitor cp_mapping = { "MS": "Morgan Stanley", "GS": "Goldman Sachs", "BOMLCM": "Baml FCM", "BAML_ISDA": "Baml OTC", "WELLS": "Wells Fargo", "BNP": "BNP Paribas", "JPM": "JP Morgan", "WELLSFCM": "Wells Fargo FCM", "BARCLAYS": "Barclays", } def get_excess_values(date, conn): with conn.cursor() as c: sql = ( "SELECT date, broker, -sum(amount) as excess, currency " "FROM strategy_im " "WHERE strategy='CSH_CASH' " "GROUP BY broker, date, fund, currency " "HAVING date=%s AND fund='SERCGMAST' AND broker NOT in ('CS', 'CITI')" ) c.execute(sql, (args.date,)) for row in c: d = row._asdict() | {"counterparty": cp_mapping[row.broker]} yield d sql = ( "SELECT date, custodian, current_excess_deficit AS excess, 'USD' as currency " "FROM fcm_moneyline fm LEFT JOIN accounts ON account=cash_account " "WHERE date=%s AND fund='SERCGMAST' AND currency='ZZZZZ'" ) c.execute(sql, (args.date,)) for row in c: d = row._asdict() | {"counterparty": cp_mapping[row.custodian]} yield d for counterparty, excess in zip( ["CITI Variation Margin", "CITI Initial Margin"], get_collateral_citi(args.date)[2:], ): yield { "date": args.date, "counterparty": counterparty, "currency": "USD", "excess": excess, } if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument( "date", nargs="?", default=prev_business_day(datetime.date.today()), type=datetime.date.fromisoformat, ) args = parser.parse_args() conn = dbconn("dawndb") for d in get_excess_values(args.date, conn): MarginEstimatesMonitor.stage(d) MarginEstimatesMonitor.email(args.date)