aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/exploration/beta_trade.py41
-rw-r--r--python/index_data.py20
2 files changed, 23 insertions, 38 deletions
diff --git a/python/exploration/beta_trade.py b/python/exploration/beta_trade.py
index 8f6825ef..b26eeedb 100644
--- a/python/exploration/beta_trade.py
+++ b/python/exploration/beta_trade.py
@@ -11,36 +11,27 @@ from statsmodels.tsa.ar_model import AR
import matplotlib.pyplot as plt
-def calc_returns(save_feather=False, index_pair=['HY','IG']):
- returns = (index_returns(index=['EU','IG', 'HY'],tenor='5yr',years=None).
- reset_index(['tenor','series'],drop=True))
- returns1 = {}
- returns1[index_pair[0]] = (returns.
- xs(index_pair[0], level=1).
- dropna().
- groupby(level=['date'], as_index=False).
- nth(-1))
- returns1[index_pair[1]] = returns.xs(index_pair[1], level=1)
- df = pd.merge(returns1[index_pair[0]],returns1[index_pair[1]],
- left_index=True,right_index=True,
- suffixes=('_'+index_pair[0],'_'+index_pair[1]))
- returns = df[['price_return_'+index_pair[0], 'price_return_'+index_pair[1]]]
- returns.columns = [index_pair[0], index_pair[1]]
- min_date = max(pd.Timestamp('20090320'),returns.index.min()[0])
- returns = returns.dropna()[min_date:]
+def calc_returns(index_list=['HY', 'IG'], save_feather=False):
+ returns = (index_returns(index=index_list, tenor='5yr', years=None).
+ reset_index(['tenor','series'], drop=True).
+ set_index(['date', 'maturity'], append=True).
+ swaplevel(1, 0))
+ returns = returns.unstack(level='index').dropna()
+ returns = returns.groupby(level='date').nth(-1)['price_return']
if save_feather:
feather.write_dataframe(returns.reset_index(),
os.path.join(os.environ["DATA_DIR"], "index_returns.fth"))
- return returns.reset_index('maturity', drop=True)
+ return returns
-def calc_betas(returns=None, spans=[5, 20], index_pair=['HY','IG']):
+def calc_betas(returns=None, spans=[5, 20], index_list=['HY', 'IG']):
if returns is None:
- returns = calc_returns(index_pair=index_pair)
- return [(returns.
- ewm(span=span).
- cov().
- groupby(level='date').
- apply(lambda df: df.values[0,1]/df.values[1,1])) for span in spans]
+ returns = calc_returns(index_list=index_list)
+
+ return pd.concat([(returns.
+ ewm(span=span).
+ cov().
+ groupby(level='date').
+ apply(lambda df: df / np.diag(df))) for span in spans], axis=1, keys=spans)
def plot_betas(betas=None):
spans = [5, 20]
diff --git a/python/index_data.py b/python/index_data.py
index 3be3b20f..dc97a3ed 100644
--- a/python/index_data.py
+++ b/python/index_data.py
@@ -113,22 +113,16 @@ def index_returns(df=None, index=None, series=None, tenor=None, from_date=None,
pct_change(periods=per))
df.columns = ['spread_return', 'price_return']
df = df.groupby(level=['date', 'index', 'series', 'tenor']).nth(0)
- coupon_data = pd.read_sql_query("SELECT index, series, tenor, coupon, maturity FROM " \
+ coupon_data = pd.read_sql_query("SELECT index, series, tenor, coupon * 1e-4 AS coupon, maturity FROM " \
"index_maturity WHERE coupon is NOT NULL", _serenitas_engine,
index_col=['index', 'series', 'tenor'])
- def add_accrued(df):
- coupon = coupon_data.loc[df.index[0][1:],'coupon'] * 1e-4
- accrued = (df.index.levels[0].to_series().diff(periods=per).
- astype('timedelta64[D]')/360 * coupon)
- return df + accrued
-
- df['price_return'] = (df.
- groupby(level=['index', 'series', 'tenor'])['price_return'].
- transform(add_accrued))
-
- df = df.reset_index().merge(coupon_data.maturity.reset_index(),on=['index','series','tenor'])
- df.set_index(['date', 'index', 'series', 'tenor', 'maturity'], inplace=True)
+ df = df.reset_index('date').join(coupon_data)
+ df['day_frac'] = (df.groupby(level=['index', 'series', 'tenor'])['date'].
+ diff().
+ astype('timedelta64[D]') / 360)
+ df['price_return'] += df.day_frac * df.coupon
+ del df['day_frac']
return df
def get_singlenames_quotes(indexname, date):