Hi All,
I seem to have a performance problem with a very simple pipeline code. The code is very straightforward but it takes a loooong time. This is really annoying even when using the pipeline only once per quarter. Here it goes:
#Factors definition
class PriceToBook(CustomFactor):
window_length = 1
inputs = [morningstar.valuation_ratios.pb_ratio]
def compute(self, today, assets, out, pb_ratio):
out[:] = pb_ratio[-1]
class ReturnOnEquity(CustomFactor):
window_length = 1
inputs = [morningstar.operation_ratios.roe]
def compute(self, today, assets, out, roe):
out[:] = roe[-1]
class MarketCap(CustomFactor):
inputs = [morningstar.valuation.shares_outstanding, USEquityPricing.close]
window_length = 1
def compute(self, today, assets, out, shares, close_price):
# Shares * price/share = total price = market cap
out[:] = shares[-1] * close_price[-1]
def initialize(context):
attach_pipeline(make_pipeline(context), 'my_pipeline')
def make_pipeline(context):
pipe = Pipeline()
pb_ratio=PriceToBook()
pipe.add(pb_ratio,'pb')
roe = ReturnOnEquity()
pipe.add(roe,'roe')
mkt_cap = MarketCap()
mkt_cap_rank = mkt_cap.rank(ascending=False)
mid_cap = (500 < mkt_cap_rank) & (1000 >= mkt_cap_rank)
pb_rank = pb_ratio.rank(mask=mid_cap, ascending=True)
pipe.add(pb_rank, 'pb_rank')
roe_rank = roe.rank(mask=mid_cap, ascending=False)
pipe.add(roe_rank, 'roe_rank')
combo_raw = (pb_rank+roe_rank)/2
pipe.add(combo_raw, 'combo_raw')
pipe.add(combo_raw.rank(mask=mid_cap, ascending=True).top(50), 'combo_rank')
pipe.set_screen(mid_cap)
return pipe
def before_trading_start(context, data):
context.output = pipeline_output('my_pipeline')
context.security_list = context.output.sort(
['combo_rank'],
ascending=True
).iloc[-20:].index.tolist()
Please help me optimize this code !