diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/calibrate_swaption.py | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/python/calibrate_swaption.py b/python/calibrate_swaption.py new file mode 100644 index 00000000..6432c5cb --- /dev/null +++ b/python/calibrate_swaption.py @@ -0,0 +1,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() |
