diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/report_ops/__main__.py | 33 | ||||
| -rw-r--r-- | python/report_ops/sma.py | 34 |
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] |
