aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics/ir_swaption.py
blob: 85d9c382147dbbd624777db455cb1a1576dd9fde (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
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
from db import dbconn
from quantlib.indexes.api import UsdLiborSwapIsdaFixAm
from quantlib.quotes import SimpleQuote
from quantlib.time.api import Date, Period, Years
from quantlib.instruments.api import MakeSwaption
from quantlib.instruments.swap import SwapType
from quantlib.pricingengines.api import BlackSwaptionEngine
from quantlib.settings import Settings

from yieldcurve import YC

class IRSwaption():
    """ adapter class for the QuantLib code"""
    def __init__(self, swap_index, option_tenor, strike, option_type="payer",
                 direction="Long", notional=10_000_000, yc=None):
        self._qloption = (MakeSwaption(swap_index, option_tenor, strike).
                          with_nominal(notional).
                          with_underlying_type(SwapType[option_type.title()])())
        if type(direction) is bool:
            self._direction = 2 * direction - 1
        else:
            self.direction = direction
        self._yc = yc or swap_index.forwarding_term_structure
        self._sigma = SimpleQuote(0.218)
        self._qloption.set_pricing_engine(BlackSwaptionEngine(self._yc, self._sigma))

    @property
    def direction(self):
        if self._direction == 1.:
            return "Long"
        else:
            return "Short"

    @direction.setter
    def direction(self, d):
        if d == "Long":
            self._direction = 1.
        elif d == "Short":
            self._direction = -1.
        else:
            raise ValueError("Direction needs to be either 'Long' or 'Short'")

    @property
    def pv(self):
        return self._direction * self._qloption.npv

    @property
    def sigma(self):
        return self._sigma.value

    @sigma.setter
    def sigma(self, s):
        self._sigma.value = s

    def from_tradeid(trade_id):
        with dbconn('dawndb') as conn:
            with conn.cursor() as c:
                c.execute("SELECT * from swaptions "
                          "WHERE id = %s", (trade_id,))
                rec = c.fetchone()
        yc = YC(evaluation_date=rec['trade_date'])
        p = Period(int(rec['security_id'].replace("USISDA", "")), Years)
        swap_index = UsdLiborSwapIsdaFixAm(p, yc)
        instance = IRSwaption(swap_index, Date.from_datetime(rec['expiration_date']),
                              rec['strike'], rec['option_type'], rec['buysell'],
                              rec['notional'])
        return instance

    @property
    def value_date(self):
        return Settings().evaluation_date