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