diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/headers.py | 4 | ||||
| -rw-r--r-- | python/mtm_upload.py | 125 |
2 files changed, 11 insertions, 118 deletions
diff --git a/python/headers.py b/python/headers.py index 9b2534f4..9759c77f 100644 --- a/python/headers.py +++ b/python/headers.py @@ -450,7 +450,7 @@ MTM_HEADERS = { "Alternate Trade ID", "Definitions Type", ], - "swaption": [ + "swaptions": [ "Swap ID", "Allocation ID", "Description", @@ -527,7 +527,7 @@ MTM_HEADERS = { "Alternate Trade ID", "Sub Account Abbreviation", ], - "termination": [ + "terminations": [ "Swap ID", "Allocation ID", "Description", diff --git a/python/mtm_upload.py b/python/mtm_upload.py index 8ac6a6bd..fa2f526e 100644 --- a/python/mtm_upload.py +++ b/python/mtm_upload.py @@ -1,131 +1,24 @@ -from serenitas.utils.db import dbconn from io import StringIO import csv from serenitas.utils.env import DAILY_DIR from serenitas.utils.remote import SftpClient -from serenitas.analytics.dates import next_business_day import datetime -from trade_dataclasses import CDSDeal, SwaptionDeal +from trade_dataclasses import CDSDeal, SwaptionDeal, TerminationDeal from headers import MTM_HEADERS +deal_registry = { + "cds": CDSDeal, + "swaptions": SwaptionDeal, + "termination": TerminationDeal, +} -def rename_keys(d, mapping): - """rename keys in dictionary according to mapping dict inplace""" - for k, v in mapping.items(): - if k in d: - d[v] = d.pop(k) - -def tranche_trades(tradeids, conn): - trades = [] - for tradeid in tradeids: - obj = CDSDeal.from_tradeid(tradeid).to_markit() - trades.append(obj) - return trades - - -def swaption_trades(tradeids, conn): - trades = [] - for tradeid in tradeids: - obj = SwaptionDeal.from_tradeid(tradeid).to_markit() - trades.append(obj) - return trades - - -def tranche_term_trades(conn): - with conn.cursor() as c: - trades = [] - c.execute( - "SELECT terminations.*, cds.fund, cds.cp_code FROM terminations left join cds using (dealid) where termination_date >= %s and dealid LIKE %s", - (datetime.date(2022, 3, 1), "SCCDS%"), - ) - for row in c: - obj = row._asdict() - rename_keys( - obj, - { - "dealid": "Swap ID", - "termination_cp": "Broker Id", - "termination_amount": "1st Leg Notional", - "termination_fee": "Initial Payment", - "termination_date": "Trade Date", - "fee_payment_date": "Settle Date", - "fund": "Account Abbreviation", - "termination_cp": "Broker Id", - "cp_code": "Remaining Party", - }, - ) - if obj["Initial Payment"] >= 0: - obj["Transaction Code"] = "Receive" - else: - obj["Initial Payment"] = abs(obj["Initial Payment"]) - obj["Transaction Code"] = "Pay" - obj["Currency Code"] = "USD" - obj["Product Type"] = "TRN" - obj["Entity Matrix"] = "Publisher" - obj["Definitions Type"] = "ISDA2003Credit" - obj["Trade ID"] = obj["Swap ID"] + "-" + str(obj["id"]) - obj["Transaction Type"] = "Partial Assignment" - obj["Effective Date"] = obj["Trade Date"] + datetime.timedelta(days=1) - trades.append(obj) - return trades - - -def terminations(tradeid, conn): - with conn.cursor() as c: - termination_query = ( - """SELECT terminations.*, coalesce(cds.cp_code, swaptions.cp_code) AS orig_cp, COALESCE (cds."currency", swaptions."currency") AS currency, """ - """COALESCE (cds."swap_type", 'SWAPTION') as swap_type FROM terminations LEFT JOIN cds USING (dealid) LEFT JOIN swaptions USING (dealid) where terminations.id = %s ORDER BY id desc;""" - ) - c.execute(termination_query, (tradeid,)) - for row in c: - obj = row._asdict() - rename_keys( - obj, - { - "dealid": "Swap ID", - "termination_cp": "Broker Id", - "termination_amount": "1st Leg Notional", - "termination_fee": "Initial Payment", - "termination_date": "Trade Date", - "fee_payment_date": "Settle Date", - "fund": "Account Abbreviation", - "termination_cp": "Broker Id", - "orig_cp": "Remaining Party", - "currency": "Currency Code", - }, - ) - if obj["Initial Payment"] >= 0: - obj["Transaction Code"] = "Receive" - else: - obj["Initial Payment"] = abs(obj["Initial Payment"]) - obj["Transaction Code"] = "Pay" - match obj["swap_type"]: - case "CD_INDEX_TRANCHE": - obj["Product Type"] = "TRN" - case "SWAPTION": - obj["Product Type"] = "CDISW" - case _: - print("Not a valid termination") - obj["Trade ID"] = obj["Swap ID"] + "-" + str(obj["id"]) - obj["Transaction Type"] = ( - "Termination" - if obj["Remaining Party"] == obj["Broker Id"] - else "Assignment" - ) - obj["Effective Date"] = obj["Trade Date"] + datetime.timedelta(days=1) - trades.append(obj) - - -def build_line(obj, asset_type): - return [obj.get(h, None) for h in MTM_HEADERS[asset_type]] - - -def process_upload(trades, asset_type, upload): +def process_upload(tradeid, asset_type): + obj = deal_registry["asset_type"].from_tradeid(tradeid).to_markit() buf = StringIO() csvwriter = csv.writer(buf) csvwriter.writerow(MTM_HEADERS[asset_type]) - csvwriter.writerows(build_line(trade, asset_type) for trade in trades) + csvwriter.writerows([obj.get(h, None) for h in MTM_HEADERS[asset_type]]) buf = buf.getvalue().encode() fname = f"MTM.{datetime.datetime.now():%Y%m%d.%H%M%S}.{asset_type.capitalize()}.csv" sftp = SftpClient.from_creds("mtm") |
