diff options
Diffstat (limited to 'python/trade_dataclasses.py')
| -rw-r--r-- | python/trade_dataclasses.py | 93 |
1 files changed, 55 insertions, 38 deletions
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py index 405ff37e..676aaa9e 100644 --- a/python/trade_dataclasses.py +++ b/python/trade_dataclasses.py @@ -572,7 +572,8 @@ class CDSDeal( initial_margin_percentage: float = field( default=None, metadata={"mtm": "Independent Amount (%)"} ) - factor: float = field(default=1, init=False, metadata={"insert": False}) + factor: float = field(default=1.0, init=False, metadata={"insert": False}) + redcode: str = field(init=False, metadata={"insert": False}) bbg_ticket_id: str = None def __post_init__(self): @@ -586,10 +587,13 @@ class CDSDeal( else: with self._conn.cursor() as c: c.execute( - "SELECT indexfactor / 100 from index_version where redindexcode=%s", + "SELECT indexfactor / 100 FROM index_version WHERE redindexcode=%s", (self.security_id,), ) (self.factor,) = c.fetchone() + # do something better + tenor = self.security_desc.rsplit(" ", 1)[1].removesuffix("Y") + self.redcode = "_".join(self.security_id, self.tenor) def to_markit(self): obj = self.serialize("mtm") @@ -627,32 +631,31 @@ class CDSDeal( obj["IDSource"] = "USERID" obj["ExecutionBroker"] = _citco_cp_isda[obj["ExecutionBroker"]] obj["ClearingAgent"] = obj["ExecutionBroker"] - redcode = ( - obj["security_id"] - + "_" - + obj["SecurityDescription"].split()[4].removesuffix("Y") - ) - instrument = TrancheProduct( - underlying_security_id=redcode, - attach=obj["orig_attach"], - detach=obj["orig_detach"], - ) + instrument = self.product instrument.citco_stage() obj["SecurityID"] = instrument.dealid else: # cleared cds process - obj["ExecutionBroker"] = _citco_cp_cdea[obj["ExecutionBroker"]] obj["IDSource"] = "RED" - obj["SecurityID"] = ( - obj["security_id"] - + "_" - + obj["SecurityDescription"].split()[4].removesuffix("Y") - ) - obj[ - "ClearingAgent" - ] = "BOA_FC" # We need to query DB via accounts table here + obj["ExecutionBroker"] = _citco_cp_cdea[obj["ExecutionBroker"]] + # We need to query DB via accounts table here + obj["ClearingAgent"] = "BOA_FC" + obj["SecurityID"] = self.redcode + return obj + @property + def product(self): + return TrancheProduct( + underlying_security_id=self.redcode, + attach=self.orig_attach, + detach=self.orig_detach, + birth_date=None, + death_date=self.maturity, + coupon=self.coupon, + security_desc=f"{self.security_desc} {self.orig_attach}-{self.orig_detach}", + ) + @classmethod def from_bbg_line(cls, line: dict): if line["Client FCM"] == "": @@ -1538,18 +1541,18 @@ class TrancheProduct( attach: float = field(metadata={"citco": "Attachment_Points"}) detach: float = field(metadata={"citco": "Detachment_Points"}) birth_date: datetime.date = field( - init=False, metadata={"insert": False, "citco": "Birth_date"} + default=None, metadata={"insert": False, "citco": "Birth_date"} ) death_date: datetime.date = field( - init=False, metadata={"insert": False, "citco": "Death_date"} + default=None, metadata={"insert": False, "citco": "Death_date"} ) - coupon: float = field(init=False, metadata={"insert": False, "citco": "CouponRate"}) - security_desc: str = field( - init=False, metadata={"insert": False, "citco": "Sec_Desc"} + coupon: float = field( + default=None, metadata={"insert": False, "citco": "CouponRate"} ) - currency: str = field( - init=False, default=None, metadata={"citco": "LocalCcy", "insert": False} + security_desc: str = field( + default=None, metadata={"insert": False, "citco": "Sec_Desc"} ) + currency: str = field(default=None, metadata={"citco": "LocalCcy", "insert": False}) instrument_type: str = field(default="CDS", metadata={"citco": "InstrumentType"}) underlying_id_source: str = field( default="RED", metadata={"citco": "UnderlyingIDSource"} @@ -1561,21 +1564,35 @@ class TrancheProduct( ) def __post_init__(self): - sql_str = "SELECT issue_date, maturity, coupon, index, series FROM index_desc WHERE tenor='5yr' AND redindexcode=%s" - with self._conn.cursor() as c: - c.execute(sql_str, (self.underlying_security_id.removesuffix("_5"),)) - ( - self.birth_date, + if not any( + [ + self.birthdate, self.death_date, self.coupon, - index, - series, - ) = c.fetchone() - self.get_productid() + self.security_desc, + self.currency, + ] + ): + redcode, tenor = self.underlying_security_id.split("_") + tenor_yr = tenor + "yr" + sql_str = ( + "SELECT issue_date, maturity, coupon, index, series " + "FROM index_desc WHERE tenor=%s AND redindexcode=%s" + ) + with self._conn.cursor() as c: + c.execute(sql_str, (tenor_yr, redcode)) + ( + self.birth_date, + self.death_date, + self.coupon, + index, + series, + ) = c.fetchone() self.security_desc = ( - f"{desc_str(index, series, '5')} {self.attach}-{self.detach}" + f"{desc_str(index, series, tenor)} {self.attach}-{self.detach}" ) self.currency = "EUR" if index in ("XO", "EU") else "USD" + self.get_productid() def to_citco(self): if not self.id: |
