aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/risk/swaptions.py14
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