aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/reallocate_iam.py100
1 files changed, 99 insertions, 1 deletions
diff --git a/python/reallocate_iam.py b/python/reallocate_iam.py
index 18fa6096..159e6e69 100644
--- a/python/reallocate_iam.py
+++ b/python/reallocate_iam.py
@@ -1,11 +1,109 @@
import datetime
import argparse
+from dataclasses import field, dataclass
from serenitas.ops.funds import Service
-from serenitas.ops.trade_dataclasses import IAMDeal
+from serenitas.ops.trade_dataclasses import Deal, Fund
+from serenitas.ops.headers import DealType
from serenitas.analytics.dates import prev_business_day
from serenitas.utils.db import dbconn
+_bowdst_iam_cp = {
+ "BAML_ISDA": "BOANNY",
+ "CS": "CSITLN",
+ "GS": "GOLINY",
+ "BNP": "BNPBNY",
+ "MS": "MSCILN",
+ "JPM": "JPCBNY",
+ "GS_FCM": "GOLDNY",
+}
+
+_serenitas_iam_cp = {
+ "BAML_ISDA": "BAMSNY",
+ "BAML_FCM": "BAMSNY",
+ "CS": "CSFBBO",
+ "GS": "GOLDNY",
+ "BNP": "BNPBNY",
+ "MS": "MSCSNY",
+ "JPM": "JPCBNY",
+ "WELLS": "WELFEI",
+ "CITI": "CITINY",
+}
+
+
+def get_custodian_account(fund, iam_broker):
+ match fund, iam_broker:
+ case ("SERCGMAST", "WELLS"):
+ return ("WELLSFCM", "WFNSCLMFCM")
+ case ("SERCGMAST", "BAML_FCM"):
+ return ("BOMLCM", "V0NSCLMFCM")
+ case ("BOWDST", "GS_FCM"):
+ return ("GS", "057363418ICE-CDS")
+ case ("SERCGMAST", _):
+ return ("UMB", "159260.1")
+ case ("BOWDST", _):
+ return ("BNY", "751254")
+
+
+def get_counterparty(fund, iam_broker):
+ match fund:
+ case "SERCGMAST":
+ return _serenitas_iam_cp[iam_broker]
+ case "BOWDST":
+ return _bowdst_iam_cp[iam_broker]
+
+
+@dataclass
+class IAMDeal(Deal, deal_type=DealType.IAM, table_name="iams"):
+ trade_date: datetime.date = field(metadata={"globeop": "Trade Date"})
+ folder: str = field(metadata={"globeop": "Folder"})
+ portfolio: str = field(metadata={"globeop": "Portfolio"})
+ broker: str
+ start_money: float = field(metadata={"globeop": "StartMoney"})
+ currency: str = field(metadata={"globeop": "Currency"})
+ fund: Fund = field(metadata={"globeop": "Fund"})
+ maturity: datetime.date = field(
+ default=None, metadata={"globeop": "ExpirationDate"}
+ )
+ uploaded: bool = False
+ is_offset: bool = False
+ id: int = field(default=None, metadata={"insert": False})
+ dealid: str = field(
+ default=None,
+ metadata={
+ "insert": False,
+ "globeop": "Deal Id",
+ },
+ )
+ cash_account: str = field(
+ default=None,
+ metadata={"insert": False, "select": False, "globeop": "Cash Account"},
+ )
+ custodian: str = field(default=None, metadata={"insert": False, "select": False})
+
+ def to_globeop(self, action):
+ obj = super().to_globeop(action)
+ obj["CallNoticeIndicator"] = "24H" if action == "NEW" else None
+ obj["TransactionIndicator"] = "DEPOSIT" if obj["StartMoney"] > 0 else "LOAN"
+ obj["StartMoney"] = abs(obj["StartMoney"])
+ obj["DealFunction"] = "OTC"
+ obj["MarginType"] = "Net"
+ obj["Collateralized"] = "Y"
+ obj["Basis"] = "ACT/360"
+ obj["SettlementDate"] = self.trade_date
+ obj["ClearingFacilityCcpTradeRef"] = (
+ "ICE-CLEAR"
+ if (self.broker.endswith("_FCM") or self.broker == "WELLS")
+ else None
+ )
+ (custodian, cash_account) = get_custodian_account(self.fund, self.broker)
+ obj = obj | {
+ "Custodian": custodian,
+ "Cash Account": cash_account,
+ "Counterparty": get_counterparty(self.fund, self.broker),
+ }
+ return obj
+
def cancel_old_iam_trades(fund: str, cob: datetime.date, conn) -> "Iterable":
"""Finds and cancels old IAM trades"""