diff options
| -rw-r--r-- | python/exploration/option_trades.py | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/python/exploration/option_trades.py b/python/exploration/option_trades.py index bfa0171e..3e19d185 100644 --- a/python/exploration/option_trades.py +++ b/python/exploration/option_trades.py @@ -6,23 +6,20 @@ import pandas as pd from pandas.tseries.offsets import BDay from arch import arch_model -from db import dbengine, dbconn +from utils.db import dbengine, dbconn from scipy.interpolate import interp1d -from analytics import Index, ForwardIndex +from analytics import CreditIndex, ForwardIndex from analytics.index_data import index_returns serenitasdb = dbengine('serenitasdb') -def realized_vol(index, series, tenor='5yr', date=None, years=None, return_type='spread'): +def realized_vol(index, series=None, tenor='5yr', from_date=None, years=3, return_type='spread'): """computes the realized spread volatility""" - if date is None: - if years is None: - raise ValueError("need to provide at least one of date or years") - date = (pd.Timestamp.now() - pd.DateOffset(years=years)).date() - returns = index_returns(index=index, series=series, tenor=tenor, years=None).dropna() + returns = index_returns(None, index, series, tenor, from_date, years) + returns = returns.groupby(level='date').nth(-1).dropna() # GARCH(1,1) volatility process with constant mean, scale to help with fitting scale = 10 - am = arch_model(scale * returns[return_type+'_return']) + am = arch_model(scale * returns[f"{return_type}_return"]) res = am.fit(update_freq=0, disp='off') return (res.conditional_volatility * math.sqrt(252)/scale, res) @@ -44,10 +41,10 @@ def atm_vol_calc(df, index_type, moneyness): i = 0 index_keys = [] for s, g1 in df.groupby(level='series'): - index = Index.from_name(index_type, s, '5yr') + index = CreditIndex(index_type, s, '5yr') for date, g2 in g1.groupby(pd.Grouper(level='quotedate', freq='D')): if not g2.empty: - index.trade_date = date.date() + index.value_date = date.date() for (ref, expiry), g3 in g2.reset_index('expiry').groupby(['ref', 'expiry']): index.ref = ref atm_val = forward_spread = ForwardIndex(index, expiry, False).forward_spread @@ -79,7 +76,7 @@ def atm_vol(index, date, series=None, moneyness=0.2): extra_filter = ' AND series=%s' params = params + (series,) sql_str = "SELECT * from swaption_ref_quotes JOIN swaption_quotes " \ - "USING (quotedate, index, series, expiry) WHERE index=%s " \ + "USING (ref_id) WHERE index=%s " \ f"and quotedate>=%s {extra_filter} ORDER BY quotedate ASC" df = pd.read_sql_query(sql_str, serenitasdb, params=params) |
