aboutsummaryrefslogtreecommitdiffstats
path: root/python/bespoke_utils.py
blob: 2ff93e59788ad641123a888685a6afd299a4e5de (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
117
118
119
120
121
122
123
124
from bbg_helpers import BBG_IP, init_bbg_session, retrieve_data
from psycopg2.extensions import connection
from typing import List, Dict, Tuple
import datetime
import pandas as pd

def insert_bbg_tickers(conn: connection, tickers: List[str]) -> Dict[str, Tuple[str, str]]:
    """ insert bbg tickers into the database

    Parameters
    ----------
    conn: psycopg2 connection
    ticker: list of bloomberg tickers

    Returns
    -------
    dict mapping list of tickers to (company_id, seniority)
    """

    fields = ["cds_company_id", "cds_company_name", "crncy",
              "cds_restructuring_type", "cds_corp_tkr", "sw_seniority",
              "cds_curve_info", "restructuring_type_short_code"]
    securities = [f"{t} Corp" for t in tickers]
    with init_bbg_session(BBG_IP) as session:
        ticker_data = retrieve_data(session, securities, fields)
    placeholder = ",".join(["%s"] * 8)
    sql_str = ("INSERT INTO bbg_issuers(name, company_id, ticker, currency,"
               "seniority, doc_clause, cds_curve, short_code) "
               f"VALUES({placeholder}) "
               "ON CONFLICT DO NOTHING")
    d = {}
    with conn.cursor() as c:
        for k, v in ticker_data.items():
            c.execute(sql_str, (v["cds_company_name"],
                                v["cds_company_id"],
                                v.get("cds_corp_tkr"),
                                v["crncy"],
                                v["sw_seniority"],
                                v["cds_restructuring_type"].replace("-", " "),
                                v["cds_curve_info"]["Ticker"].to_list(),
                                v["restructuring_type_short_code"]))
            d[k.split()[0]] = (v["cds_company_id"], v["sw_seniority"])
    conn.commit()
    return d

def insert_bbg_markit_mapping(conn: connection, d: Dict[str, Tuple[str, str]], df: pd.DataFrame):
    sql_str = ("INSERT INTO bbg_markit_mapping VALUES(%s, %s, %s, %s, %s, %s) "
               "ON CONFLICT DO NOTHING")
    with conn.cursor() as c:
        for markit_ticker, bbg_ticker in df.itertuples(index=False):
            company_id, seniority = d[bbg_ticker]
            mkit_tier = "SNRFOR" if seniority == "Senior" else "SUBLT2"
            c.execute(sql_str, ("infinity", company_id, markit_ticker,
                                mkit_tier, 100, seniority))
    conn.commit()

def backpopulate_short_codes(conn: connection):
    with conn.cursor() as c:
        c.execute("SELECT cds_curve[6] from bbg_issuers")
        securities = [f"{t} Corp" for t, in c]
    with init_bbg_session(BBG_IP) as session:
        short_code = retrieve_data(session, securities,
                                   ["restructuring_type_short_code",
                                    "cds_company_id"])
    sql_str = "UPDATE bbg_issuers SET short_code=%s WHERE company_id=%s"
    with conn.cursor() as c:
        for v in short_code.values():
            if 'restructuring_type_short_code' in v:
                c.execute(sql_str,
                          (v["restructuring_type_short_code"], v["cds_company_id"]))
        c.executemany(sql_str,
                      [(v["restructuring_type_short_code"], v["cds_company_id"])
                       for v in short_code.values() if 'restructuring_type_short_code' in v])
    conn.commit()

def get_bbg_ids(conn: connection, df: pd.DataFrame,
                date: datetime.date = datetime.date.today()) -> pd.DataFrame:
    df_mapping = pd.read_sql_query("SELECT company_id, markit_ticker, markit_tier, "
                                   "seniority FROM historical_cds_issuers(%s) "
                                   "WHERE markit_ticker IS NOT NULL",
                                   conn, params=(date,),
                                   index_col=["markit_ticker", "markit_tier"])
    df.columns = ["markit_ticker", "markit_tier"]
    df = df.set_index(["markit_ticker", "markit_tier"])
    df = df.join(df_mapping).groupby(level=["markit_ticker", "markit_tier"]).first()
    df.company_id = df.company_id.astype("Int64")
    return df

def get_basketid(conn: connection, name: str) -> Tuple[int, int]:
    with conn.cursor() as c:
        c.execute("SELECT max(series)+1 FROM index_version where index='BS'")
        serie,  = c.fetchone()
        c.execute("INSERT INTO index_version(index, series, version, redindexcode) "
                  "VALUES('BS', %s, 1, %s) RETURNING basketid",
                  (serie, name))
        basket_id, = c.fetchone()
    conn.commit()
    return serie, basket_id

def add_basket_constituents(conn: connection, basketid: int,
                            df: pd.DataFrame = pd.read_clipboard(header=None)):

    df_bbg = get_bbg_ids(conn, df.iloc[:, :2])
    df.columns = ["markit_ticker", "markit_tier", "weight"]
    df = df.set_index(["markit_ticker", "markit_tier"])
    df = df.join(df_bbg)
    with conn.cursor() as c:
        c.executemany("INSERT INTO basket_constituents VALUES(%s, %s, %s, %s)",
                      [(t.company_id, t.seniority, basketid, t.weight)
                       for t in df.itertuples(index=False)])
    conn.commit()

if __name__ == "__main__":
    df = pd.read_clipboard(header=None)
    from db import serenitas_pool
    conn = serenitas_pool.getconn()
    df = get_bbg_ids(conn, pd.read_clipboard(header=None))
    #missing tickers
    missing_tickers = df[df.company_id.isnull()]
    df_mapping = pd.read_clipboard(header=None)
    bbg_tickers = df_mapping[1].to_list()
    d = insert_bbg_tickers(conn, bbg_tickers)
    insert_bbg_markit_mapping(conn, d, df_mapping)
    serenitas_pool.putconn(conn)