diff options
Diffstat (limited to 'python/trade_dataclasses.py')
| -rw-r--r-- | python/trade_dataclasses.py | 96 |
1 files changed, 95 insertions, 1 deletions
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 |
