import datetime from pyisda.date import previous_twentieth from utils.db import serenitas_pool, dbconn from risk.tranches import get_tranche_portfolio from dates import bus_day from typing import Tuple def accrual_days(event_date, auction_date): return (event_date - previous_twentieth(auction_date)).days + 1 def get_default_information(auction_date: datetime.date, conn): with conn.cursor() as c: c.execute("SELECT * FROM defaulted WHERE auction_date=%s", (auction_date,)) r = c.fetchone() acc = accrual_days(r.event_date, r.auction_date) severity = 1 - r.recovery return severity, acc def insert_tranche_cashflows( auction_date: datetime.date, severity: float, acc: float, tranche_ids: Tuple[int], dawndb, ): data = [] with dawndb.cursor() as c: c.execute( "SELECT id, notional, protection, orig_attach, orig_detach, " "fixed_rate / 100 AS coupon_rate FROM cds WHERE id IN %s", (tranche_ids,), ) for r in c: direction = 1.0 if r.protection == "Buyer" else -1.0 notional = r.notional / (r.orig_detach - r.orig_attach) accrued = -direction * severity * acc * r.coupon_rate / 360 * notional principal = direction * notional * severity data.append([r.id, principal, accrued]) with dawndb.cursor() as c: for tranche_id, principal, accrued in data: c.execute( "INSERT INTO tranche_cashflows VALUES(%s, %s, %s, %s, %s)", (auction_date + bus_day, tranche_id, principal, accrued, "USD"), ) dawndb.commit() # portf = get_tranche_portfolio(datetime.date(2020, 6, 19), dawndb) # with dawndb.cursor() as c: # for t in portf: # c.execute( # "INSERT INTO tranche_cashflows(date, tranche_id, accrued, currency) " # "VALUES(%s, %s, %s, %s)", # ( # datetime.date(2020, 6, 22), # t.trade_id, # -t.cs["coupons"][0] * t.tranche_running * t.notional * 1e-4, # t.currency, # ), # ) # dawndb.commit() if __name__ == "__main__": conn = serenitas_pool.getconn() dawndb = dbconn("dawndb") auction_date = datetime.date(2020, 7, 7) severity, acc = get_default_information(auction_date, conn) insert_tranche_cashflows(auction_date, severity, acc, (1590, 1413, 1116), dawndb) serenitas_pool.putconn(conn)