Skip to content

Instantly share code, notes, and snippets.

@barnjamin
Last active December 2, 2020 13:43
Show Gist options
  • Save barnjamin/8f00fef768a923de670a90965d126d0b to your computer and use it in GitHub Desktop.
Save barnjamin/8f00fef768a923de670a90965d126d0b to your computer and use it in GitHub Desktop.
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
@barnjamin
Copy link
Author

This is based on the Hedgeye GIP model. https://app.hedgeye.com/world/terminology

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment