diff options
Diffstat (limited to 'python/trade_dataclasses.py')
| -rw-r--r-- | python/trade_dataclasses.py | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py index 18e61616..29ba8c3e 100644 --- a/python/trade_dataclasses.py +++ b/python/trade_dataclasses.py @@ -78,6 +78,8 @@ Ccy = Literal["USD", "CAD", "EUR", "YEN"] SwapType = Literal[ "CD_INDEX", "CD_INDEX_TRANCHE", "CD_BASKET_TRANCHE", "ABS_CDS", "BESPOKE" ] + +OptionType = Literal["RECEIVER", "PAYER"] ClearingFacility = Literal["ICE-CREDIT", "NOT CLEARED"] CdsStrat = Literal[ "HEDGE_CSO", @@ -140,6 +142,16 @@ BondStrat = Literal[ "IGNORE", "MTG_REPO", ] + +SwaptionStrat = Literal[ + "IGPAYER", + "IGREC", + "HYPAYER", + "HYREC", + "STEEP", + "DV01", + "HEDGE_MAC", +] AssetClass = Literal["CSO", "Subprime", "CLO", "CRT"] @@ -154,6 +166,7 @@ register_adapter(Frequency, lambda f: AsIs(f.value)) class DealType(Enum): Bond = "BOND" CDS = "CDX" + Swaption = "SWAPTION" class Deal: @@ -284,11 +297,16 @@ class CDSDeal( default_factory=lambda: next_business_day(datetime.date.today()), metadata={"mtm": "First Payment Date"}, ) + orig_attach: int = field(default=None, metadata={"mtm": "Attachment Point"}) + orig_detach: int = field(default=None, metadata={"mtm": "Exhaustion Point"}) 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, "mtm": "Swap ID"}) + initial_margin_percentage: float = field( + default=None, metadata={"mtm": "Independent Amount (%)"} + ) bbg_ticket_id: str = None def __post_init__(self): @@ -317,7 +335,7 @@ class CDSDeal( obj["Protection"] = "Buy" if obj["protection"] == "Buyer" else "Sell" obj["Entity Matrix"] = "Publisher" obj["Definitions Type"] = "ISDA2014Credit" - obj["Independent Amount (%)"] = obj["initial_margin_percentage"] + # obj["Independent Amount (%)"] = obj["initial_margin_percentage"] if "ITRX" in obj["security_desc"]: obj["Include Contractual Supplement"] = "Y" obj["Contractual Supplement"] = "StandardiTraxxEuropeTranche" @@ -381,3 +399,55 @@ class BondDeal(BbgDeal, Deal, deal_type=DealType.Bond, table_name="bonds"): buysell=line["Side"] == "B", bbg_ticket_id=line["bbg_ticket_id"], ) + + +@dataclass +class SwaptionDeal( + Deal, + deal_type=DealType.Swaption, + table_name="swaptions", + insert_ignore=("id", "dealid"), +): + buysell: bool + fund: Fund = field(metadata={"mtm": "Account Abbreviation"}) + cp_code: str = field(metadata={"mtm": "Broker Id"}) + security_id: str = field(metadata={"mtm": "RED"}) + maturity: datetime.date = field(metadata={"mtm": "Maturity Date"}) + currency: Ccy = field(metadata={"mtm": "Currency Code"}) + notional: float = field(metadata={"mtm": "1st Leg Notional"}) + fixed_rate: float = field(metadata={"mtm": "1st Leg Rate"}) + strike: float = field(metadata={"mtm": "Strike Price"}) + price: float + option_type: OptionType + expiration_date: datetime.date = field(metadata={"mtm": "Expiration"}) + portfolio: Portfolio = field(default=None) + folder: SwaptionStrat = field(default=None) + trade_date: datetime.date = field( + default_factory=datetime.date.today(), metadata={"mtm": "Trade Date"} + ) + settle_date: datetime.date = field( + default_factory=lambda: next_business_day(datetime.date.today()), + metadata={"mtm": "Settle Date"}, + ) + expiration_date: datetime.date = field( + metadata={"mtm": "Swaption Expiration Date"}, + ) + initial_margin_percentage: float = field( + default=None, metadata={"mtm": "Independent Amount (%)"} + ) + id: int = field(default=None, metadata={"insert": False}) + dealid: str = field(default=None, metadata={"insert": False, "mtm": "Swap ID"}) + + def to_markit(self): + obj = self.serialize("mtm") + obj["Initial Payment"] = obj["price"] * obj["1st Leg Notional"] + obj["Transaction Code"] = "Receive" if obj["buysell"] else "Pay" + obj["Trade ID"] = obj["Swap ID"] + obj["Product Type"] = "CDISW" + obj["Transaction Type"] = "NEW" + obj["Protection"] = "Buy" if obj["protection"] == "Buyer" else "Sell" + obj["Entity Matrix"] = "Publisher" + obj["Clearing House"] = "ICE_FCM_US" + obj["Swaption Settlement Type"] = "Physical" + obj["OptionBuySellIndicator"] = "Buy" if obj["buysell"] else "Sell" + return obj |
