diff options
Diffstat (limited to 'python/risk')
| -rw-r--r-- | python/risk/swaptions.py | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/python/risk/swaptions.py b/python/risk/swaptions.py index 3eb1dd54..c3410e71 100644 --- a/python/risk/swaptions.py +++ b/python/risk/swaptions.py @@ -9,20 +9,26 @@ logger = logging.getLogger(__name__) def get_swaption_portfolio(date, conn, **kwargs): with conn.cursor() as c: c.execute( - "SELECT swaptions.id, folder, dealid FROM swaptions " - "LEFT JOIN terminations USING (dealid) " - "WHERE (termination_date is NULL or termination_date > %s) " + "SELECT swaptions.id, folder, dealid, (notional - terminated_amount) AS notional " + "FROM swaptions LEFT JOIN (" + "SELECT dealid, SUM(termination_amount) AS terminated_amount " + "FROM terminations WHERE termination_date <= %s GROUP BY dealid) b " + "USING (dealid) " + "WHERE notional IS DISTINCT FROM terminated_amount " "AND expiration_date > %s AND trade_date <= %s " "AND swap_type='CD_INDEX_OPTION' ORDER BY expiration_date, strike", (date, date, date), ) try: - trade_ids, folders, deal_ids = zip(*c) + trade_ids, folders, deal_ids, notionals = zip(*c) except ValueError: return {} portf = Portfolio( [BlackSwaption.from_tradeid(t) for t in trade_ids], list(zip(folders, deal_ids)) ) + for t, ntl in zip(portf.trades, notionals): + if ntl is not None: + t.notional = ntl portf.value_date = date portf.mark(interp_method="bivariate_linear", **kwargs) return portf |
