aboutsummaryrefslogtreecommitdiffstats
path: root/python/exploration/beta_trade.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/exploration/beta_trade.py')
-rw-r--r--python/exploration/beta_trade.py65
1 files changed, 48 insertions, 17 deletions
diff --git a/python/exploration/beta_trade.py b/python/exploration/beta_trade.py
index 1e86a97f..4f10e61f 100644
--- a/python/exploration/beta_trade.py
+++ b/python/exploration/beta_trade.py
@@ -1,22 +1,32 @@
import math
+import os
import pandas as pd
import feather
from index_data import index_returns
from arch import arch_model
-from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
+from math import log, exp, sqrt
+import numpy as np
+from scipy.optimize import minimize_scalar
returns = index_returns(index=['IG', 'HY'], tenor='5yr')
-returns = (returns.
- reset_index(level='series').
- groupby(level=['date','index']).
- nth(-1)) ## lastest returns
-
-returns = (returns.
- set_index('series', append=True)['price_return'].
- unstack(level='index'))
-returns.columns = [col.lower() for col in returns.columns]
-feather.write_dataframe(returns.reset_index(), "/home/share/CorpCDOs/data/index_returns.fth")
+returns_hy = (returns.
+ xs('HY', level=1).
+ dropna().
+ reset_index(level='series').
+ groupby(level=['date']).
+ nth(-1))
+returns_hy = returns_hy.set_index('series', append=True)
+returns_ig = returns.xs('IG', level=1).reset_index('tenor', drop=True)
+# hy starts trading later than ig, so we line it up based on hy series
+df = pd.merge(returns_hy, returns_ig, left_index=True, right_index=True,
+ suffixes=('_hy','_ig'))
+returns = df[['price_return_hy', 'price_return_ig']]
+returns.columns = ['hy', 'ig']
+returns = returns.reset_index('series', drop=True)
+feather.write_dataframe(returns.reset_index(),
+ os.path.join(os.environ["DATA_DIR"], "index_returns.fth"))
+#returns = returns.groupby('date').nth(-1)
# three ways of computing the volatility
# 20 days simple moving average
vol_sma = returns.hy.rolling(20).std() * math.sqrt(252)
@@ -27,16 +37,37 @@ scale = 10
am = arch_model(scale * returns.hy.dropna())
res = am.fit()
vol_garch = res.conditional_volatility * math.sqrt(252)/scale
-vol = pd.concat([vol_sma, vol_ewma, vol_garch], axis=1)
+vol = pd.concat([vol_sma, vol_ewma, vol_garch], axis=1, keys=['sma', 'ewma', 'garch'])
## let's get the betas
beta_ewma = (returns.
ewm(span=20).
cov().
- apply(lambda df:df.at['ig', 'hy']/df.at['ig', 'ig'],
- ('minor', 'major')))
+ groupby(level='date').
+ apply(lambda df: df.values[0,1]/df.values[1,1]))
+
+beta_ewma5 = (returns.
+ ewm(span=5).
+ cov().
+ groupby(level='date').
+ apply(lambda df: df.values[0,1]/df.values[1,1]))
+
+feather.write_dataframe(beta_ewma.to_frame('beta'),
+ os.path.join(os.environ['DATA_DIR'], "beta.fth"))
+
+def loglik(beta, returns):
+ x = (returns.hy - beta*returns.ig)
+ model = AR(x, missing='drop')
+ fit = model.fit(maxlag=1)
+ return - fit.llf
-resids = returns.ig-beta_ewma*returns.hy
+r = []
+for beta in np.arange(3, 5, 0.01):
+ prog = minimize(loglik, np.array([0.1, 0.1, 0.1]), args=(returns, beta),
+ bounds=[(None, None), (1e-6, None), (None, None)],
+ method='L-BFGS-B')
+ r.append(prog.fun)
-# feather.write_dataframe(beta_ewma.reset_index(),
-# "/home/share/CorpCDOs/data/beta.fth")
+r = []
+for beta in np.arange(3, 5, 0.01):
+ r.append(test(returns, beta))