aboutsummaryrefslogtreecommitdiffstats
path: root/python/mark_swaptions.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mark_swaptions.py')
-rw-r--r--python/mark_swaptions.py143
1 files changed, 0 insertions, 143 deletions
diff --git a/python/mark_swaptions.py b/python/mark_swaptions.py
deleted file mode 100644
index 79f42dc4..00000000
--- a/python/mark_swaptions.py
+++ /dev/null
@@ -1,143 +0,0 @@
-import argparse
-import logging
-import os
-import pandas as pd
-from pandas.tseries.offsets import BDay
-
-from analytics import Portfolio, BlackSwaption
-from db import dbconn, DataError
-
-logging.basicConfig(filename=os.path.join(os.getenv("LOG_DIR"),
- 'swaption_marks.log'),
- level=logging.INFO,
- format='%(asctime)s %(message)s')
-
-
-def get_swaption_portfolio(date, conn, **kwargs):
- with conn.cursor() as c:
- c.execute("SELECT id, dealid FROM swaptions "
- "WHERE (termination_date is NULL or termination_date > %s) "
- "AND expiration_date > %s AND trade_date <= %s "
- "AND swap_type='CD_INDEX_OPTION'", (date, date, date))
- try:
- trade_ids, deal_ids = zip(*c)
- except ValueError:
- return {}
- portf = Portfolio([BlackSwaption.from_tradeid(t) for t in trade_ids],
- trade_ids=deal_ids)
- portf.value_date = date
- for t in portf.trades:
- try:
- t.mark(interp_method='bivariate_linear', **kwargs)
- except Exception as e:
- logging.info(e)
- t.mark(interp_method='bivariate_linear', **kwargs)
- return portf
-
-
-def insert_swaption_portfolio(portf, conn):
- sql_str = "INSERT INTO swaption_marks VALUES(%s, %s, %s, %s, %s, %s, %s)"
- with conn.cursor() as c:
- for id, trade in portf.items():
- to_insert = (id, trade.value_date, trade.pv, trade.delta,
- trade.gamma, trade.vega, trade.theta)
- try:
- c.execute(sql_str, to_insert)
- except DataError as e:
- logging.error(e)
- finally:
- logging.info("succesfully marked trade id: %s", id)
- conn.commit()
-
-
-# def get_trades(date, engine):
-# return pd.read_sql_query(
-# "SELECT dealid, buysell, swaption_type, notional, strike, " \
-# "expiration_date, index, series FROM swaptions " \
-# "JOIN index_version ON (swaptions.security_id = index_version.redindexcode) " \
-# "WHERE termination_date is NULL AND expiration_date > %s AND trade_date <= %s",
-# engine, 'dealid', params=(date, date), parse_dates=['expiration_date'])
-
-
-# def get_swaptionvol(index, series, strike, expiry, date, engine):
-# r = engine.execute(
-# "SELECT ref, vol_payer AS payer, vol_receiver AS receiver, " \
-# "vol_payer_black AS payer_black, vol_receiver_black AS receiver_black " \
-# "FROM swaption_calib " \
-# "LEFT JOIN swaption_quotes USING (quote_id) " \
-# "LEFT JOIN swaption_ref_quotes USING (ref_id) "\
-# "WHERE index = %s " \
-# "AND series = %s AND strike=%s AND expiry = %s AND quotedate::date=%s " \
-# "ORDER BY quotedate desc",
-# (index, series, strike, expiry, date))
-# try:
-# result = r.fetchone()
-# if result is None:
-# logging.error("No data for {}{} {}K {} expiry on date {}".
-# format(index, series, strike, expiry, date))
-# return result
-# except exc.DataError as e:
-# logging.error(e)
-# except e:
-# logging.error(e)
-
-# def mark_trades(date, engine):
-# df = get_trades(date, engine)
-# result = []
-# for trade in df.itertuples():
-# try:
-# r = engine.execute("SELECT closespread, closeprice FROM index_quotes " \
-# "WHERE index=%s AND series=%s AND tenor='5yr' AND date=%s",
-# (trade.index, trade.series, date))
-# closespread, closeprice = r.fetchone()
-# except exc.DataError as e:
-# logging.eror(e)
-# except TypeError:
-# logging.error("no quote for {}{} {} on date {}".format(
-# trade.index, trade.series, '5yr', date))
-# underlying = Index.from_name(trade.index, trade.series, '5yr', date,
-# trade.notional)
-# quote = get_swaptionvol(trade.index, trade.series, trade.strike, trade.expiration_date.date(),
-# date, serenitas_engine)
-# if quote is None:
-# continue
-# underlying.ref = quote.ref
-# swaption = Swaption(underlying, trade.expiration_date.date(),
-# trade.strike, trade.swaption_type.lower())
-# swaption.sigma = getattr(quote, swaption.option_type)
-# if swaption.sigma is None:
-# swaption.sigma = quote.receiver if swaption.option_type == "payer" else quote.payer
-# direction = 1. if trade.buysell else -1.
-# market_value = swaption.pv * trade.notional * direction
-# if trade.index in ["HY", "XO"]:
-# market_value += (quote.ref - closeprice) / 100 * swaption.delta * trade.notional * direction
-# else:
-# market_value += swaption.DV01 * (closespread - quote.ref) * trade.notional * direction
-# #compute the greeks at index mark
-# swaption.index.spread = closespread
-# swaption._update()
-
-# try:
-# to_insert = (trade.Index, date, market_value, swaption.delta, swaption.gamma,
-# swaption.vega)
-# engine.execute("INSERT INTO swaption_marks VALUES(%s, %s, %s, %s, %s, %s)",
-# to_insert)
-# except exc.DataError as e:
-# logging.error(e)
-# finally:
-# logging.info("succesfully marked trade id: %s", trade.Index)
-# return result
-
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument('workdate', nargs='?',
- type=lambda s: pd.datetime.strptime(s, "%Y-%m-%d").date()),
- args = parser.parse_args()
- if args.workdate is None:
- workdate = (pd.Timestamp.today()-BDay()).date()
- else:
- workdate = args.workdate
- with dbconn('dawndb') as conn:
- portf = get_swaption_portfolio(workdate, conn)
- insert_swaption_portfolio(portf, conn)