aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/calibrate_swaption.py45
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()