diff options
Diffstat (limited to 'python/api_quotes/quotes.py')
| -rw-r--r-- | python/api_quotes/quotes.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/python/api_quotes/quotes.py b/python/api_quotes/quotes.py new file mode 100644 index 00000000..28ca708b --- /dev/null +++ b/python/api_quotes/quotes.py @@ -0,0 +1,66 @@ +from serenitas.ops.trade_dataclasses import Deal +from dataclasses import dataclass +import datetime +from typing import Literal +from serenitas.utils.db2 import dbconn + +firmness = Literal["FIRM", "INDICATIVE"] +asset_class = Literal["CD"] + + +def maturity_dt(d): + try: + return datetime.date( + int(d["maturityyear"]), int(d["maturitymonth"]), int(d["maturityday"]) + ) + except ( + ValueError, + KeyError, + ): # Sometimes maturity isn't included but we still have tenor + return + + +@dataclass +class Quote(Deal, table_name="markit_singlename_quotes", deal_type=None): + quoteid: int + assetclass: asset_class + msg_id: str + quotesource: str + confidence: int + redcode: str = None + ticker: str = None + maturity: datetime.date = None + tenor: int = None + runningcoupon: int = None + bidconventionalspread: float = None + bidupfront: float = None + bidsize: float = None + askconventionalspread: float = None + askupfront: float = None + asksize: float = None + firmness: firmness = None + quotedate: datetime.datetime = None + + @classmethod + def from_markit_line(cls, d): + additional_attributes = { + "maturity": maturity_dt(d), + "msg_id": d["message"]["id"], + "quotedate": datetime.datetime.fromtimestamp( + d["receiveddatetime"] / 1000 + ).replace(tzinfo=datetime.timezone.utc), + "quotesource": d["sourceshortname"], + "tenor": f"{d['tenor']}Y", + } + d.update(additional_attributes) + return cls.from_dict(**d) + + @property + def message(self): + return QuoteDetails.from_tradeid(self.msg_id) + + +Quote.init_dbconn(dbconn("serenitasdb")) +Quote._sql_insert = Quote._sql_insert.replace( + "RETURNING *", "ON CONFLICT (quoteid) DO NOTHING RETURNING *" +) |
