aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/trade_dataclasses.py100
1 files changed, 77 insertions, 23 deletions
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py
index 7233a7b1..9887c139 100644
--- a/python/trade_dataclasses.py
+++ b/python/trade_dataclasses.py
@@ -427,43 +427,71 @@ class MTMDeal:
return cls(**{k: v for k, v in kwargs.items() if k in cls._sql_fields})
-from csv_headers.citco import GIL
+from csv_headers.citco import GIL, GTL
class CitcoDeal:
_citco_queue: ClassVar[list] = []
+ _citco_trade_queue: ClassVar[list] = []
_citco_headers = None
+ _citco_trade_headers = None
_sftp = SftpClient.from_creds("citco")
product_type: str
def __init_subclass__(cls, deal_type, **kwargs):
super().__init_subclass__(deal_type, **kwargs)
cls._citco_headers = GIL
+ cls._citco_trade_headers = GTL
@classmethod
def citco_upload(cls):
- if not cls._citco_queue: # early exit
+ if not (cls._citco_queue or cls._citco_trade_queue): # early exit
return
- buf = StringIO()
- csvwriter = csv.writer(buf)
- csvwriter.writerow(cls._citco_headers)
- csvwriter.writerows(
- [row.get(h, None) for h in cls._citco_headers] for row in cls._citco_queue
- )
- buf = buf.getvalue().encode()
- fname = f"i.innocap_serenitas.{datetime.datetime.now():%Y%m%d%H%M%S}.csv"
- cls._sftp.client.chdir("incoming")
- cls._sftp.put(buf, fname)
- dest = DAILY_DIR / str(datetime.date.today()) / fname
- dest.write_bytes(buf)
- cls._citco_queue.clear()
+
+ if cls._citco_queue:
+ buf = StringIO()
+ csvwriter = csv.writer(buf)
+ csvwriter.writerow(cls._citco_headers)
+ csvwriter.writerows(
+ [row.get(h, None) for h in cls._citco_headers]
+ for row in cls._citco_queue
+ )
+ buf = buf.getvalue().encode()
+ fname = f"i.innocap_serenitas.{datetime.datetime.now():%Y%m%d%H%M%S}.csv"
+ cls._sftp.client.chdir("incoming")
+ cls._sftp.put(buf, fname)
+ dest = DAILY_DIR / str(datetime.date.today()) / fname
+ dest.write_bytes(buf)
+ cls._citco_queue.clear()
+
+ if cls._citco_trade_queue:
+ buf = StringIO()
+ csvwriter = csv.writer(buf)
+ csvwriter.writerow(cls._citco_trade_headers)
+ csvwriter.writerows(
+ [row.get(h, None) for h in cls._citco_trade_headers]
+ for row in cls._citco_trade_queue
+ )
+ buf = buf.getvalue().encode()
+ fname = (
+ f"innocap_serenitas_trades_{datetime.datetime.now():%Y%m%d%H%M%S}.csv"
+ )
+ cls._sftp.client.chdir("incoming")
+ cls._sftp.put(buf, fname)
+ dest = DAILY_DIR / str(datetime.date.today()) / fname
+ dest.write_bytes(buf)
+ cls._citco_trade_queue.clear()
def citco_stage(self):
- self._citco_queue.append(self.to_citco())
+ if "citco" in self._table_name:
+ self._citco_queue.append(self.to_citco())
+ else:
+ self._citco_trade_queue.append(self.to_citco())
@dataclass
class CDSDeal(
+ CitcoDeal,
BbgDeal,
MTMDeal,
Deal,
@@ -471,20 +499,20 @@ class CDSDeal(
table_name="cds",
insert_ignore=("id", "dealid"),
):
- fund: Fund = field(metadata={"mtm": "Account Abbreviation"})
+ fund: Fund = field(metadata={"mtm": "Account Abbreviation", "citco": "Fund"})
account_code: str
- cp_code: str = field(metadata={"mtm": "Broker Id"})
+ cp_code: str = field(metadata={"mtm": "Broker Id", "citco": "ExecutionBroker"})
security_id: str = field(metadata={"mtm": "RED"})
- security_desc: str
+ security_desc: str = field(metadata={"citco": "SecurityDescription"})
maturity: datetime.date = field(metadata={"mtm": "Maturity Date"})
currency: Ccy = field(
metadata={"mtm": "Currency Code", "citco": "SecurityCurrency"}
)
protection: Literal["Buy", "Sell"]
- notional: float = field(metadata={"mtm": "1st Leg Notional"})
+ notional: float = field(metadata={"mtm": "1st Leg Notional", "citco": "OrderQty"})
fixed_rate: float = field(metadata={"mtm": "1st Leg Rate"})
upfront: float = field(metadata={"mtm": "Initial Payment"})
- traded_level: Decimal
+ traded_level: Decimal = field(metadata={"citco": "AvgPrice"})
effective_date: datetime.date = field(
default=None, metadata={"mtm": "Effective Date"}
)
@@ -494,11 +522,12 @@ class CDSDeal(
day_count: DayCount = "ACT/360"
frequency: Frequency = Frequency.Quarterly
trade_date: datetime.date = field(
- default_factory=datetime.date.today(), metadata={"mtm": "Trade Date"}
+ default_factory=datetime.date.today(),
+ metadata={"mtm": "Trade Date", "citco": "TradeDate"},
)
upfront_settle_date: datetime.date = field(
default_factory=lambda: next_business_day(datetime.date.today()),
- metadata={"mtm": "First Payment Date"},
+ metadata={"mtm": "First Payment Date", "citco": "SettlementDate"},
)
orig_attach: int = field(default=None, metadata={"mtm": "Attachment Point"})
orig_detach: int = field(default=None, metadata={"mtm": "Exhaustion Point"})
@@ -539,6 +568,31 @@ class CDSDeal(
obj["Contractual Supplement"] = "StandardiTraxxEuropeTranche"
return obj
+ def to_citco(self):
+ obj = self.serialize("citco")
+ obj["FillID"] = obj["ClientOrderID"]
+ obj["SecurityType"] = "CDS"
+ obj["BuySellShortCover"] = "B" if obj["protection"] == "Buy" else "S"
+ obj["Trader"] = "serenitas_trader"
+ obj["FillQty"] = obj["OrderQty"]
+ obj["FillPrice"] = obj["AvgPrice"]
+ obj["StrategyCode"] = f"{obj['portfolio']}/{obj['folder']}"
+ obj["SettleCurrency"] = obj["SecurityCurrency"]
+ if obj["orig_attach"]:
+ # tranche process
+ obj["IDSource"] = "USERID"
+ obj["ClearingAgent"] = obj["ExecutionBroker"]
+ else:
+ # cleared cds process
+ obj["IDSource"] = "RED"
+ obj["SecurityID"] = (
+ obj["security_id"]
+ + "_"
+ + obj["SecurityDescription"].split()[4].removesuffix("Y")
+ )
+ obj["ClearingAgent"] = "" # We need to query DB via accounts table here
+ return obj
+
@classmethod
def from_bbg_line(cls, line: dict):
if "Seq#" in line and line["Brkr"] != "BSEF":