aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/headers.py1
-rw-r--r--python/trade_dataclasses.py96
2 files changed, 96 insertions, 1 deletions
diff --git a/python/headers.py b/python/headers.py
index 3fbd6991..debe0945 100644
--- a/python/headers.py
+++ b/python/headers.py
@@ -15,6 +15,7 @@ class DealType(Enum):
TrancheProduct = "TRANCHEPRODUCT"
SwaptionProduct = "SWAPTIONPRODUCT"
IRSProduct = "IRSPRODUCT"
+ TRSProduct = "TRSPRODUCT"
HEADERS_PRE = [
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py
index 9fdcbb2f..5020db67 100644
--- a/python/trade_dataclasses.py
+++ b/python/trade_dataclasses.py
@@ -1344,7 +1344,7 @@ class SwaptionProduct(
return obj
-_citco_frequency = {"Yearly": 1, "Daily": 9}
+_citco_frequency = {"Yearly": 1, "Daily": 9, "Quarterly": 3}
_citco_bdc = {"Modified Following": 4}
_citco_daycount = {"ACT/360": 2}
_citco_ratesource = {"SOFRRATE": 17819}
@@ -1438,3 +1438,97 @@ class IRSProduct(
obj["Birth_date"] = obj["Birth_date"].strftime("%Y%m%d")
obj["Death_date"] = obj["Death_date"].strftime("%Y%m%d")
return obj
+
+
+@dataclass
+class TRSProduct(
+ CitcoDeal,
+ Deal,
+ deal_type=DealType.TRSProduct,
+ table_name="citco_trs",
+ insert_ignore=("id", "dealid"),
+):
+ birth_date: datetime.date = field(metadata={"citco": "Birth_date"})
+ death_date: datetime.date = field(metadata={"citco": "Death_date"})
+ buysell: bool
+ underlying_security: str = field(metadata={"citco": "Instrument Type"})
+ active: str = field(default=True, metadata={"citco": "Active"})
+ funding_daycount: str = field(default="ACT/360")
+ funding_freq: str = field(default="Yearly")
+ funding_payment_roll_convention: str = field(default="Modified Following")
+ asset_daycount: str = field(default="ACT/360")
+ asset_freq: str = field(default="Yearly")
+ asset_payment_roll_convention: str = field(default="Modified Following")
+ currency: str = field(default="USD", metadata={"citco": "LocalCcy"})
+ interest_calc_method: str = field(default="Compound")
+ compound_avg_frequency: str = field(default="TEST")
+ fixing_frequency: str = field(default="TEST")
+ committed: bool = field(default=False)
+ instrument_type: str = field(default="TRS", metadata={"citco": "Instrument Type"})
+ funding_index: str = field(default="SOFRRATE", metadata={})
+ id: int = field(default=None, metadata={"insert": False})
+ dealid: str = field(
+ default=None, metadata={"insert": False, "citco": "Unique Identifier"}
+ )
+
+ def get_dealid(self):
+ sql_str = "SELECT id, dealid, committed from citco_trs where birth_date=%s and death_date=%s and funding_index=%s and underlying_security=%s and buysell=%s"
+ with self._conn.cursor() as c:
+ c.execute(
+ sql_str,
+ (
+ self.birth_date,
+ self.death_date,
+ self.funding_index,
+ self.underlying_security,
+ self.buysell,
+ ),
+ )
+ if results := c.fetchone():
+ (self.id, self.dealid, self.committed) = results
+
+ def __post_init__(self):
+ self.get_dealid()
+
+ def to_citco(self):
+ if not self.id:
+
+ self.stage()
+ self.commit()
+ self.get_dealid()
+
+ obj = self.serialize("citco")
+ if obj["buysell"]:
+ key1, key2 = "P", "R"
+ else:
+ key1, key2 = "R", "P"
+ d = {
+ f"S_{key1}_CurrencyCode": self.currency,
+ f"S_{key1}_PaymentFreqID": _citco_frequency[self.funding_freq],
+ f"S_{key1}_RateIndexID": 28,
+ f"S_{key1}_AccrualMethodID": _citco_daycount[self.funding_daycount],
+ f"S_{key1}_Interest Rate": 0,
+ f"S_{key1}_PaymentCalandarID": 3,
+ f"S_{key1}_DayConventionID": _citco_bdc[
+ self.funding_payment_roll_convention
+ ],
+ f"S_{key1}_ResetFreqID": 0,
+ f"S_{key1}_RateSource": _citco_ratesource[self.funding_index],
+ f"S_{key2}_CurrencyCode": self.currency,
+ f"S_{key2}_PaymentFreqID": _citco_frequency[self.float_payment_freq],
+ f"S_{key2}_RateIndexID": 28,
+ f"S_{key2}_AccrualMethodID": _citco_daycount[self.float_daycount],
+ f"S_{key2}_Interest Rate": 0,
+ f"S_{key2}_PaymentCalandarID": 3,
+ f"S_{key2}_DayConventionID": _citco_bdc[self.float_bdc],
+ f"S_{key2}_ResetFreqID": _citco_frequency[self.float_fixing_freq],
+ f"S_{key2}_RateSource": _citco_ratesource[self.float_index],
+ }
+ obj.update(d)
+ obj["Command"] = "N"
+ obj["Active"] = "Y" if obj["Active"] else "N"
+ obj["General Direction"] = F
+ obj["Principal Exch TypeID"] = 3
+ obj["Birth_date"] = obj["Birth_date"].strftime("%Y%m%d")
+ obj["Death_date"] = obj["Death_date"].strftime("%Y%m%d")
+ return obj