diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/trade_dataclasses.py | 73 |
1 files changed, 31 insertions, 42 deletions
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py index c05ee741..f31f10b2 100644 --- a/python/trade_dataclasses.py +++ b/python/trade_dataclasses.py @@ -8,7 +8,6 @@ from psycopg2.extensions import register_adapter, AsIs from serenitas.analytics.dates import next_business_day, previous_twentieth from serenitas.analytics.index import CreditIndex from serenitas.utils.db import dbconn -from process_queue import rename_keys from lru import LRU from psycopg2.errors import UniqueViolation import logging @@ -157,7 +156,7 @@ class Deal: _sql_select: ClassVar[str] _insert_queue: ClassVar[list] = [] - def __init_subclass__(cls, table_name: str = "", insert_ignore=()): + def __init_subclass__(cls, table_name: str, insert_ignore=()): super().__init_subclass__() cls._table_name = table_name insert_columns = [c for c in cls.__annotations__ if c not in insert_ignore] @@ -191,19 +190,24 @@ class Deal: r = c.fetchone() return cls(*r) + def serialize(self, tag: str): + return { + f.metadata.get(tag, f.name): getattr(self, f.name) for f in fields(self) + } + -class BbgDeal(Deal): +class BbgDeal: _bbg_insert_queue: ClassVar[list] = [] _cache: ClassVar[LRU] = LRU(128) _bbg_sql_insert: ClassVar[str] - def __init_subclass__(cls, table_name: str, insert_ignore=()): - super().__init_subclass__(table_name, insert_ignore) - if table_name == "bonds": + def __init_subclass__(cls, **kwargs): + super().__init_subclass__(**kwargs) + if cls.__name__ == "BondDeal": cls._bbg_sql_insert = ( f"INSERT INTO bond_tickets VALUES({','.join(['%s'] * 20)})" ) - elif table_name == "cds": + elif cls.__name__ == "CDSDeal": cls._bbg_sql_insert = ( f"INSERT INTO cds_tickets VALUES({','.join(['%s'] * 20)})" ) @@ -226,34 +230,39 @@ class BbgDeal(Deal): @dataclass -class CDSDeal(BbgDeal, table_name="cds", insert_ignore=("id", "dealid")): - fund: Fund +class CDSDeal(BbgDeal, Deal, table_name="cds", insert_ignore=("id", "dealid")): + fund: Fund = field(metadata={"mtm": "Account Abbreviation"}) account_code: str - cp_code: str - security_id: str + cp_code: str = field(metadata={"mtm": "Broker Id"}) + security_id: str = field(metadata={"mtm": "RED"}) security_desc: str - maturity: datetime.date - currency: Ccy + maturity: datetime.date = field(metadata={"mtm": "Maturity Date"}) + currency: Ccy = field(metadata={"mtm": "Currency Code"}) protection: Literal["Buy", "Sell"] - notional: float - fixed_rate: float - upfront: float + notional: float = field(metadata={"mtm": "1st Leg Notional"}) + fixed_rate: float = field(metadata={"mtm": "1st Leg Rate"}) + upfront: float = field(metadata={"mtm": "Initial Payment"}) traded_level: Decimal - effective_date: datetime.date = field(default=None) + effective_date: datetime.date = field( + default=None, metadata={"mtm": "Effective Date"} + ) portfolio: Portfolio = field(default=None) folder: CdsStrat = field(default=None) payment_rolldate: BusDayConvention = BusDayConvention.following day_count: DayCount = "ACT/360" frequency: Frequency = Frequency.Quarterly - trade_date: datetime.date = field(default_factory=datetime.date.today()) + trade_date: datetime.date = field( + default_factory=datetime.date.today(), metadata={"mtm": "Trade Date"} + ) upfront_settle_date: datetime.date = field( - default_factory=lambda: next_business_day(datetime.date.today()) + default_factory=lambda: next_business_day(datetime.date.today()), + metadata={"mtm": "First Payment Date"}, ) swap_type: SwapType = "CD_INDEX" clearing_facility: ClearingFacility = "ICE-CREDIT" isda_definition: IsdaDoc = "ISDA2014" id: int = field(default=None, metadata={"insert": False}) - dealid: str = field(default=None, metadata={"insert": False}) + dealid: str = field(default=None, metadata={"insert": False, "mtm": "Swap ID"}) def __post_init__(self): self.effective_date = previous_twentieth(self.trade_date) @@ -268,27 +277,7 @@ class CDSDeal(BbgDeal, table_name="cds", insert_ignore=("id", "dealid")): index.direction = self.protection def to_markit(self): - obj = self.__dict__ - rename_keys( - obj, - { - "dealid": "Swap ID", - "cp_code": "Broker Id", - "trade_date": "Trade Date", - "effective_date": "Effective Date", - "maturity": "Maturity Date", - "notional": "1st Leg Notional", - "fixed_rate": "1st Leg Rate", - "upfront": "Initial Payment", - "security_id": "RED", - "orig_attach": "Attachment Point", - "orig_detach": "Exhaustion Point", - "currency": "Currency Code", - "upfront_settle_date": "First Payment Date", - "cp_code": "Broker Id", - "fund": "Account Abbreviation", - }, - ) + obj = self.serialize("mtm") if obj["Initial Payment"] >= 0: obj["Transaction Code"] = "Receive" else: @@ -309,7 +298,7 @@ class CDSDeal(BbgDeal, table_name="cds", insert_ignore=("id", "dealid")): @dataclass -class BondDeal(BbgDeal, table_name="bonds", insert_ignore=()): +class BondDeal(BbgDeal, Deal, table_name="bonds"): buysell: bool description: str faceamount: float |
