aboutsummaryrefslogtreecommitdiffstats
path: root/python/option_trades.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/option_trades.py')
-rw-r--r--python/option_trades.py82
1 files changed, 60 insertions, 22 deletions
diff --git a/python/option_trades.py b/python/option_trades.py
index 15b16efa..1510f583 100644
--- a/python/option_trades.py
+++ b/python/option_trades.py
@@ -150,14 +150,46 @@ def get_index_spread(index, series, date, conn):
conn.commit()
return spread
-def get_option_pnl(strike, expiry, index, series, engine):
- start_date = BDay().rollback(expiry - pd.DateOffset(months=1))
- df = pd.read_sql_query("SELECT quotedate, (pay_bid+pay_offer)/2 AS pay_mid, " \
- "(rec_bid+rec_offer)/2 AS rec_mid FROM swaption_quotes " \
- "WHERE strike=%s and expiry=%s and index=%s and series=%s" \
- "and quotedate>=%s", engine,
- params=(strike, expiry, index, series, start_date),
- index_col='quotedate', parse_dates=['quotedate'])
+def get_index_ref(index, series, date, expiry, conn):
+ with conn.cursor() as c:
+ c.execute("SELECT ref, fwdspread from swaption_ref_quotes " \
+ "WHERE index=%s and series=%s and quotedate::date=%s "\
+ "AND expiry=%s ORDER BY quotedate desc",
+ (index, series, date, expiry))
+ try:
+ ref, fwdspread = c.fetchone()
+ except TypeError:
+ ref, fwdspread = None, None
+ conn.commit()
+ return ref, fwdspread
+
+def get_strike(index, series, date, expiry, conn):
+ with conn.cursor() as c:
+ c.execute("SELECT strike from index_quotes " \
+ "WHERE index=%s and series=%s and quotedate::date=%s "\
+ "AND expiry=%s ORDER BY quotedate desc",
+ (index, series, date, expiry))
+ try:
+ stri
+ except TypeError:
+ ref, fwdspread = None, None
+ conn.commit()
+ return ref, fwdspread
+
+def get_option_pnl(strike, expiry, index, series, start_date, engine):
+ for s in [strike, strike+2.5]:
+ df = pd.read_sql_query("SELECT quotedate, (pay_bid+pay_offer)/2 AS pay_mid, " \
+ "(rec_bid+rec_offer)/2 AS rec_mid FROM swaption_quotes " \
+ "WHERE strike=%s and expiry=%s and index=%s and series=%s" \
+ "and quotedate>=%s", engine,
+ params=(s, expiry, index, series, start_date),
+ index_col='quotedate', parse_dates=['quotedate'])
+ if not df.empty and df.index[0] == start_date:
+ strike = s
+ break
+ else:
+ raise ValueError("Something wrong")
+
df = df.groupby(df.index.normalize()).last()
if expiry < datetime.date.today():
spread = get_index_spread(index, series, expiry, engine.raw_connection())
@@ -173,30 +205,36 @@ def get_option_pnl(strike, expiry, index, series, engine):
df = df.append(pd.DataFrame([[pay_mid, rec_mid]],
columns=['pay_mid', 'rec_mid'],
index=[pd.Timestamp(expiry)]))
- return df
-
+ return df, strike
-def sell_vol_strategy(index="IG"):
+def sell_vol_strategy(index="IG", months=3):
engine = dbengine('serenitasdb')
conn = engine.raw_connection()
- d = pd.Series()
with conn.cursor() as c:
c.execute("SELECT DISTINCT ON (expiry) series, expiry FROM " \
"swaption_quotes GROUP BY series, expiry ORDER BY expiry, series desc")
+ d = {}
for series, expiry in c:
- start_date = BDay().rollback(expiry - pd.DateOffset(months=1)).date()
+ start_date = BDay().rollback(expiry - pd.DateOffset(months=months)).date()
+ if start_date == datetime.date(2016, 1, 15):
+ start_date = datetime.date(2016, 1, 14)
+ elif start_date == datetime.date(2014, 7, 18):
+ start_date = datetime.date(2014, 7, 17)
+ elif start_date == datetime.date(2014, 11, 17):
+ start_date = datetime.date(2014, 11, 14)
+ elif start_date == datetime.date(2015, 3, 13):
+ start_date = datetime.date(2015, 3, 12)
if start_date > datetime.date.today():
break
- index_spread = get_index_spread(index, series, start_date, conn)
- if index_spread is None:
- series -=1
- index_spread = get_index_spread(index, series, start_date, conn)
- strike = round(index_spread/2.5) * 2.5 ##round to the closest higher 2.5 increment
- df = get_option_pnl(strike, expiry, index, series, engine)
- if d.empty:
- d = -df.sum(1).diff().dropna()
+ for s in [series, series - 1]:
+ ref, fwdspread = get_index_ref(index, s, start_date, expiry, conn)
+ if fwdspread is not None:
+ break
else:
- d = d.add(-df.sum(1).diff().dropna(),fill_value=0)
+ continue
+ strike = round(fwdspread/2.5) * 2.5
+ pnl, strike = get_option_pnl(strike, expiry, index, s, start_date, engine)
+ d[(s, strike, expiry)] = pnl
conn.commit()
return d