aboutsummaryrefslogtreecommitdiffstats
path: root/python/exploration/sell_vol.py
blob: 926192617a6134c4be80fa1a45dbe46372904b6b (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
import datetime

from quantlib.time.api import Date, Period, Months, Schedule, UnitedStates
from analytics.utils import third_wednesday
from analytics.option import BlackSwaption, BlackSwaptionVolSurface
from analytics.index import Index
from analytics.index_data import get_index_quotes
from quantlib.time.api import pydate_from_qldate

def get_trades(df, d):
    """ returns a Portfolio of options"""
    expiry = pydate_from_qldate(third_wednesday(d + Period(1, Months)))
    d = pydate_from_qldate(d)
    series, spread = df.loc[d]
    strike = round((spread * 1.2) / 2.5) * 2.5

    index = Index.from_name("IG", series, "5yr", value_date=d)
    index.spread = spread
    index.reset_pv()
    opt = BlackSwaption(index, expiry, strike, direction="Short")
    opt.notional = 100_000_000
    try:
        vol_surface = BlackSwaptionVolSurface("IG", series, value_date=d)
    except ValueError as e:
        print(e)
        return []
    surface_id = vol_surface.list(option_type="payer")[-1]
    opt.sigma = float(vol_surface.vol(expiry, 1.2, surface_id))
    opt.reset_pv()
    return [opt]

sched = Schedule.from_rule(Date(1, 7, 2014), Date(1, 4, 2018), Period(1, Months), UnitedStates())
df = get_index_quotes("IG", tenor=["5yr"], from_date=datetime.date(2014, 7, 1))
df = (df.reset_index(['index', 'version', 'tenor'], drop=True).
      reset_index(['series']).
      groupby(['date']).nth(-1))[['series', 'closespread']]
l = []
for d in sched:
    l.extend(get_trades(df, d))