aboutsummaryrefslogtreecommitdiffstats
path: root/python/exploration
diff options
context:
space:
mode:
Diffstat (limited to 'python/exploration')
-rw-r--r--python/exploration/beta_trade.py66
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()