diff options
Diffstat (limited to 'python/exploration')
| -rw-r--r-- | python/exploration/beta_trade.py | 66 |
1 files changed, 43 insertions, 23 deletions
diff --git a/python/exploration/beta_trade.py b/python/exploration/beta_trade.py index 6e146405..c6d5d506 100644 --- a/python/exploration/beta_trade.py +++ b/python/exploration/beta_trade.py @@ -1,8 +1,10 @@ import sys + sys.path.append("..") import math import os import pandas as pd + try: import feather except ImportError: @@ -16,34 +18,47 @@ from statsmodels.tsa.ar_model import AR import matplotlib.pyplot as plt -def calc_returns(index_list=['HY', 'IG'], years=None): - returns = (index_returns(index=index_list, tenor='5yr', years=years). - reset_index(['tenor'], drop=True). - swaplevel(1, 0)) - returns = returns.groupby(level=['date','index']).nth(-1)['price_return'] + +def calc_returns(index_list=["HY", "IG"], years=None): + returns = ( + index_returns(index=index_list, tenor="5yr", years=years) + .reset_index(["tenor"], drop=True) + .swaplevel(1, 0) + ) + returns = returns.groupby(level=["date", "index"]).nth(-1)["price_return"] returns = returns.unstack().dropna() return returns -def calc_betas(returns=None, spans=[5, 20], index_list=['HY', 'IG']): + +def calc_betas(returns=None, spans=[5, 20], index_list=["HY", "IG"]): if returns is None: returns = calc_returns(index_list=index_list) - breakpoint() - 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) + 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, index_list=["HY", "IG"]): spans = [5, 20] if betas is None: betas = calc_betas(spans=spans, index_list=index_list) for beta, span in zip(betas, spans): - plt.plot(beta, label='EWMA' + str(span)) - plt.xlabel('date') - plt.ylabel('beta') + plt.plot(beta, label="EWMA" + str(span)) + plt.xlabel("date") + plt.ylabel("beta") plt.legend() + def calc_realized_vol(returns=None): # three ways of computing the volatility @@ -60,22 +75,27 @@ def calc_realized_vol(returns=None): for index in returns: am = arch_model(scale * returns[index].dropna()) res = am.fit() - vol_garch[index] = res.conditional_volatility * math.sqrt(252)/scale + vol_garch[index] = res.conditional_volatility * math.sqrt(252) / scale - vol = pd.concat([vol_sma, vol_ewma, vol_garch], axis=1, keys=['sma', 'ewma', 'garch']) + vol = pd.concat( + [vol_sma, vol_ewma, vol_garch], axis=1, keys=["sma", "ewma", "garch"] + ) return vol -def spreads_ratio(series=list(range(22, 29)), index=['IG', 'HY'], tenor='5yr'): + +def spreads_ratio(series=list(range(22, 29)), index=["IG", "HY"], tenor="5yr"): df = get_index_quotes(series=series, index=index, tenor=tenor) - df = df['modelspread'].groupby(['date', 'index']).last().unstack() - df['ratio'] = df.HY / df.IG + df = df["model_spread"].groupby(["date", "index"]).last().unstack() + df["ratio"] = df.HY / df.IG return df + def loglik(beta, returns): - x = (returns.HY - beta*returns.IG) - model = AR(x, missing='drop') + x = returns.HY - beta * returns.IG + model = AR(x, missing="drop") fit = model.fit(maxlag=2) - return - fit.llf + return -fit.llf + if __name__ == "__main__": returns = calc_returns() |
