diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/reallocate_iam.py | 100 |
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""" |
