aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/innocap_file_transfer.py22
-rw-r--r--python/position_file_isosel.py227
-rw-r--r--python/report_ops/sma.py16
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)