Last active
December 2, 2020 13:43
-
-
Save barnjamin/8f00fef768a923de670a90965d126d0b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
AC_EQUITIES = "Equities" | |
AC_CREDIT = "Credit" | |
AC_FIXED_INCOME = "Fixed Income" | |
AC_USD = "USD" | |
AC_COMMODITIES = "Commodities" | |
ESEC_TECH = "Tech" | |
ESEC_FINANCIALS = "Financials" | |
ESEC_CONSUMER_DISCRETIONARY = "Consumer Discretionary" | |
ESEC_INDUSTRIALS = "Industrials" | |
ESEC_MATERIALS = "Materials" | |
ESEC_REITS = "REITS" | |
ESEC_TELECOM = "Telecom" | |
ESEC_CONSUMER_STAPLES = "Consumer Staples" | |
ESEC_UTILITES = "Utilities" | |
ESEC_ENERGY = "Energy" | |
ESEC_HEALTH_CARE = "Health Care" | |
ESTYLE_HIGH_BETA = "High Beta" | |
ESTYLE_LOW_BETA = "Low Beta" | |
ESTYLE_DEFENSIVES = "Defensives" | |
ESTYLE_CYCLICALS = "Cyclicals" | |
ESTYLE_DIVIDEND_YIELD = "Dividend Yield" | |
ESTYLE_MOMENTUM = "Momentum" | |
ESTYLE_LARGE_CAP_GROWTH = "Large Cap Growth" | |
ESTYLE_GROWTH = "Growth" | |
ESTYLE_QUALITY = "Quality" | |
ESTYLE_SMALL_CAPS = "Small Caps" | |
ESTYLE_VALUE = "Small Caps" | |
FI_CONVERTIBLES = "Convertibles" | |
FI_LEVERAGED_LOANS = "Leveraged Loans" | |
FI_BDCS = "BDCs" | |
FI_TIPS = "TIPS" | |
FI_SHORT_DUR_TREASURIES = "Short Duration Treasuries" | |
FI_MEDIUM_DUR_TREASURIES = "Medium Duration Treasuries" | |
FI_LONG_DUR_TREASURIES = "Long Duration Treasuries" | |
FI_MUNIS = "MUNIS" | |
FI_PREFERREDS = "Preferred" | |
FI_MBS = "MBS" | |
FI_INVESTMENT_GRADE_CREDIT = "Investment Grade Credit" | |
FI_HIGH_YIELD_CREDIT = "High Yield Credit" | |
ACCEL = "Accelerating" | |
DECEL = "Decelerating" | |
quads = { | |
"Quad1": { | |
"Inflation": DECEL, | |
"Growth": ACCEL, | |
"Weightings":{ | |
"AssetClass":{ | |
"Overweight":[AC_EQUITIES, AC_CREDIT], | |
"Underweight":[AC_FIXED_INCOME, AC_USD], | |
}, | |
"EquitySector":{ | |
"Overweight":[ESEC_TECH, ESEC_CONSUMER_DISCRETIONARY, ESEC_INDUSTRIALS, ESEC_MATERIALS], | |
"Underweight":[ESEC_UTILITES, ESEC_CONSUMER_STAPLES, ESEC_ENERGY, ESEC_HEALTH_CARE], | |
}, | |
"EquityStyle":{ | |
"Overweight":[ESTYLE_HIGH_BETA, ESTYLE_CYCLICALS, ESTYLE_MOMENTUM], | |
"Underweight":[ESTYLE_LOW_BETA, ESTYLE_DEFENSIVES, ESTYLE_DIVIDEND_YIELD], | |
}, | |
"FixedIncome":{ | |
"Overweight":[FI_CONVERTIBLES, FI_HIGH_YIELD_CREDIT, FI_LEVERAGED_LOANS, FI_LEVERAGED_LOANS, FI_BDCS], | |
"Underweight":[FI_TIPS, FI_SHORT_DUR_TREASURIES, FI_MBS, FI_MEDIUM_DUR_TREASURIES], | |
}, | |
} | |
}, | |
"Quad2": { | |
"Inflation": ACCEL, | |
"Growth": ACCEL, | |
"Weightings":{ | |
"AssetClass":{ | |
"Overweight":[AC_EQUITIES, AC_COMMODITIES], | |
"Underweight":[AC_FIXED_INCOME, AC_USD], | |
}, | |
"EquitySector":{ | |
"Overweight":[ESEC_TECH, ESEC_CONSUMER_DISCRETIONARY, ESEC_INDUSTRIALS, ESEC_ENERGY], | |
"Underweight":[ESEC_TELECOM, ESEC_UTILITES, ESEC_CONSUMER_STAPLES, ESEC_REITS], | |
}, | |
"EquityStyle":{ | |
"Overweight":[ESTYLE_MOMENTUM, ESTYLE_GROWTH, ESTYLE_SMALL_CAPS], | |
"Underweight":[ESTYLE_LOW_BETA, ESTYLE_VALUE, ESTYLE_DIVIDEND_YIELD], | |
}, | |
"FixedIncome":{ | |
"Overweight":[FI_BDCS, FI_CONVERTIBLES, FI_PREFERREDS, FI_LEVERAGED_LOANS], | |
"Underweight":[FI_LONG_DUR_TREASURIES, FI_MUNIS, FI_INVESTMENT_GRADE_CREDIT, FI_MEDIUM_DUR_TREASURIES], | |
}, | |
} | |
}, | |
"Quad3": { | |
"Inflation": ACCEL, | |
"Growth": DECEL, | |
"Weightings":{ | |
"AssetClass":{ | |
"Overweight":[AC_FIXED_INCOME, AC_COMMODITIES], | |
"Underweight":[AC_EQUITIES, AC_CREDIT], | |
}, | |
"EquitySector":{ | |
"Overweight":[ESEC_UTILITES, ESEC_TECH, ESEC_ENERGY, ESEC_REITS], | |
"Underweight":[ESEC_FINANCIALS, ESEC_MATERIALS, ESEC_TELECOM, ESEC_TELECOM, ESEC_CONSUMER_STAPLES], | |
}, | |
"EquityStyle":{ | |
"Overweight":[ESTYLE_HIGH_BETA, ESTYLE_QUALITY, ESTYLE_LARGE_CAP_GROWTH], | |
"Underweight":[ESTYLE_DIVIDEND_YIELD, ESTYLE_SMALL_CAPS, ESTYLE_VALUE], | |
}, | |
"FixedIncome":{ | |
"Overweight":[FI_MUNIS, FI_LONG_DUR_TREASURIES, FI_TIPS, FI_INVESTMENT_GRADE_CREDIT], | |
"Underweight":[FI_BDCS, FI_PREFERREDS, FI_CONVERTIBLES, FI_LEVERAGED_LOANS], | |
}, | |
} | |
}, | |
"Quad4": { | |
"Inflation": DECEL, | |
"Growth": DECEL, | |
"Weightings":{ | |
"AssetClass":{ | |
"Overweight":[AC_FIXED_INCOME, AC_USD], | |
"Underweight":[AC_EQUITIES, AC_CREDIT, AC_COMMODITIES], | |
}, | |
"EquitySector":{ | |
"Overweight":[ESEC_CONSUMER_STAPLES, ESEC_HEALTH_CARE, ESEC_REITS, ESEC_UTILITES], | |
"Underweight":[ESEC_TECH, ESEC_ENERGY, ESEC_INDUSTRIALS, ESEC_FINANCIALS], | |
}, | |
"EquityStyle":{ | |
"Overweight":[ESTYLE_LOW_BETA, ESTYLE_DIVIDEND_YIELD, ESTYLE_DEFENSIVES], | |
"Underweight":[ESTYLE_MOMENTUM, ESTYLE_HIGH_BETA, ESTYLE_GROWTH], | |
}, | |
"FixedIncome":{ | |
"Overweight":[FI_LONG_DUR_TREASURIES, FI_MEDIUM_DUR_TREASURIES, FI_MUNIS, FI_MBS], | |
"Underweight":[FI_CONVERTIBLES, FI_TIPS, FI_LEVERAGED_LOANS, FI_HIGH_YIELD_CREDIT], | |
}, | |
} | |
} | |
} | |
sector_etfs = { | |
ESEC_TECH: "XLK", | |
ESEC_FINANCIALS: "XLF", | |
ESEC_CONSUMER_DISCRETIONARY: "XLY", | |
ESEC_INDUSTRIALS:"XLI", | |
ESEC_MATERIALS: "XLB", | |
ESEC_REITS: "XLRE", | |
ESEC_TELECOM: "XLC", | |
ESEC_CONSUMER_STAPLES: "XLP", | |
ESEC_UTILITES: "XLU", | |
ESEC_ENERGY: "XLE", | |
ESEC_HEALTH_CARE: "XLV" | |
} | |
etf_by_category = { | |
AC_EQUITIES:['SDY', 'IWP', 'SIZE', 'ARKK'], | |
AC_CREDIT: ['LQD', 'VCIT', 'VCSH', 'SPIB'], | |
AC_FIXED_INCOME:['TLT', 'IEF', 'GOVT', 'SHV'], | |
AC_USD: ['UUP', 'FXE', 'FXB', 'FXY', 'EUO', 'URR', 'ULE', 'UGBP', 'JPST', 'ICSH', 'BSCK', 'BSCJ'], | |
AC_COMMODITIES: ['DWT', 'UGAZ', 'UWTI', 'UWT', 'DBA', 'WEAT', 'JO', 'CORN', 'GUNR', 'GNR', 'NANR', 'FTRI', 'IAU', 'SLV', 'GLD', 'GLDM', 'IAU', 'SLV', 'GLD', 'GLDM', 'DWT', 'UGAZ', 'UWTI', 'UWT', 'DGZ'], | |
ESEC_TECH: ['XLK', 'SMH', 'IGV', 'SOXX'], | |
ESEC_FINANCIALS: ['XLF', 'KRE', 'KBE', 'EUFN'], | |
ESEC_CONSUMER_DISCRETIONARY: ['XRT', 'XLY', 'FDIS', 'FXD'], | |
ESEC_INDUSTRIALS:['XLI', 'XAR', 'ITA', 'VIS'], | |
ESEC_MATERIALS: ['GDX', 'GDXJ', 'XLB', 'XME'], | |
ESEC_REITS:['IYR', 'VNQ', 'XLRE', 'SCHH', 'ITB', 'XHB', 'PKB', 'FLM', 'MORL', 'MRRL', 'REML', 'DRN'], | |
ESEC_TELECOM: ['IYZ', 'IGN', 'XTL'], | |
ESEC_CONSUMER_STAPLES: ['XLP', 'FSTA', 'VDC', 'FXG'], | |
ESEC_UTILITES:['XLU', 'FXU', 'VPU', 'FUTY'], | |
ESEC_ENERGY:['XOP', 'XLE', 'OIH', 'XES', 'USO', 'UNG', 'BNO', 'DBO'], | |
ESEC_HEALTH_CARE: ['XLV', 'XBI', 'IBB', 'VHT'], | |
ESTYLE_HIGH_BETA:['TQQQ','SSO','FLGE', 'QLD'], | |
ESTYLE_LOW_BETA:['USMV', 'EFAV', 'SPLV', 'JPST'], | |
ESTYLE_DEFENSIVES:['VDC', 'FSTA', 'IYK', 'XLP'], | |
ESTYLE_CYCLICALS:['VCR','XLY', 'RCD', 'XHB'], | |
ESTYLE_DIVIDEND_YIELD:['VYM', 'VIG', 'DVY', 'HDV'], | |
ESTYLE_MOMENTUM:['MTUM', 'PDP', 'ULVM', 'XMMO' ], | |
ESTYLE_LARGE_CAP_GROWTH: ['SPY', 'QQQ', 'USMV', 'IVV'], | |
ESTYLE_GROWTH: ['IWM', 'IJR', 'MDY', 'IJH', 'SPY', 'QQQ', 'USMV', 'IVV', 'IWR', 'VO', 'SCHM', 'JHMM'], | |
ESTYLE_QUALITY:['QUAL', 'DGRW', 'SPHQ'], | |
ESTYLE_SMALL_CAPS: ['BUY', 'RWJ', 'XMVM', 'RZV', 'DVY', 'VLUE', 'SPYD', 'RPV', 'JKI'], | |
ESTYLE_VALUE:['RZV','PXSV','SMDV','RFV'], | |
FI_LEVERAGED_LOANS:['JNK', 'HYG', 'BKLN', 'HYLB'], | |
FI_BDCS:['BIZD', 'BDCL', 'BDCS', 'LBDC'], | |
FI_TIPS:['TIP', 'SCHP', 'VTIP', 'STIP'], | |
FI_SHORT_DUR_TREASURIES:['SHY', 'VGSH', 'SCHO', 'SPTS'], | |
FI_MEDIUM_DUR_TREASURIES:['IEF', 'IEI', 'SCHR', 'VGIT'], | |
FI_LONG_DUR_TREASURIES:['SPTL', 'VGLT', 'SCHQ', 'TLT'], | |
FI_MUNIS:['MUB', 'VTEB', 'HYD', 'SHM', 'CMF', 'PWZ', 'FCAL', 'NYF', 'PZT'], | |
FI_CONVERTIBLES: ['PFF', 'PGX', 'FPE', 'CWB'], | |
FI_PREFERREDS: ['PFF', 'PGX', 'FPE', 'CWB'], | |
FI_MBS: ['MBB', 'VMBS', 'LMBS', 'SPMB'], | |
FI_INVESTMENT_GRADE_CREDIT:['LQD', 'VCSH', 'VCIT' 'IGSB'], | |
FI_HIGH_YIELD_CREDIT: ['HYG', 'BKLN', 'JNK', 'SJNK'], | |
} | |
def sector_etf_tickers(): | |
return [t for s,t in sector_etfs.items()] | |
def get_sector_vector(): | |
#[Inflation,Growth] | |
directions = { | |
"Quad1":np.array([-1, 1]), | |
"Quad2":np.array([ 1, 1]), | |
"Quad3":np.array([ 1,-1]), | |
"Quad4":np.array([-1,-1]) | |
} | |
#Initialize sector vectors | |
sector_vector = {} | |
for sec in sector_etfs: | |
sector_vector[sec] = np.array([0,0]) | |
#Add or subtract direction depending on weighting | |
for q, deets in quads.items(): | |
for es in deets["Weightings"]["EquitySector"]["Overweight"]: | |
sector_vector[es] += directions[q] | |
for es in deets["Weightings"]["EquitySector"]["Underweight"]: | |
sector_vector[es] -= directions[q] | |
dels = [] | |
for sec in sector_vector: | |
if np.linalg.norm(sector_vector[sec]) == 0: | |
dels.append(sec) | |
continue | |
sector_vector[sec] = sector_vector[sec]/np.linalg.norm(sector_vector[sec]) | |
for d in dels: | |
del sector_vector[d] | |
return sector_vector | |
sector_vectors = get_sector_vector() | |
def returns_to_vector(sector_returns): | |
vec = np.array([0.,0.]) | |
for sec, coord in sector_vectors.items(): | |
vec += coord * sector_returns[sector_etfs[sec]] | |
return vec |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is based on the Hedgeye GIP model. https://app.hedgeye.com/world/terminology