diff options
Diffstat (limited to 'python/calibrate_swaption.py')
| -rw-r--r-- | python/calibrate_swaption.py | 122 |
1 files changed, 79 insertions, 43 deletions
diff --git a/python/calibrate_swaption.py b/python/calibrate_swaption.py index ea3dbc5d..ba7c4b80 100644 --- a/python/calibrate_swaption.py +++ b/python/calibrate_swaption.py @@ -1,4 +1,3 @@ -import logging import pandas as pd from analytics import CreditIndex, Swaption import datetime @@ -8,34 +7,42 @@ from itertools import starmap from functools import partial from multiprocessing import Pool -serenitas_engine = dbengine('serenitasdb') +serenitas_engine = dbengine("serenitasdb") def get_data(index, series, date=datetime.date.min): - df = pd.read_sql_query("SELECT * from swaption_ref_quotes JOIN swaption_quotes " - "USING (ref_id) 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 - df.quotedate = df.quotedate.dt.tz_convert('America/New_York') + df = pd.read_sql_query( + "SELECT * from swaption_ref_quotes JOIN swaption_quotes " + "USING (ref_id) 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 + df.quotedate = df.quotedate.dt.tz_convert("America/New_York") return df def get_data_latest(): - df = pd.read_sql_query("SELECT quotedate, index, series, expiry, ref, " - "quote_source, swaption_quotes.* " - "FROM swaption_ref_quotes " - "JOIN swaption_quotes USING (ref_id) " - "LEFT JOIN swaption_calib USING (quote_id) " - "WHERE swaption_calib.quote_id 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 - df.quotedate = df.quotedate.dt.tz_convert('America/New_York') + df = pd.read_sql_query( + "SELECT quotedate, index, series, expiry, ref, " + "quote_source, swaption_quotes.* " + "FROM swaption_ref_quotes " + "JOIN swaption_quotes USING (ref_id) " + "LEFT JOIN swaption_calib USING (quote_id) " + "WHERE swaption_calib.quote_id 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 + df.quotedate = df.quotedate.dt.tz_convert("America/New_York") return df @@ -43,23 +50,23 @@ def calib(option, ref, strike, pay_bid, pay_offer, rec_bid, rec_offer): option.ref = ref option.strike = strike r = [] - for pv_type in ['pv', 'pv_black']: - for option_type in ['pay', 'rec']: + for pv_type in ["pv", "pv_black"]: + for option_type in ["pay", "rec"]: if option_type == "pay": mid = (pay_bid + pay_offer) / 2 * 1e-4 - option.option_type = 'payer' + option.option_type = "payer" else: mid = (rec_bid + rec_offer) / 2 * 1e-4 - option.option_type = 'receiver' - if mid == 0.: - logging.info("0. mid, skipping.") - r.append(0.) + option.option_type = "receiver" + if mid == 0.0: + logger.info("0. mid, skipping.") + r.append(0.0) continue try: setattr(option, pv_type, mid) except ValueError as e: r.append(None) - logging.error(e) + logger.error(e) else: r.append(option.sigma) return r @@ -71,8 +78,9 @@ def MaybePool(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"] * 5))) + sql_str = "INSERT INTO swaption_calib VALUES({}) ON CONFLICT DO NOTHING".format( + ",".join(["%s"] * 5) + ) if latest: data = get_data_latest() else: @@ -80,32 +88,60 @@ def calibrate(index_type=None, series=None, date=None, nproc=4, latest=False): with MaybePool(nproc) as pool: pstarmap = pool.starmap if pool else starmap - for k, v in data.groupby([data['quotedate'].dt.date, 'index', 'series']): + for k, v in data.groupby([data["quotedate"].dt.date, "index", "series"]): trade_date, index_type, series = k index = CreditIndex(index_type, series, "5yr", trade_date) - for expiry, df in v.groupby(['expiry']): + for expiry, df in v.groupby(["expiry"]): try: option = Swaption(index, expiry.date(), 100) except ValueError as e: - logging.error(e) + logger.error(e) continue mycalib = partial(calib, option) - r = pstarmap(mycalib, df[['ref', 'strike', 'pay_bid', - 'pay_offer', 'rec_bid', 'rec_offer']]. - itertuples(index=False, name=None)) + r = pstarmap( + mycalib, + df[ + [ + "ref", + "strike", + "pay_bid", + "pay_offer", + "rec_bid", + "rec_offer", + ] + ].itertuples(index=False, name=None), + ) to_insert = [[a] + b for a, b in zip(df.quote_id, r)] serenitas_engine.execute(sql_str, to_insert) if __name__ == "__main__": + import logging + from utils import SerenitasFileHandler + + logger = logging.getLogger("swaption_calib") import argparse + parser = argparse.ArgumentParser() - parser.add_argument('--index', required=False, type=lambda s: s.upper(), dest="index_type") - parser.add_argument('--series', required=False, type=int, default=28) - 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) + parser.add_argument( + "--index", required=False, type=lambda s: s.upper(), dest="index_type" + ) + parser.add_argument("--series", required=False, type=int, default=28) + 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) + parser.add_argument( + "-d", "--debug", action="store_true", help="more verbose logging" + ) args = parser.parse_args() + + logger.setLevel(logging.DEBUG if args.debug else logging.INFO) + if not args.debug: + handler = SerenitasFileHandler(f"calib_swaptions_{datetime.date.today()}.log") + else: + handler = logging.StreamHandler() + handler.setFormatter(SerenitasFileHandler._formatter) + logger.addHandler(handler) if args.latest: calibrate(latest=True, nproc=args.nproc) else: |
