aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/notebooks/swaption_risk.ipynb3
-rw-r--r--python/risk/swaptions.py116
2 files changed, 6 insertions, 113 deletions
diff --git a/python/notebooks/swaption_risk.ipynb b/python/notebooks/swaption_risk.ipynb
index 89c9be39..05c447b8 100644
--- a/python/notebooks/swaption_risk.ipynb
+++ b/python/notebooks/swaption_risk.ipynb
@@ -6,7 +6,7 @@
"metadata": {},
"outputs": [],
"source": [
- "from mark_swaptions import get_swaption_portfolio\n",
+ "from risk.swaptions import get_swaption_portfolio\n",
"import datetime\n",
"from db import dbconn\n",
"from analytics import init_ontr\n",
@@ -21,7 +21,6 @@
"outputs": [],
"source": [
"portf = get_swaption_portfolio(datetime.date.today(), conn)\n",
- "portf.mark(interp_method=\"bivariate_linear\")\n",
"portf"
]
},
diff --git a/python/risk/swaptions.py b/python/risk/swaptions.py
index 79f42dc4..99e4ebc6 100644
--- a/python/risk/swaptions.py
+++ b/python/risk/swaptions.py
@@ -1,17 +1,9 @@
-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')
+from db import DataError
+logger = logging.getLogger(__name__)
def get_swaption_portfolio(date, conn, **kwargs):
with conn.cursor() as c:
@@ -26,12 +18,7 @@ def get_swaption_portfolio(date, conn, **kwargs):
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)
+ portf.mark(interp_method='bivariate_linear', **kwargs)
return portf
@@ -44,100 +31,7 @@ def insert_swaption_portfolio(portf, conn):
try:
c.execute(sql_str, to_insert)
except DataError as e:
- logging.error(e)
+ logger.error(e)
finally:
- logging.info("succesfully marked trade id: %s", id)
+ logger.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)