I am looking to use the intersection for small_value and big_growth below as my defined long and short lists. Essentially, I am looking to:
- Only go long small_value that have earnings surprise beats
- Only go short big_growth that have earnings surprise misses
In my backtests I can't seem to get my algo to pull any long or short securities from the defined intersection in order to place orders. I am thinking it might be due to the small_value and bigh_growth being lists that need to be converted to DataFrames? I am not sure if it is this or another reason. Any help is appreciated.
def before_trading_start(context, data):
spy = sid(8554)
factors = pipeline_output('peads_ff')
factors = factors[factors['pe'] == 1]
# get the data we're going to use
returns = factors['returns']
mkt_cap = factors.sort(['market_cap'], ascending=True)
be_me = factors.sort(['be_me'], ascending=True)
longs = factors['longs']
shorts = factors['shorts']
# to compose the six portfolios, split our universe into portions
half = int(len(mkt_cap)*0.5)
small_caps = mkt_cap[:half]
big_caps = mkt_cap[half:]
thirty = int(len(be_me)*0.3)
seventy = int(len(be_me)*0.7)
growth = be_me[:thirty]
neutral = be_me[thirty:seventy]
value = be_me[seventy:]
# now use the portions to construct the portfolios.
# note: these portfolios are just lists (indices) of equities
small_value = small_caps.index.intersection(value.index)
big_growth = big_caps.index.intersection(growth.index)
sv = longs[small_value]
bg = shorts[big_growth]
assets_in_universe = sv.index
context.positive_surprise = assets_in_universe
return context.positive_surprise
assets_in_universe = bg.index
context.negative_surprise = assets_in_universe
return context.negative_surprise