aboutsummaryrefslogtreecommitdiffstats
path: root/python/trade_dataclasses.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/trade_dataclasses.py')
-rw-r--r--python/trade_dataclasses.py122
1 files changed, 97 insertions, 25 deletions
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py
index 5ad8a325..664b3e80 100644
--- a/python/trade_dataclasses.py
+++ b/python/trade_dataclasses.py
@@ -703,14 +703,12 @@ class SwaptionDeal(
fund: Fund = field(metadata={"mtm": "Account Abbreviation", "citco": "Fund"})
cp_code: str = field(metadata={"mtm": "Broker Id", "citco": "ExecutionBroker"})
security_id: str = field(metadata={"mtm": "RED"})
- security_desc: str = field(metadata={"citco": "ExecutionBroker"})
+ security_desc: str = field(metadata={"citco": "SecurityDescription"})
maturity: datetime.date = field(metadata={"mtm": "Maturity Date"})
currency: Ccy = field(
- metadata={"mtm": "Currency Code", "citco": "SecurityDescription"}
- )
- notional: float = field(
- metadata={"mtm": "1st Leg Notional", "citco": "SecurityCurrency"}
+ metadata={"mtm": "Currency Code", "citco": "SecurityCurrency"}
)
+ notional: float = field(metadata={"mtm": "1st Leg Notional", "citco": "OrderQty"})
fixed_rate: float = field(metadata={"mtm": "1st Leg Rate"})
strike: float = field(metadata={"mtm": "Strike Price"})
price: float = field(metadata={"citco": "AvgPrice"})
@@ -779,12 +777,12 @@ class SwaptionDeal(
+ "_"
+ obj["SecurityDescription"].split()[4].removesuffix("Y")
)
- instrument = SwpationProduct(
+ instrument = SwaptionProduct(
underlying_security_id=redcode,
- instrument="SWPO",
+ instrument_type="BNDO",
callput=obj["option_type"] == "RECEIVER",
strike=obj["strike"],
- death_date=obj["expiration_date"],
+ expiration=obj["expiration_date"],
)
instrument.citco_stage()
obj["SecurityID"] = instrument.dealid
@@ -1088,18 +1086,24 @@ class TRSDeal(
portfolio: str = field(metadata={"globeop": "Portfolio"})
folder: str = field(metadata={"globeop": "Folder"})
cash_account: str = field(metadata={"globeop": "Cash Account"})
- cp_code: str = field(metadata={"globeop": "Counterparty", "mtm": "Broker Id"})
+ cp_code: str = field(
+ metadata={
+ "globeop": "Counterparty",
+ "mtm": "Broker Id",
+ "citco": "ExecutionBroker",
+ }
+ )
trade_date: datetime.date = field(
- metadata={"globeop": "Trade Date", "mtm": "Trade Date"}
+ metadata={"globeop": "Trade Date", "mtm": "Trade Date", "citco": "TradeDate"}
)
effective_date: datetime.date = field(
- init=False, metadata={"mtm": "Effective Date"}
+ init=False, metadata={"mtm": "Effective Date", "citco": "SettlementDate"}
)
maturity_date: datetime.date = field(metadata={"mtm": "Maturity Date"})
funding_index: str
buysell: bool
underlying_security: str
- price: float = field(metadata={"mtm": "Initial Fixing Amount"})
+ price: float = field(metadata={"mtm": "Initial Fixing Amount", "citco": "AvgPrice"})
accrued: float = field(metadata={"mtm": "Initial Payment"})
funding_freq: str
funding_daycount: str
@@ -1111,15 +1115,23 @@ class TRSDeal(
initial_margin_percentage: float = field(
metadata={"globeop": "InitialMarginPercent", "mtm": "Independent Amount (%)"}
)
- notional: float = field(metadata={"mtm": "1st Leg Notional"})
- currency: str = field(metadata={"mtm": "Currency Code"})
+ notional: float = field(metadata={"mtm": "1st Leg Notional", "citco": "OrderQty"})
+ currency: str = field(
+ metadata={"mtm": "Currency Code", "citco": "SecurityCurrency"}
+ )
interest_calc_method: str
compound_avg_frequency: str
fixing_frequency: str
cpty_id: str
id: int = field(default=None, metadata={"insert": False})
dealid: str = field(
- default=None, metadata={"insert": False, "mtm": "Swap ID", "globeop": "Deal Id"}
+ default=None,
+ metadata={
+ "insert": False,
+ "mtm": "Swap ID",
+ "globeop": "Deal Id",
+ "citco": "ClientOrderID",
+ },
)
def __post_init__(self):
@@ -1197,6 +1209,30 @@ class TRSDeal(
obj.update(d)
return obj
+ def to_citco(self):
+ obj = self.serialize("citco")
+ obj["FillID"] = obj["ClientOrderID"]
+ obj["SecurityType"] = "TRS"
+ obj["Trader"] = "serenitas_trader"
+ obj["StrategyCode"] = f"{obj['portfolio']}/{obj['folder']}"
+ obj["FillPrice"] = obj["AvgPrice"]
+ obj["BuySellShortCover"] = "B" if obj["payreceive"] == "Buy" else "S"
+ obj["FillQty"] = obj["OrderQty"]
+ obj["SettleCurrency"] = obj["SecurityCurrency"]
+ obj["IDSource"] = "USERID"
+ product = TRSProduct(
+ birth_date=self.trade_date,
+ death_date=self.maturity_date,
+ underlying_security=self.underlying_security,
+ funding_index=self.funding_index,
+ )
+ product.citco_stage()
+ obj["SecurityID"] = product.dealid
+ obj["ClearingAgent"] = obj["ExecutionBroker"]
+ obj["TradeDate"] = obj["TradeDate"].strftime("%Y%m%d")
+ obj["SettlementDate"] = obj["SettlementDate"].strftime("%Y%m%d")
+ return obj
+
@dataclass
class IRSDeal(
@@ -1211,16 +1247,20 @@ class IRSDeal(
portfolio: str = field(metadata={"globeop": "Portfolio"})
folder: str = field(metadata={"globeop": "Folder"})
cash_account: str = field(metadata={"globeop": "Folder"})
- cp_code: str = field(metadata={"globeop": "GiveUpCounterparty"})
- trade_date: datetime.date = field(metadata={"globeop": "Trade Date"})
- effective_date: datetime.date
+ cp_code: str = field(
+ metadata={"globeop": "GiveUpCounterparty", "citco": "ExecutionBroker"}
+ )
+ trade_date: datetime.date = field(
+ metadata={"globeop": "Trade Date", "citco": "TradeDate"}
+ )
+ effective_date: datetime.date = field(metadata={"citco": "SettlementDate"})
maturity_date: datetime.date
payreceive: bool
- fixed_rate: float
+ fixed_rate: float = field(metadata={"citco": "AvgPrice"})
fixed_daycount: str
fixed_payment_freq: str
fixed_bdc: str
- notional: float
+ notional: float = field(metadata={"citco": "OrderQty"})
float_index: str
float_daycount: str
float_payment_freq: str
@@ -1237,7 +1277,13 @@ class IRSDeal(
)
id: int = field(default=None, metadata={"insert": False})
dealid: str = field(
- default=None, metadata={"insert": False, "mtm": "Swap ID", "globeop": "Deal Id"}
+ default=None,
+ metadata={
+ "insert": False,
+ "mtm": "Swap ID",
+ "globeop": "Deal Id",
+ "citco": "ClientOrderID",
+ },
)
def __post_init__(self):
@@ -1284,6 +1330,30 @@ class IRSDeal(
obj.update(d)
return obj
+ def to_citco(self):
+ obj = self.serialize("citco")
+ obj["FillID"] = obj["ClientOrderID"]
+ obj["SecurityType"] = "IRS"
+ obj["Trader"] = "serenitas_trader"
+ obj["StrategyCode"] = f"{obj['portfolio']}/{obj['folder']}"
+ obj["FillPrice"] = obj["AvgPrice"]
+ obj["BuySellShortCover"] = "B" if obj["payreceive"] == "Buy" else "S"
+ obj["FillQty"] = obj["OrderQty"]
+ obj["SettleCurrency"] = obj["SecurityCurrency"]
+ obj["IDSource"] = "USERID"
+ product = IRSProduct(
+ birth_date=self.trade_date,
+ death_date=self.maturity_date,
+ fixed_rate=self.fixed_rate,
+ float_index=self.float_index,
+ )
+ product.citco_stage()
+ obj["SecurityID"] = product.dealid
+ obj["ClearingAgent"] = "BOAFC"
+ obj["TradeDate"] = obj["TradeDate"].strftime("%Y%m%d")
+ obj["SettlementDate"] = obj["SettlementDate"].strftime("%Y%m%d")
+ return obj
+
from enum import IntEnum
@@ -1322,7 +1392,9 @@ class TrancheProduct(
security_desc: str = field(
init=False, metadata={"insert": False, "citco": "Sec_Desc"}
)
- currency: str = field(init=False, default=None, metadata={"citco": "LocalCcy"})
+ currency: str = field(
+ init=False, default=None, metadata={"citco": "LocalCcy", "insert": False}
+ )
instrument_type: str = field(default="CDS", metadata={"citco": "InstrumentType"})
underlying_id_source: str = field(
default="RED", metadata={"citco": "UnderlyingIDSource"}
@@ -1411,8 +1483,7 @@ class SwaptionProduct(
)
def __post_init__(self):
- self.get_productid()
- if self.underlying_id_source == "BNDO":
+ if self.instrument_type == "BNDO":
sql_str = "SELECT issue_date, maturity, coupon, index, series FROM index_desc WHERE tenor='5yr' AND redindexcode=%s"
with self._conn.cursor() as c:
c.execute(sql_str, (self.underlying_security_id.removesuffix("_5"),))
@@ -1425,8 +1496,9 @@ class SwaptionProduct(
) = c.fetchone()
self.security_desc = f"{desc_str(index, series, '5')} {self.expiration}-{self.strike}-{'C' if self.callput else 'P'}-{self.birth_date}-{self.death_date}"
self.currency = "EUR" if index in ("XO", "EU") else "USD"
- elif self.underlying_id_source == "SWPO":
+ elif self.instrument_type == "SWPO":
self.security_desc = ""
+ self.get_productid()
def to_citco(self):
if not self.id: