aboutsummaryrefslogtreecommitdiffstats
path: root/python/margin_estimates.py
blob: 02979f0b3a99153132b565fbfff62a0a3e1e5309 (plain)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from serenitas.utils.db import dbconn
from serenitas.utils.exchange import ExchangeMessage, FileAttachment
from serenitas.utils.env import DAILY_DIR
from exchangelib import HTMLBody
import datetime
import argparse
from pandas.tseries.offsets import BDay
import pandas as pd
from premailer import transform
from collateral.common import load_pdf, get_col
from collateral.citi import get_total_collateral as get_collateral_citi
from collateral.cs import get_collateral as get_collateral_cs


def html_generator(df, column_name):
    formatters = {
        k: "{:,.2f}".format for k in ["excess", "receive", "amount to receive"]
    }
    return transform(
        df.style.format(formatter=formatters, thousands=",")
        .set_table_attributes('border="1"')
        .applymap(lambda x: "text-align: right;", subset=[column_name])
        .hide_index()
        .render()
    )


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "trade_date",
        nargs="?",
        default=(datetime.date.today() - BDay(1)).date(),
        type=datetime.date.fromisoformat,
    )
    args = parser.parse_args()
    dawndb = dbconn("dawndb")

    cp_mapping = {
        "CITI": "Citi",
        "MS": "Morgan Stanley",
        "GS": "Goldman Sachs",
        "BOMLCM": "Baml FCM",
        "BAML_ISDA": "Baml OTC",
        "WELLS": "Wells Fargo",
        "BNP": "BNP Paribas",
        "CS": "Credit Suisse",
        "JPM": "JP Morgan",
        "WELLSFCM": "Wells Fargo FCM",
    }

    isda_cp = pd.read_sql_query(
        "SELECT date, broker as counterparty, -sum(amount) as excess "
        "FROM strategy_im "
        "WHERE strategy='CSH_CASH' "
        "GROUP BY broker, date, fund "
        "HAVING date=%s AND fund='SERCGMAST' ORDER BY date DESC",
        con=dawndb,
        params=(args.trade_date,),
    )
    isda_cp["counterparty"] = isda_cp["counterparty"].map(cp_mapping)
    fcm_cp = pd.read_sql_query(
        "SELECT date, custodian AS counterparty, current_excess_deficit AS excess "
        "FROM fcm_moneyline fm LEFT JOIN accounts ON account=cash_account "
        "WHERE date=%s AND fund='SERCGMAST' AND currency='ZZZZZ'",
        con=dawndb,
        params=(args.trade_date,),
    )
    fcm_cp["counterparty"] = fcm_cp.counterparty.map(cp_mapping)
    payment_settlements = pd.read_sql_query(
        "SELECT settle_date, name as counterparty, asset_class, currency, payment_amount as receive FROM payment_settlements ps "
        "WHERE settle_date between %s AND %s AND fund='SERCGMAST' "
        "ORDER BY settle_date ASC",
        con=dawndb,
        params=((args.trade_date + BDay(1)).date(), (args.trade_date + BDay(3)).date()),
    )
    payment_settlements_agg = pd.read_sql_query(
        "SELECT settle_date , currency, sum(payment_amount) as receive "
        "FROM payment_settlements WHERE fund='SERCGMAST' AND settle_date "
        "BETWEEN %s AND %s GROUP BY settle_date, currency "
        "ORDER BY settle_date ASC",
        con=dawndb,
        params=((args.trade_date + BDay(1)).date(), (args.trade_date + BDay(3)).date()),
    )
    citi_collateral = pd.DataFrame({
        "account": ["VM", "IM"],
        "amount to receive": get_collateral_citi(args.trade_date)[2:]})
    cs_collateral = get_collateral_cs(args.trade_date, "Serenitas")
    cs_collateral = pd.DataFrame({
        "account": list(cs_collateral),
        "amount to receive": cs_collateral.values()
    })
    body = [
        "<html><body>",
        "<h3> Collateral Estimates Receive/(Pay) at ISDA :</h3>",
        html_generator(isda_cp, "excess"),
        "<h3> Collateral Estimates Receive/(Pay) at FCM :</h3>",
        html_generator(fcm_cp, "excess"),
        "<h3>Payment Settlements By Date :</h3>",
        html_generator(payment_settlements_agg, "receive"),
        "<h3>Payment Settlements :</h3>",
        html_generator(payment_settlements, "receive"),
        "<h3>Citi Breakdown :</h3>",
        html_generator(citi_collateral, "amount to receive"),
        "<h3>CS Breakdown :</h3>",
        html_generator(cs_collateral, "amount to receive"),
        "</body></html>",
    ]

    em = ExchangeMessage()
    em.send_email(
        f"Collateral Estimates {args.trade_date:%Y-%m-%d}",
        HTMLBody("".join(body)),
        ["NYOps@lmcg.com"],
        ["fyu@lmcg.com"],
    )