diff options
Diffstat (limited to 'python/trade_dataclasses.py')
| -rw-r--r-- | python/trade_dataclasses.py | 100 |
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": |
