aboutsummaryrefslogtreecommitdiffstats
path: root/python/risk/swaptions.py
blob: 99e4ebc6eb286cd1146ee52be146cc490e08d90b (plain)
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
import logging

from analytics import Portfolio, BlackSwaption
from db import DataError

logger = logging.getLogger(__name__)

def get_swaption_portfolio(date, conn, **kwargs):
    with conn.cursor() as c:
        c.execute("SELECT id, dealid FROM swaptions "
                  "WHERE (termination_date is NULL or termination_date > %s) "
                  "AND expiration_date > %s AND trade_date <= %s "
                  "AND swap_type='CD_INDEX_OPTION'", (date, date, date))
        try:
            trade_ids, deal_ids = zip(*c)
        except ValueError:
            return {}
    portf = Portfolio([BlackSwaption.from_tradeid(t) for t in trade_ids],
                      trade_ids=deal_ids)
    portf.value_date = date
    portf.mark(interp_method='bivariate_linear', **kwargs)
    return portf


def insert_swaption_portfolio(portf, conn):
    sql_str = "INSERT INTO swaption_marks VALUES(%s, %s, %s, %s, %s, %s, %s)"
    with conn.cursor() as c:
        for id, trade in portf.items():
            to_insert = (id, trade.value_date, trade.pv, trade.delta,
                         trade.gamma, trade.vega, trade.theta)
            try:
                c.execute(sql_str, to_insert)
            except DataError as e:
                logger.error(e)
            finally:
                logger.info("succesfully marked trade id: %s", id)
    conn.commit()