aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/headers.py4
-rw-r--r--python/mtm_upload.py125
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")