aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/trade_dataclasses.py73
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