aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/calibrate_swaption.py58
1 files changed, 37 insertions, 21 deletions
diff --git a/python/calibrate_swaption.py b/python/calibrate_swaption.py
index 3db3410c..ba5066ba 100644
--- a/python/calibrate_swaption.py
+++ b/python/calibrate_swaption.py
@@ -2,19 +2,30 @@ import pandas as pd
import argparse
from analytics import Index, Swaption
import datetime
-from db import dbconn
+from db import dbengine
from joblib import Parallel, delayed
from pickle import loads, dumps
-from psycopg2.extensions import register_adapter
-serenitasdb = dbconn('serenitasdb')
+serenitas_engine = dbengine('serenitasdb')
def get_data(index, series, date = datetime.date.min):
- df = pd.read_sql("SELECT * from swaption_ref_quotes JOIN swaption_quotes " \
- "USING (quotedate, index, series, expiry) WHERE index=%s and series=%s " \
- "and quotedate >=%s ORDER BY quotedate",
- "postgresql://serenitas_user@debian/serenitasdb",
- params = (index, series, date), parse_dates = ['quotedate', 'expiry'])
+ df = pd.read_sql_query("SELECT * from swaption_ref_quotes JOIN swaption_quotes " \
+ "USING (quotedate, index, series, expiry) WHERE index=%s and series=%s " \
+ "and quotedate >=%s ORDER BY quotedate",
+ serenitas_engine,
+ params = (index, series, date), parse_dates = ['quotedate', 'expiry'])
+ df.loc[(df.quote_source == "GS") & (df['index'] =="HY"),
+ ["pay_bid", "pay_offer", "rec_bid", "rec_offer"]] *=100
+ return df
+
+def get_data_latest():
+ df = pd.read_sql_query("SELECT swaption_quotes.*, ref FROM swaption_quotes " \
+ "JOIN swaption_ref_quotes USING (quotedate, index, series, expiry) " \
+ "LEFT JOIN swaption_calib " \
+ "USING (quotedate, index, series, expiry, strike) " \
+ "WHERE swaption_calib.quotedate is NULL",
+ serenitas_engine,
+ parse_dates = ['quotedate', 'expiry'])
df.loc[(df.quote_source == "GS") & (df['index'] =="HY"),
["pay_bid", "pay_offer", "rec_bid", "rec_offer"]] *=100
return df
@@ -37,14 +48,17 @@ def calib(d, option, expiry, index, series):
r.append(option.sigma)
return [d['quotedate'], index, series, expiry, d['strike']] + r
-def calibrate(index_type, series, date, nproc):
+def calibrate(index_type=None, series=None, date=None, nproc=4, latest=False):
sql_str = ("INSERT INTO swaption_calib VALUES({}) ON CONFLICT DO NOTHING".
format(",".join(["%s"] * 9)))
- data = get_data(index_type, series, date)
- index = Index.from_name(index_type, series, "5yr")
+ if latest:
+ data = get_data_latest()
+ else:
+ data = get_data(index_type, series, date)
- for k, v in data.groupby([data['quotedate'].dt.date, 'expiry']):
- trade_date, expiry = k
+ for k, v in data.groupby([data['quotedate'].dt.date, 'expiry','index', 'series']):
+ trade_date, expiry, index_type, series = k
+ index = Index.from_name(index_type, series, "5yr")
index.trade_date = trade_date
option = Swaption(index, expiry.date(), 100,
strike_is_price = index_type == "HY")
@@ -52,15 +66,17 @@ def calibrate(index_type, series, date, nproc):
delayed(calib)(d, option, expiry.date(), index_type, series) for d in
v[['ref', '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()
+ serenitas_engine.execute(sql_str, r)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
- parser.add_argument('--index', required=True, type = lambda s: s.upper())
- parser.add_argument('--series', required=True, type=int)
- parser.add_argument('--date', required = False, default = datetime.date.min)
- parser.add_argument('--nproc', required = False, type=int, default = 4)
+ parser.add_argument('--index', required=False, type=lambda s: s.upper())
+ parser.add_argument('--series', required=False, type=int, default=27)
+ parser.add_argument('--date', required = False, default=datetime.date.min)
+ parser.add_argument('--latest', required = False, action="store_true")
+ parser.add_argument('--nproc', required = False, type=int, default=4)
args = parser.parse_args()
- calibrate(args.index, args.series, args.date, args.nproc)
+ if args.latest:
+ calibrate(latest=True)
+ else:
+ calibrate(args.index, args.series, args.date, args.nproc)