aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/trade_dataclasses.py93
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: