aboutsummaryrefslogtreecommitdiffstats
path: root/python/report_ops
diff options
context:
space:
mode:
Diffstat (limited to 'python/report_ops')
-rw-r--r--python/report_ops/__main__.py33
-rw-r--r--python/report_ops/sma.py34
2 files changed, 64 insertions, 3 deletions
diff --git a/python/report_ops/__main__.py b/python/report_ops/__main__.py
index 2f49169c..fcf909c6 100644
--- a/python/report_ops/__main__.py
+++ b/python/report_ops/__main__.py
@@ -4,7 +4,17 @@ from serenitas.utils.db import dbconn
import logging
import argparse
import datetime
-from .sma import IsoselSMA, BowdstSMA
+from .sma import (
+ IsoselSMA,
+ BowdstSMA,
+ PositionReport,
+ BondPosition,
+ FuturePosition,
+ TranchePosition,
+ CDXPosition,
+ IRSwaptionPosition,
+ CDXSwaptionPosition,
+)
from .cash import NTCashReport, UMBCashReport, BNYCashReport
from .admin import AccruedReport, AllReport
from .wires import BowdstWire, NTWire
@@ -38,6 +48,13 @@ parser.add_argument(
action="store_true",
help="upload trade files to notify custodians",
)
+
+parser.add_argument(
+ "-sp",
+ "--send_positions",
+ action="store_true",
+ help="upload position files to fund admins",
+)
parser.add_argument(
"-n", "--no-upload", action="store_true", help="do not upload, just create files"
)
@@ -100,3 +117,17 @@ if args.send_to_custodians:
upload_to_custodian(account, args.date, conn, not args.no_upload, em)
except ValueError as e:
logger.info(e)
+
+if args.send_positions:
+ conn = dbconn("dawndb")
+ for fund in ("ISOSEL", "BOWDST"):
+ for position_report in (
+ BondPosition,
+ FuturePosition,
+ TranchePosition,
+ CDXPosition,
+ IRSwaptionPosition,
+ CDXSwaptionPosition,
+ ):
+ position_report.stage_positions(cob, fund)
+ PositionReport.build_buffer(cob, fund, not args.no_upload)
diff --git a/python/report_ops/sma.py b/python/report_ops/sma.py
index 8b95496c..bb58fe07 100644
--- a/python/report_ops/sma.py
+++ b/python/report_ops/sma.py
@@ -10,6 +10,9 @@ import pandas as pd
from io import StringIO
from typing import ClassVar
from .headers import POSITION_HEADERS
+from io import StringIO
+import csv
+from serenitas.utils.env import DAILY_DIR
@dataclass
@@ -95,6 +98,19 @@ _fund_client = {"BOWDST": "Hedgemark", "ISOSEL": "Innocap"}
_fund_fcm = {"BOWDST": "GS_FCM", "ISOSEL": "BOA_FC"}
+def get_path(cob, fund):
+ match fund:
+ case "ISOSEL":
+ filepath_pattern = "Innocap_{fund}_positions_{cob:%Y%m%d}.csv"
+ case _:
+ filepath_pattern = "{fund}_positions_{cob:%Y%m%d}.csv"
+ return (
+ DAILY_DIR
+ / str(datetime.date.today())
+ / filepath_pattern.format(fund=fund, cob=cob)
+ )
+
+
@dataclass
class PositionReport(Deal, deal_type=None, table_name=None):
client_name: str = field(metadata={"position": "Client Name"})
@@ -134,6 +150,7 @@ class PositionReport(Deal, deal_type=None, table_name=None):
account: str = field(default=None, metadata={"position": "AccountNumber"})
primebroker: str = field(default=None, metadata={"position": "Prime Broker"})
price: float = field(default=None, metadata={"position": "MarketPrice"})
+ staging_queue: ClassVar = []
asset_class: ClassVar[str] = field(metadata={"position": "Product Type"})
_query: ClassVar[str]
@@ -148,8 +165,21 @@ class PositionReport(Deal, deal_type=None, table_name=None):
c.execute(cls._query, params)
for row in c:
position = cls.from_query(row._asdict(), cob, fund)
- print(position)
- position.serialize("position")
+ cls.staging_queue.append(position.serialize("position"))
+
+ @classmethod
+ def build_buffer(cls, cob, fund, upload=False):
+ buf = StringIO()
+ csvwriter = csv.writer(buf)
+ csvwriter.writerow(POSITION_HEADERS)
+ csvwriter.writerows(
+ [[obj.get(h) for h in POSITION_HEADERS] for obj in cls.staging_queue]
+ )
+ buf = buf.getvalue().encode()
+ dest = get_path(cob, fund)
+ dest.parent.mkdir(exist_ok=True)
+ dest.write_bytes(buf)
+ return buf, dest
def from_query(d, cob, fund):
d["client_name"] = _fund_client[fund]