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