1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
import pandas as pd
from importlib import import_module
from utils import SerenitasFileHandler
from utils.db import dawn_engine, dbconn
from . import bus_day
from .common import get_dawn_trades, send_email
from pandas.tseries.offsets import BDay
import argparse
import logging
fh = SerenitasFileHandler("collateral_calc.log")
logger = logging.getLogger("collateral_calc")
logger.addHandler(fh)
logger.setLevel(logging.WARNING)
parser = argparse.ArgumentParser()
parser.add_argument(
"workdate",
nargs="?",
type=lambda s: pd.datetime.strptime(s, "%Y-%m-%d").date(),
default=pd.Timestamp.today().normalize(),
)
parser.add_argument(
"-d", "--download", action="store_true", help="download counterparty reports"
)
parser.add_argument(
"-s", "--send-email", action="store_true", help="send email to Globeop"
)
args = parser.parse_args()
counterparties = ["citi", "ms", "gs", "baml_fcm", "baml_isda", "wells"]
if args.download:
for cp in counterparties:
cp_mod = import_module(f".{cp}", "collateral")
cp_mod.download_files()
dawn_trades = get_dawn_trades(args.workdate, dawn_engine)
df = {}
mapping = {"baml_fcm": "BAML", "wells": "WF"}
for cp in counterparties:
print(cp)
cp_mod = import_module("." + cp, "collateral")
if cp in ["baml_fcm", "wells"]:
positions = pd.read_sql_query(
"SELECT security_id, security_desc, maturity, "
"folder, notional, currency "
"FROM list_cds_positions_by_strat_fcm(%s, %s)",
dawn_engine,
params=(args.workdate.date(), mapping[cp]),
index_col=["security_id", "maturity"],
)
else:
positions = dawn_trades
try:
df[cp.upper()] = cp_mod.collateral(args.workdate, positions, dawn_engine)
except FileNotFoundError as e:
logger.info(e)
df[cp.upper()] = cp_mod.collateral(
args.workdate - bus_day, positions, dawn_engine
)
except ValueError as e:
logger.error(e)
if cp == "citi":
args.workdate = args.workdate - BDay()
df = pd.concat(df, names=["broker", "strategy"]).reset_index()
df.strategy = df.strategy.str.replace("^(M_|SER_)?", "", 1)
df = df[["date", "broker", "strategy", "Amount", "Currency"]]
conn = dbconn("dawndb")
sql_str = (
"INSERT INTO strategy_im VALUES(%s, %s, %s, %s, %s) "
"ON CONFLICT (date, strategy, broker) DO UPDATE "
"SET currency=EXCLUDED.currency, amount=EXCLUDED.amount"
)
with conn.cursor() as c:
for t in df.itertuples(index=False):
c.execute(sql_str, t)
conn.commit()
conn.close()
if args.send_email:
send_email(args.workdate, df)
|