In [1]:
import pandas as pd
import pandas_datareader.data as web
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import seaborn
from datetime import datetime, timedelta
%matplotlib inline
# Parameters
VOL_PERIOD = 13
RETURN_PERIOD_1 = 63
RETURN_PERIOD_2 = 126
WEIGHTS = (.5,.3,.2)
#Banking, Biotech, Broker-Dealer, HealthCare, Pharmaceuticals, Gold, Homebuilders, Insurance, Internet, Oils, Oil Services, Retail, Semiconductor, Software, Transports, and Utilities
portfolio = {
'equity':("VTI", "VEU", "SHY"),
'sector':("XLF", "IBB", "IAI", "XLV", "XPH", "GDX", "XHB", "KIE", "FDN", "OIH", "XLE", "SMH", "IGV", "IYT", "XLU", "SHY" ),
'credit':("HYG", "CIU", "SHY"),
'real estate':("REM", "VNQ", "SHY"),
'stress':("GLD", "TLT", "SHY")
}
In [2]:
def overall_weight(row):
return WEIGHTS[0]*row['Period 1 Return Rank'] + WEIGHTS[1]*row['Period 2 Return Rank'] + WEIGHTS[2]*row['Std Dev Rank']
def make_table(sym):
end = datetime.today()
lookback = 2 * max(RETURN_PERIOD_1, RETURN_PERIOD_2)
start = end - timedelta(lookback)
df = web.DataReader(sym, 'yahoo', start, end)
df.drop(["Open", "High", "Low", "Close", "Volume"], axis=1, inplace=True)
df['Std Dev'] = pd.rolling_std(df['Adj Close'], VOL_PERIOD)
df['Period 1 Return'] = df.pct_change(RETURN_PERIOD_1)['Adj Close']
df['Period 2 Return'] = df.pct_change(RETURN_PERIOD_2)['Adj Close']
return df
def get_latest(sym):
df = make_table(sym).tail(1)
df.index = [sym]
return df
def cluster_table(symbols):
dfs = map(get_latest, symbols)
cdf = pd.concat(dfs, axis=0)
cdf_r = cdf.rank('rows', ascending=False)[['Period 1 Return', 'Period 2 Return']]
cdf_r['Std Dev'] = cdf.rank('rows')[['Std Dev']]
df = pd.merge(cdf, cdf_r, left_index=True, right_index=True, how='inner', suffixes=('', ' Rank'))
overall_df = pd.DataFrame(df.apply(overall_weight, axis=1), columns=["Overall Weight Rank"]).rank('rows')
df = pd.merge(df, overall_df, left_index=True, right_index=True, how='inner')
df = df.sort_index(axis=1)
df = df.sort_values('Overall Weight Rank')
return df
In [3]:
# Equity Model
cluster_table(portfolio['equity'])
Out[3]:
In [4]:
# Credit Model
cluster_table(portfolio['credit'])
Out[4]:
In [5]:
# Real Estate Model
cluster_table(portfolio['real estate'])
Out[5]:
In [6]:
# Econ Stress Model
cluster_table(portfolio['stress'])
Out[6]:
In [7]:
# Sector Overweight
cluster_table(portfolio['sector'])
Out[7]: