from serenitas.ops.trade_dataclasses import Deal from dataclasses import dataclass, field import datetime from typing import Literal firmness = Literal["FIRM", "INDICATIVE"] asset_class = Literal["CD"] @dataclass class QuoteDetails(Deal, table="markit_quote_details", deal_type=None): quotetime: datetime quote_source: str id: int sender: str = None @dataclass class Quote(Deal, table="markit_quotes", deal_type=None): quoteid: int assetclass: asset_class redcode: str ticker: str maturity: datetime.date tenor: int runningcoupon: int bidspread: float bidupfront: float bidsize: float askspread: float askupfront: float asksize: float quotefirness: firmness msgid: str quotedate: datetime quotesource: str @classmethod def from_markit_line(cls, d): return cls( quote_id=line["quoteid"], asset_class=line["assetclass"], redcode=line["redcode"], ticker=line["ticker"], maturity=datetime.date( line["maturityYear"], line["maturityMonth"], line["maturityDay"] ), tenor=line["tenor"], running_coupon=line["runningCoupon"], bid_spread=line["bidConventionalSpread"], bid_upfront=line["bidUpfront"], bid_size=line["bidSize"], ask_spread=line["askConventionalSpread"], ask_upfront=line["askUpfront"], ask_size=line["askSize"], quote_firmness=line["firmness"], msg_id=line["message"]["id"], quotedate=line["receivedDateTime"], quote_source=line["sourceShortName"], ) @property def message(self): return QuoteDetails.from_tradeid(self.msg_id)