aboutsummaryrefslogtreecommitdiffstats
path: root/python/calibrate_swaption.py
blob: 6432c5cbc7d2df0997102baf7b6ca4fb330b4fdd (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
import pandas as pd
from analytics import Index, Swaption
import pdb
from db import dbconn
from joblib import Parallel, delayed
serenitasdb = dbconn('serenitasdb')

data = pd.read_sql("SELECT * from swaption_ref_quotes JOIN swaption_quotes " \
                   "USING (quotedate, index, series, expiry) WHERE index=%s and series=%s " \
                   "ORDER BY quotedate",
                   "postgresql://serenitas_user@debian/serenitasdb",
                   params = ('IG', 27), parse_dates = ['quotedate', 'expiry'])

ig27 = Index.from_name("ig", 27, "5yr")
sigma = {}
sql_str = "INSERT INTO swaption_calib VALUES({}) ON CONFLICT DO NOTHING".format(",".join(["%s"] * 9))


def calib(d, payer, receiver):
    payer.strike = d['strike']
    receiver.strike = d['strike']
    payer.pv = (d['pay_bid'] + d['pay_offer'])/2 * 1e-4
    vol_payer = payer.sigma
    receiver.pv = (d['rec_bid'] + d['rec_offer'])/2 * 1e-4
    vol_receiver = receiver.sigma
    payer.pv_black = (d['pay_bid'] + d['pay_offer'])/2 * 1e-4
    vol_payer_black = payer.sigma
    receiver.pv_black = (d['rec_bid'] + d['rec_offer'])/2 * 1e-4
    vol_receiver_black = receiver.sigma
    return (d['quotedate'], "IG", 27, expiry, d['strike'], vol_payer, vol_receiver,
                                vol_payer_black, vol_receiver_black)

for k, v in data.groupby([lambda x: data['quotedate'].loc[x].date(), 'expiry']):
    trade_date, expiry = k
    print(trade_date)
    ig27.trade_date = trade_date
    ig27.spread = v['ref'].iat[0]
    payer = Swaption(ig27, expiry.date(), 70)
    receiver = Swaption(ig27, expiry.date(), 70, "receiver")
    r = Parallel(n_jobs=4)(delayed(calib)(d, payer, receiver) for d in
                           v[['quotedate', 'strike', 'pay_bid', 'pay_offer', 'rec_bid', 'rec_offer']].
                           to_dict(orient = 'records'))
    with serenitasdb.cursor() as c:
        c.executemany(sql_str, r)
        serenitasdb.commit()