diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/innocap_file_transfer.py | 22 | ||||
| -rw-r--r-- | python/position_file_isosel.py | 227 | ||||
| -rw-r--r-- | python/report_ops/sma.py | 16 |
3 files changed, 32 insertions, 233 deletions
diff --git a/python/innocap_file_transfer.py b/python/innocap_file_transfer.py index db555a66..7e39a264 100644 --- a/python/innocap_file_transfer.py +++ b/python/innocap_file_transfer.py @@ -2,8 +2,9 @@ from io import BytesIO from serenitas.utils.env import DAILY_DIR import datetime from csv_headers.citco import GIL, GTL -from serenitas.utils.remote import SftpClient +from serenitas.utils.remote import Client from serenitas.analytics.dates import prev_business_day +from report_ops.sma import build_position_file def concat_csv(file_type, date): @@ -23,16 +24,28 @@ def concat_csv(file_type, date): return buf.getvalue(), fname -def main(date, upload): +def upload_citco_files(date, upload): for file_type in ("trade", "instrument"): buf, fname = concat_csv(file_type, date) dest = DAILY_DIR / str(date) / fname dest.write_bytes(buf) if upload: - innocap_sftp = SftpClient.from_creds("innocap", folder="Innocap") + innocap_sftp = Client.from_creds("innocap", folder="Innocap") innocap_sftp.put(buf, fname) +def upload_position_files(date, fund, upload): + buf, dest = build_position_file( + date, + fund, + ) + if upload: + client = Client.from_creds("innocap", folder="Innocap") + client.put(buf, dest.name) + client = Client.from_creds("citco") + client.put(buf, dest.name) + + if __name__ == "__main__": import argparse @@ -53,4 +66,5 @@ if __name__ == "__main__": ) args = parser.parse_args() - main(args.cob, not args.no_upload) + upload_citco_files(args.cob, not args.no_upload) + upload_position_files(args.cob, "ISOSEL", not args.no_upload) diff --git a/python/position_file_isosel.py b/python/position_file_isosel.py deleted file mode 100644 index f653aed2..00000000 --- a/python/position_file_isosel.py +++ /dev/null @@ -1,227 +0,0 @@ -import datetime -import csv -from io import StringIO -from serenitas.utils.misc import rename_keys -from serenitas.utils.remote import SftpClient -from serenitas.utils.env import DAILY_DIR -from pandas.tseries.offsets import MonthEnd -from serenitas.utils.exchange import ExchangeMessage, FileAttachment -from serenitas.analytics.dates import prev_business_day - - -def process_upload(trades, upload): - buf = StringIO() - csvwriter = csv.writer(buf) - csvwriter.writerow(ISOSEL_HEADERS) - csvwriter.writerows(build_line(trade) for trade in trades) - buf = buf.getvalue().encode() - fname = f"Innocap_ISOSEL_positions_{args.date}.csv" - if upload: - innocap_sftp = SftpClient.from_creds("innocap", folder="Innocap") - innocap_sftp.put(buf, fname) - citco_sftp = SftpClient.from_creds("citco", folder="incoming") - citco_sftp.put(buf, fname) - base_dir = DAILY_DIR / str(datetime.date.today()) - base_dir.mkdir(exist_ok=True, parents=True) - dest = base_dir / fname - dest.write_bytes(buf) - return fname, buf - - -def build_line(obj): - return [obj.get(h, None) for h in ISOSEL_HEADERS] - - -ISOSEL_HEADERS = [ - "Client Name", - "Fund Name", - "Counterparty", - "AccountNumber", - "COB Date", - "SecurityDescription", - "Prime Broker", - "Product Type", - "Unique Deal ID", - "TransactionIndicator (Buy/Sell)", - "PutCall Indicator (Call/Put)", - "CapFloorIndicator", - "CurrencyPair", - "DealCurrencyA", - "DealCurrencyB", - "NotionalA", - "NotionalB", - "OriginalPrice", - "Strike", - "FixedRate", - "Quantity", - "Start Date", - "Effective Date", - "Maturity Date", - "Underlying Maturity", - "RecPayFixed", - "Underlying (ISIN / CUSP / RED CODES)", - "Underlying Desc", - "Exercise Type", - "MTM Currency", - "MTM Valuation", - "MarketPrice", - "COB Date", - "Clearing House Name", -] -_sql_query = { - "bond": "SELECT * FROM risk_positions(%s, null, 'ISOSEL') ", - "future": ( - "WITH tmp AS (SELECT bbg_ticker, fund, security_desc, currency, maturity, sum(quantity * (2*buysell::int-1)) OVER (PARTITION BY bbg_ticker, fund, security_desc, currency, maturity) notional FROM futures " - "WHERE fund='ISOSEL' AND trade_date <= %s) " - "SELECT bbg_ticker, notional, code AS cp_code, cash_account, security_desc, currency, maturity FROM tmp LEFT JOIN accounts USING (fund) WHERE tmp.notional != 0 AND account_type='Future';" - ), - "tranche": "SELECT trb.trade_id, trb.serenitas_clean_nav + trb.serenitas_accrued as mtm, trb.notional * trb.tranche_factor as active_notional, cds.* FROM tranche_risk_isosel trb left join cds on trade_id=id WHERE date=%s", - "cdx_swaption": "SELECT abs(spr.notional) AS active_notional, spr.serenitas_nav, swaptions.*, index_version_markit.annexdate FROM list_swaption_positions_and_risks(%s, 'ISOSEL') spr LEFT JOIN swaptions ON deal_id=dealid LEFT JOIN index_version_markit ON swaptions.security_id=redindexcode;", - "ir_swaption": "SELECT abs(spr.notional) AS active_notional, spr.nav as serenitas_nav, swaptions.*, index_version_markit.effectivedate FROM list_ir_swaption_positions(%s, 'ISOSEL') spr LEFT JOIN swaptions ON deal_id=dealid LEFT JOIN index_version_markit ON swaptions.security_id=redindexcode;", - "cdx": "SELECT cds.*, ivm.effectivedate FROM list_cds_marks(%s, null, 'ISOSEL') cds LEFT JOIN index_version_markit ivm ON security_id=redindexcode;", -} - - -def _base_attrs(asset_class, date, obj): - obj["Client Name"] = "INNOCAP" - obj["Fund Name"] = "ISOSEL" - obj["COB Date"] = date - obj["Product Type"] = asset_class - obj["MTM Currency"] = "USD" - match asset_class: - case "bond": - rename_keys( - obj, - { - "identifier": "Underlying (ISIN / CUSP / RED CODES)", - "description": "SecurityDescription", - "notional": "NotionalA", - "price": "MarketPrice", - "local_market_value": "Local Market Value", - "usd_market_value": "MTM Valuation", - }, - ) - obj["Account Number"] = "NT" - obj["Prime Broker"] = "NT" - obj["DealCurrencyA"] = "USD" - case "future": - rename_keys( - obj, - { - "bbg_ticker": "Underlying (ISIN / CUSP / RED CODES)", - "notional": "NotionalA", - "cp_code": "Prime Broker", - "cash_account": "AccountNumber", - "security_desc": "SecurityDescription", - "currency": "DealCurrencyA", - "maturity": "MaturityDate", - }, - ) - case "tranche": - obj["TransactionIndicator (Buy/Sell)"] = ( - "B" if obj["protection"] == "Buyer" else "S" - ) - rename_keys( - obj, - { - "dealid": "Unique Deal ID", - "cp_code": "Counterparty", - "currency": "DealCurrencyA", - "active_notional": "NotionalA", - "fixed_rate": "FixedRate", - "trade_date": "Start Date", - "effective_date": "EffectiveDate", - "maturity": "Maturity Date", - "security_id": "Underlying (ISIN / CUSP / RED CODES)", - "security_desc": "Underlying Desc", - "mtm": "MTM Valuation", - }, - ) - case "ir_swaption" | "cdx_swaption": - rename_keys( - obj, - { - "dealid": "Unique Deal ID", - "cp_code": "Counterparty", - "currency": "DealCurrencyA", - "active_notional": "NotionalA", - "fixed_rate": "FixedRate", - "strike": "Strike", - "effectivedate": "Effective Date", - "trade_date": "Start Date", - "maturity": "Maturity Date", - "expiration_date": "Underlying Maturity", - "security_id": "Underlying (ISIN / CUSP / RED CODES)", - "security_desc": "Underlying Desc", - "nav": "MTM Valuation", - }, - ) - obj["TransactionIndicator (Buy/Sell)"] = "B" if obj["buysell"] else "S" - obj["PutCall Indicator (Call/Put)"] = ( - "P" if obj["option_type"] == "PAYER" else "C" - ) - obj["Exercise Type"] = "European" - case "cdx": - obj["Counterparty"] = "BOA_FC" - obj["Unique Deal ID"] = obj["security_id"] - obj["TransactionIndicator (Buy/Sell)"] = "B" if obj["notional"] > 0 else "S" - obj["DealCurrencyA"] = "EUR" if obj["index"] in ("EU", "XO") else "USD" - obj["NotionalA"] = abs(obj["notional"]) * obj["factor"] - obj["Start Date"] = date - obj["MTM Valuation"] = obj["clean_nav"] + obj["accrued"] - obj["Clearing House Name"] = "ICE" - obj["FixedRate"] = obj["coupon"] * 100 - rename_keys( - obj, - { - "effectivedate": "Effective Date", - "maturity": "Maturity Date", - "security_id": "Underlying (ISIN / CUSP / RED CODES)", - "security_desc": "Underlying Desc", - }, - ) - return obj - - -def main(conn, date, upload): - trades = [] - with conn.cursor() as c: - for asset_class in ( - "bond", - "future", - "tranche", - "cdx_swaption", - "ir_swaption", - "cdx", - ): - c.execute(_sql_query[asset_class], (date,)) - for row in c: - obj = row._asdict() - obj = _base_attrs(asset_class, date, obj) - trades.append(obj) - process_upload(trades, upload=True) - - -if __name__ == "__main__": - import argparse - from serenitas.utils.db import dbconn - - parser = argparse.ArgumentParser( - description="Generate position files for ISOSEL Street" - ) - parser.add_argument( - "date", - nargs="?", - type=datetime.date.fromisoformat, - default=prev_business_day(datetime.date.today()), - ) - parser.add_argument( - "--no-upload", - "-n", - action="store_true", - default=False, - help="uploads to citco and innocap", - ) - args = parser.parse_args() - conn = dbconn("dawndb") - main(conn, args.date, not args.no_upload) diff --git a/python/report_ops/sma.py b/python/report_ops/sma.py index 807a1a25..83d400c5 100644 --- a/python/report_ops/sma.py +++ b/python/report_ops/sma.py @@ -15,7 +15,19 @@ import csv from serenitas.utils.env import DAILY_DIR -def build_position_file(cob, fund, asset_classes: list): +def build_position_file( + cob, + fund, + asset_classes: list = [ + "bond", + "future", + "tranche", + "ir_swaption", + "cdx_swaption", + "irs", + "cdx", + ], +): for asset_class in asset_classes: for position in PositionReport[asset_class].gen_positions(cob, fund): PositionReport.staging_queue.append(position.to_position()) @@ -110,7 +122,7 @@ _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" + filepath_pattern = "Innocap_{fund}_positions_{cob:%Y-%m-%d}.csv" case _: filepath_pattern = "{fund}_positions_{cob:%Y%m%d}.csv" return get_dir() / filepath_pattern.format(fund=fund, cob=cob) |
