import datetime from pyisda.date import previous_twentieth from serenitas.utils.db import dbconn, serenitas_pool from risk.tranches import get_tranche_portfolio from serenitas.analytics.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() def insert_tranche_accrued(d: datetime.date, dawndb, fund="SERCGMAST"): portf = get_tranche_portfolio(d, dawndb, fund=fund) 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)", ( t.cs["payment_dates"][0], t.trade_id, -t.cs["coupons"][0] * t.tranche_running * t.notional * 1e-4, t.currency, ), ) dawndb.commit() if __name__ == "__main__": dawndb = dbconn("dawndb") # conn = serenitas_pool.getconn() # auction_date = datetime.date(2020, 8, 4) # severity, acc = get_default_information(auction_date, conn) # insert_tranche_cashflows(auction_date, severity, acc, (1590, 1413), dawndb) # serenitas_pool.putconn(conn) import serenitas.analytics serenitas.analytics._include_todays_cashflows = True for fund in ("SERCGMAST", "BOWDST", "BRINKER"): insert_tranche_accrued(datetime.date(2021, 12, 17), dawndb, fund)