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