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
|
import datetime
from pyisda.date import previous_twentieth
from serenitas.utils.db import dbconn, serenitas_pool
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()
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(2020, 12, 18), dawndb, fund)
|