diff options
Diffstat (limited to 'python/calibrate_swaption.py')
| -rw-r--r-- | python/calibrate_swaption.py | 58 |
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) |
