from serenitas.utils.env import DAILY_DIR from serenitas.utils.remote import SftpClient from zoneinfo import ZoneInfo import datetime import csv from trade_dataclasses import CDSDeal, BondDeal from decimal import Decimal _funds = {"SERENITAS_CGMF": "SERCGMAST", "BOWDOINST": "BOWDST"} _fcms = {"Bank of America, N.A.": "BAML", "Goldman Sachs": "GS"} _cdx_cp = { "MSDU": "MSCSNY", "GSMX": "GOLDNY", "JPGP": "JPCBNY", "JFF": "JEFF", "BMLE": "BAMSNY", "BARX": "BARCNY", "CSDA": "CSFBBO", "EBNP": "BNPBNY", "WFCD": "WELFEI", "BSEF": "BSEONY", "JPOS": "JPCBNY", "CGCI": "CITINY", } _bond_cp = { "CG": "CITINY", "WFBS": "WELFEI", "MZZ": "MIZUNY", "BABS": "BAML", "PTRU": "PERFCH", "BARC": "BARCNY", "MS": "MORGNY", "BA": "BAML", "FB": "CSUINY", "INTC": "STONEX", "SOCG": "SGSANY", "NOM": "NOMINY", "JP": "JPCBNY", "BTIG": "BTIG", } def download_files(date: datetime.date): sftp = SftpClient.from_creds("bbg") dst = DAILY_DIR / str(date) / "bbg_tickets" if not dst.exists(): dst.mkdir() EST = ZoneInfo("US/Eastern") def by_date(f, date): local_dt = datetime.datetime.fromtimestamp( f.st_mtime, tz=datetime.timezone.utc ).astimezone(EST) return local_dt.date() == date sftp.download_files("/", dst, (lambda f: by_date(f, date),)) def get_indic_data(conn, redcode, tenor): sql_str = ( "SELECT maturity, coupon " "FROM index_desc " "WHERE tenor=%s AND redindexcode=%s " ) with conn.cursor() as c: c.execute(sql_str, (redcode, tenor)) return c.fetchone() def cdx_booking_process(path, conn): with open(path) as fh: reader = csv.DictReader(fh) for line in reader: tenor = line["Security"].rsplit(" ", 1)[-1].lower() + "r" maturity, coupon = get_indic_data(conn, tenor, line["Red Code"]) trade = CDSDeal( fund=_funds[line["Account"]], folder="*", portfolio="UNALLOCATED", security_id=line["Red Code"], security_desc=line["Security"].removesuffix(" PRC"), traded_level=Decimal(line["Price (Dec)"]), notional=line["Quantity"], fixed_rate=coupon * 0.01, trade_date=datetime.datetime.strptime( line["Trade Dt"], "%m/%d/%Y" ).date(), maturity=maturity, currency=line["Curncy"], protection="Buyer" if line["Side"] == "B" else "Seller", upfront=line["Principal"], cp_code=_cdx_cp[line["Brkr"]], account_code=_fcms[line["Client FCM"]], ) trade.stage() CDSDeal.commit() def bond_booking_process(path, conn): with open(path) as fh: reader = csv.DictReader(fh) for line in reader: trade = BondDeal( faceamount=Decimal(line["Quantity"]), price=Decimal(line["Price (Dec)"]), cp_code=_bond_cp[line["cp_code"]], cusip=line["Cusip"], identifier=line["Cusip"], trade_date=datetime.datetime.strptime(line["Trade Dt"], "%m/%d/%Y"), settle_date=datetime.datetime.strptime(line["SetDt"], "%m/%d/%Y"), portfolio="UNALLOCATED", asset_class=None, description=line["Security"].removesuffix(" Mtge"), buysell=line["Side"] == "B", ) trade.stage() CDSDeal.commit() def book_trades(conn, date=datetime.date.today()): download_files(date) for p in (DAILY_DIR / str(date) / "bbg_tickets").glob("CDX*"): cdx_booking_process(p, conn) for p in (DAILY_DIR / str(date) / "bbg_tickets").glob("BOND*"): bond_booking_process(p, conn) if __name__ == "__main__": from serenitas.utils.db import serenitas_pool d = datetime.date(2022, 2, 7) conn = serenitas_pool.getconn() book_trades(conn, d)