diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/headers.py | 1 | ||||
| -rw-r--r-- | python/trade_dataclasses.py | 93 |
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 |
