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()