diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/parse_baml_swaption.py | 83 |
1 files changed, 44 insertions, 39 deletions
diff --git a/python/parse_baml_swaption.py b/python/parse_baml_swaption.py index f72d407b..d6bac38d 100644 --- a/python/parse_baml_swaption.py +++ b/python/parse_baml_swaption.py @@ -1,12 +1,13 @@ from serenitas.utils.exchange import ExchangeMessage import pandas as pd -from serenitas.utils.db import dawn_engine -from sqlalchemy.exc import IntegrityError +from serenitas.utils.db2 import dbconn +from psycopg.errors import UniqueViolation import datetime import logging import argparse import re from serenitas.ops.trade_dataclasses import CreditSwaptionDeal, desc_str +from serenitas.ops.dataclass_mapping import Fund parser = argparse.ArgumentParser() parser.add_argument( @@ -41,7 +42,7 @@ columns = [ # Counterparty Ticket to Database -_baml_funds = { +_baml_funds: dict[str, Fund] = { "LMIL-Boston Patriot Bowdoin St LLC": "BOWDST", "Iso Selene Inc.": "ISOSEL", "Serenitas Credit Gamma Master Fund LP": "SERCGMAST", @@ -70,9 +71,7 @@ def from_baml_email(d: dict, conn): return CreditSwaptionDeal( buysell=buysell, - fund=_baml_funds[d["Index Buyer"]] - if buysell - else _baml_funds[d["Index Seller"]], + fund=_baml_funds[d[f"Index {'Buyer' if buysell else 'Seller'}"]], cp_code="BAMSNY", portfolio="OPTIONS", folder=index + ("PAYER" if d["Option Type"] == "Payer" else "REC"), @@ -99,37 +98,43 @@ def from_baml_email(d: dict, conn): ) -em = ExchangeMessage() -start = datetime.datetime.combine(args.workdate, datetime.time.min).replace( - tzinfo=em._account.default_timezone -) -for msg in em.get_msgs( - path=["AutoBook", "BAML Swaption"], datetime_received__gte=start -): - dfs = pd.read_html(msg.body) - tickets = [] - for ticket in dfs: - if len(ticket[0]) > 5: - ticket = ticket.set_index(0).to_dict()[1] - if "Block" in ticket or "Unwind Price" in ticket: - continue - tickets.append(ticket) - trade = from_baml_email(ticket, dawn_engine.raw_connection()) - trade.stage() +if __name__ == "__main__": + dawndb = dbconn("dawndb") + em = ExchangeMessage() + start = datetime.datetime.combine(args.workdate, datetime.time.min).replace( + tzinfo=em._account.default_timezone + ) + for msg in em.get_msgs( + path=["AutoBook", "BAML Swaption"], datetime_received__gte=start + ): + dfs = pd.read_html(msg.body) + tickets = [] + for ticket in dfs: + if len(ticket[0]) > 5: + ticket = ticket.set_index(0).to_dict()[1] + if "Block" in ticket or "Unwind Price" in ticket: + continue + tickets.append(ticket) + trade = from_baml_email(ticket, dawndb) + trade.stage() - df = pd.DataFrame.from_dict(tickets) - df.columns = df.columns.str.lower().str.replace(" ", "_") - if "collateral" in df.columns: - additional_columns = ["collateral"] - else: - additional_columns = [] - df = df[columns + additional_columns] - try: - df.to_sql( - "baml_swaption_ticket", index=False, con=dawn_engine, if_exists="append" - ) - except IntegrityError as e: - logger.warning(e) - CreditSwaptionDeal._insert_queue.clear() - else: - CreditSwaptionDeal.commit() + df = pd.DataFrame.from_dict(tickets) + df.columns = df.columns.str.lower().str.replace(" ", "_") + if "collateral" in df.columns: + additional_columns = ["collateral"] + else: + additional_columns = [] + df = df[columns + additional_columns] + place_holders = ",".join(["%s"] * len(df.columns)) + try: + with dawndb.cursor() as c: + c.executemany( + f"INSERT INTO baml_swaption_ticket({','.join(df.columns)})" + f"VALUES ({place_holders})", + df.itertuples(index=False), + ) + except UniqueViolation as e: + logger.warning(str(e)) + CreditSwaptionDeal._insert_queue.clear() + else: + CreditSwaptionDeal.commit() |
