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.py93
2 files changed, 94 insertions, 0 deletions
diff --git a/python/headers.py b/python/headers.py
index 223e5a2d..3fbd6991 100644
--- a/python/headers.py
+++ b/python/headers.py
@@ -14,6 +14,7 @@ class DealType(Enum):
IRS = "IRS"
TrancheProduct = "TRANCHEPRODUCT"
SwaptionProduct = "SWAPTIONPRODUCT"
+ IRSProduct = "IRSPRODUCT"
HEADERS_PRE = [
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py
index 61605bf2..a8230508 100644
--- a/python/trade_dataclasses.py
+++ b/python/trade_dataclasses.py
@@ -1285,3 +1285,96 @@ class SwaptionProduct(
obj["Command"] = "N"
obj["Coupon Rate"] = obj["Coupon Rate"] / 100
return obj
+
+
+_citco_frequency = {"Yearly": 1, "Daily": 9}
+_citco_bdc = {"Modified Following": 4}
+_citco_daycount = {"ACT/360": 2}
+_citco_ratesource = {"SOFRRATE": 17819}
+
+
+@dataclass
+class IRSProduct(
+ Deal,
+ deal_type=DealType.IRSProduct,
+ table_name="citco_irs",
+ insert_ignore=("id", "dealid"),
+):
+ birth_date: datetime.date = field(metadata={"citco": "Birth_date"})
+ death_date: datetime.date = field(metadata={"citco": "Death_date"})
+ payreceive: bool
+ fixed_rate: float
+ notional: float
+
+ payreceive: str = field(metadata={"citco": "Sec_Desc"})
+ instrument_type: str = field(default="IRS", metadata={"citco": "Instrument Type"})
+ active: str = field(default=True, metadata={"citco": "Active"})
+ fixed_daycount: str = field(default="ACT/360")
+ fixed_payment_freq: str = field(default="Yearly")
+ fixed_bdc: str = field(default="Modified Following")
+ float_index: str = field(default="SOFRRATE")
+ float_daycount: str = field(default="ACT/360")
+ float_payment_freq: str = field(default="Yearly")
+ float_bdc: str = field(default="Modified Following")
+ currency: str = field(default="USD", metadata={"citco": "LocalCcy"})
+ float_fixing_freq: str = field(default="Daily")
+ pay_interest_calc_method: str = field(default="Compound")
+ committed: bool = field(default=False)
+ 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_irs where birth_date=%s and death_date=%s and float_index=%s and fixed_rate=%s and payreceive=%s"
+ with self._conn.cursor() as c:
+ c.execute(
+ sql_str,
+ (
+ self.birth_date,
+ self.death_date,
+ self.float_index,
+ self.fixed_rate,
+ self.payreceive,
+ ),
+ )
+ 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["payreceive"]:
+ key1, key2 = "P", "R"
+ else:
+ key1, key2 = "R", "P"
+ d = {
+ f"S_{key1}_CurrencyCode": self.currency,
+ f"S_{key1}_PaymentFreqID": _citco_frequency[self.fixed_payment_freq],
+ f"S_{key1}_RateIndexID": 0,
+ f"S_{key1}_AccrualMethodID": _citco_daycount[self.fixed_daycount],
+ f"S_{key1}_Interest Rate": self.fixed_rate,
+ f"S_{key1}_Day Convention": _citco_bdc[self.fixed_bdc],
+ f"S_{key1}_ResetFreqID": 0,
+ 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}_Day ConventionID": _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["Principal Exch TypeID"] = 1
+ return obj