aboutsummaryrefslogtreecommitdiffstats
path: root/python/trade_dataclasses.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/trade_dataclasses.py')
-rw-r--r--python/trade_dataclasses.py103
1 files changed, 37 insertions, 66 deletions
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py
index 9887c139..3186b7dc 100644
--- a/python/trade_dataclasses.py
+++ b/python/trade_dataclasses.py
@@ -2,6 +2,7 @@ from dataclasses import dataclass, field, fields, Field
from enum import Enum
from io import StringIO
from headers import DealType, MTM_HEADERS, HEADERS
+from csv_headers.citco import GIL
from typing import ClassVar, Tuple, Union
from decimal import Decimal
from typing import Literal
@@ -436,12 +437,26 @@ class CitcoDeal:
_citco_headers = None
_citco_trade_headers = None
_sftp = SftpClient.from_creds("citco")
- product_type: str
+ product_key = ()
- def __init_subclass__(cls, deal_type, **kwargs):
+ def __init_subclass__(cls, deal_type, product_key, **kwargs):
super().__init_subclass__(deal_type, **kwargs)
cls._citco_headers = GIL
cls._citco_trade_headers = GTL
+ cls.product_key = product_key
+
+ def get_dealid(self):
+ filter_clause = " AND ".join([f"{k}=%s" for k in self.product_key])
+ sql_str = (
+ f"SELECT id, dealid, committed FROM {self.table_name} WHERE {filter_clause}"
+ )
+ with self._conn.cursor() as c:
+ c.execute(
+ sql_str,
+ tuple([getattr(self, k) for k in self.product_key]),
+ )
+ if results := c.fetchone():
+ (self.id, self.dealid, self.committed) = results
@classmethod
def citco_upload(cls):
@@ -1235,10 +1250,11 @@ class TrancheType(IntEnum):
@dataclass
class TrancheProduct(
- CitcoDeal,
+ CitcoProduct,
Deal,
deal_type=DealType.TrancheProduct,
table_name="citco_tranche",
+ product_key=("underlying_security_id", "attach", "detach"),
insert_ignore=(
"id",
"dealid",
@@ -1273,15 +1289,8 @@ class TrancheProduct(
default=None, metadata={"insert": False, "citco": "UniqueIdentifier"}
)
- def get_dealid(self):
- sql_str = "SELECT id, dealid, committed from citco_tranche where underlying_security_id = %s and attach = %s and detach = %s"
- with self._conn.cursor() as c:
- c.execute(sql_str, (self.underlying_security_id, self.attach, self.detach))
- if results := c.fetchone():
- (self.id, self.dealid, self.committed) = results
-
def __post_init__(self):
- sql_str = "SELECT issue_date, maturity, coupon, index, series FROM index_version LEFT JOIN index_Maturity USING (series, INDEX) WHERE tenor='5yr' AND redindexcode=%s;"
+ 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"),))
(
@@ -1314,10 +1323,18 @@ class TrancheProduct(
@dataclass
class SwaptionProduct(
- CitcoDeal,
+ CitcoProduct,
Deal,
deal_type=DealType.SwaptionProduct,
table_name="citco_swaption",
+ product_key=(
+ "underlying_security_id",
+ "strike",
+ "expiration",
+ "callput",
+ "birth_date",
+ "death_date",
+ ),
insert_ignore=(
"id",
"dealid",
@@ -1348,28 +1365,10 @@ class SwaptionProduct(
default=None, metadata={"insert": False, "citco": "UniqueIdentifier"}
)
- def get_dealid(self):
- sql_str = "SELECT id, dealid, committed from citco_swaption where instrument_type=%s and underlying_security_id =%s and strike =%s and expiration=%s and callput=%s and birth_date=%s and death_date=%s"
- with self._conn.cursor() as c:
- c.execute(
- sql_str,
- (
- self.instrument_type,
- self.underlying_security_id,
- self.strike,
- self.expiration,
- self.callput,
- self.birth_date,
- self.death_date,
- ),
- )
- if results := c.fetchone():
- (self.id, self.dealid, self.committed) = results
-
def __post_init__(self):
self.get_dealid()
if self.underlying_id_source == "RED":
- sql_str = "SELECT issue_date, maturity, coupon, index, series FROM index_version LEFT JOIN index_Maturity USING (series, INDEX) WHERE tenor='5yr' AND redindexcode=%s;"
+ 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"),))
(
@@ -1419,10 +1418,11 @@ _citco_ratesource = {"SOFRRATE": 17819}
@dataclass
class IRSProduct(
- CitcoDeal,
+ CitcoProduct,
Deal,
deal_type=DealType.IRSProduct,
table_name="citco_irs",
+ product_key=("birth_date", "death_date", "float_index", "fixed_rate"),
insert_ignore=("id", "dealid", "security_desc"),
):
birth_date: datetime.date = field(metadata={"citco": "Birth_date"})
@@ -1449,24 +1449,9 @@ class IRSProduct(
default=None, metadata={"insert": False, "citco": "UniqueIdentifier"}
)
- 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"
- with self._conn.cursor() as c:
- c.execute(
- sql_str,
- (
- self.birth_date,
- self.death_date,
- self.float_index,
- self.fixed_rate,
- ),
- )
- if results := c.fetchone():
- (self.id, self.dealid, self.committed) = results
- self.security_desc = f"SWAP IRS {self.float_index}-{self.fixed_rate}"
-
def __post_init__(self):
self.get_dealid()
+ self.security_desc = f"SWAP IRS {self.float_index}-{self.fixed_rate}"
def to_citco(self):
if not self.id:
@@ -1503,10 +1488,11 @@ class IRSProduct(
@dataclass
class TRSProduct(
- CitcoDeal,
+ CitcoProduct,
Deal,
deal_type=DealType.TRSProduct,
table_name="citco_trs",
+ product_key=("birth_date", "death_date", "funding_index", "underlying_security"),
insert_ignore=("id", "dealid"),
):
birth_date: datetime.date = field(metadata={"citco": "Birth_date"})
@@ -1534,25 +1520,10 @@ class TRSProduct(
default=None, metadata={"insert": False, "citco": "UniqueIdentifier"}
)
- 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"
- with self._conn.cursor() as c:
- c.execute(
- sql_str,
- (
- self.birth_date,
- self.death_date,
- self.funding_index,
- self.underlying_security,
- ),
- )
- if results := c.fetchone():
- (self.id, self.dealid, self.committed) = results
- _citco_trs = {"4J623JAA8": "IBOXHY_TRS"}
- self.security_desc = _citco_trs[self.underlying_security]
-
def __post_init__(self):
self.get_dealid()
+ _citco_trs = {"4J623JAA8": "IBOXHY_TRS"}
+ self.security_desc = _citco_trs[self.underlying_security]
def to_citco(self):
if not self.id: