aboutsummaryrefslogtreecommitdiffstats
path: root/python/exploration/beta_trade.py
blob: 1e86a97f6e939617fbbbee6f68b4dc9dd90b2806 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import math
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

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")

# three ways of computing the volatility
# 20 days simple moving average
vol_sma = returns.hy.rolling(20).std() * math.sqrt(252)
vol_ewma = returns.hy.ewm(span=20).std() * math.sqrt(252)
# GARCH(1,1)
# we scale returns by 10 to help with the fitting
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)

## 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')))

resids = returns.ig-beta_ewma*returns.hy

# feather.write_dataframe(beta_ewma.reset_index(),
#                         "/home/share/CorpCDOs/data/beta.fth")