diff options
Diffstat (limited to 'python/trade_dataclasses.py')
| -rw-r--r-- | python/trade_dataclasses.py | 71 |
1 files changed, 64 insertions, 7 deletions
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py index 6e4ed9f6..a2a225be 100644 --- a/python/trade_dataclasses.py +++ b/python/trade_dataclasses.py @@ -677,23 +677,41 @@ class CDSDeal( @dataclass -class BondDeal(BbgDeal, Deal, deal_type=DealType.Bond, table_name="bonds"): +class BondDeal( + CitcoTrade, + BbgDeal, + Deal, + deal_type=DealType.Bond, + table_name="bonds", + insert_ignore=("id", "dealid"), +): buysell: bool description: str - faceamount: float - price: float - cp_code: str + faceamount: float = field(metadata={"citco": "OrderQty"}) + price: float = field(metadata={"citco": "AvgPrice"}) + cp_code: str = field(metadata={"citco": "ExecutionBroker"}) cusip: str = None isin: str = None - identifier: str = None - trade_date: datetime.date = field(default_factory=datetime.date.today()) + identifier: str = field(default=None, metadata={"citco": "SecurityID"}) + trade_date: datetime.date = field( + default_factory=datetime.date.today(), metadata={"citco": "TradeDate"} + ) settle_date: datetime.date = field( - default_factory=lambda: next_business_day(datetime.date.today()) + default_factory=lambda: next_business_day(datetime.date.today()), + metadata={"citco": "SettlementDate"}, ) folder: BondStrat = field(default=None) portfolio: Portfolio = field(default=None) asset_class: AssetClass = field(default=None) bbg_ticket_id: str = None + principal_payment: float = None + accrued_payment: float = None + current_face: float = None + id: int = field(default=None, metadata={"insert": False}) + dealid: str = field( + default=None, + metadata={"insert": False, "mtm": "Swap ID", "citco": "ClientOrderID"}, + ) @classmethod def from_bbg_line(cls, line: dict): @@ -721,6 +739,45 @@ class BondDeal(BbgDeal, Deal, deal_type=DealType.Bond, table_name="bonds"): asset_class=asset_class, ) + @classmethod + def from_allocationid(cls, allocation_id): + with cls._conn.cursor() as c: + c.execute( + "SELECT tradeid, notional from bond_allocation where id=%s", + (allocation_id,), + ) + tradeid, notional = c.fetchone() + cls = cls.from_tradeid(tradeid) + ratio = notional / cls.faceamount + for key in [ + "principal_payment", + "accrued_payment", + "current_face", + "net_amount", + ]: + if key in cls.__dict__.keys(): + setattr(cls, key, getattr(cls, key) * ratio) + setattr(cls, "faceamount", notional) + return cls + + def to_citco(self): + obj = self.serialize("citco") + obj["SecurityType"] = "CMO" + obj["ClearingAgent"] = "NT" + obj["FXRate"] = 1 + obj["CurrencyTraded"] = "USD" + obj["SettleCurrency"] = obj["CurrencyTraded"] + obj["BuySellShortCover"] = "B" if obj["buysell"] else "S" + obj["IDSource"] = "CUSIP" + with self._conn.cursor() as c: + c.execute( + "SELECT coupon, day_count from securities where identifier=%s", + (obj["SecurityID"],), + ) + obj["Coupon%"], obj["DayCountFraction/RepoCalendar"] = c.fetchone() + obj = self._base_attrs(obj) + return obj + @dataclass class SwaptionDeal( |
