#This class is to create the price action pattern of engulging,
class engulf(CustomFilter):
inputs = [USEquityPricing.close, USEquityPricing.low, USEquityPricing.open, USEquityPricing.high]
window_length = 2
def compute(self, today, assets, out, close, low, open1, high):
condition_1 = (high[-1] > high[-2]) & (low[-1]<low[-2])
condition_2 = (close[-1] > close[-2]) & (open1[-1]<open1[-2])
condition_3 = close[-1] > open1[-1]
condition_4 = (close[-1] > open1[-2]) & (open1[-1]<close[-2])
result = condition_1 & condition_2 & condition_3 & condition_4
out[:] = result
class volume(CustomFilter):
inputs = [USEquityPricing.volume]
window_length = 6
def compute(self, today, assets, out, vol):
low_condition_1 = vol[-1] / np.mean(vol, axis = 0)>0.29
low_condition_2 = (vol[-1] / np.mean(vol, axis = 0))<1.54
out[:] = low_condition_1
def filtro():
sector = Fundamentals.morningstar_sector_code.latest
industry = Fundamentals.morningstar_industry_code.latest
#universe= Q3000US() & sector.element_of([206])
universe = Q3000US() & QTradableStocksUS()
sma20 = SimpleMovingAverage(inputs = [USEquityPricing.close], window_length=20 )
sma50 = SimpleMovingAverage(inputs = [USEquityPricing.close], window_length=50, mask = universe )
sma200 = SimpleMovingAverage(inputs = [USEquityPricing.close], window_length=200 )
price = SimpleMovingAverage(inputs = [USEquityPricing.close], window_length=1, mask = universe )
high = SimpleMovingAverage(inputs = [USEquityPricing.high], window_length=1, mask = universe )
low = SimpleMovingAverage(inputs = [USEquityPricing.low], window_length=1, mask = universe )
close = SimpleMovingAverage(inputs = [USEquityPricing.close], window_length=1, mask = universe )
open1 = SimpleMovingAverage(inputs = [USEquityPricing.open], window_length=1, mask = universe )
betaytd = SimpleBeta(target=symbols(8554) , regression_length=100)
betayty = SimpleBeta(target=symbols(8554),regression_length = 253)
rsi = RSI()
macd = MACDSignal()
condition_1 = rsi < 40
condition_2 = macd < -1.5
technical_condition = condition_2 & condition_1
condition_1 = price > sma20
condition_2 = price < sma50
condition_3 = price < sma200
condition_4 = 5 < price <120
sma_condition = condition_1 & condition_4 & condition_3 & condition_2
mid_price = (high+low)/2
box = (close-open1).abs()
limit_box = (high-low)*0.25
condition_5 = close > mid_price
condition_6 = open1 > mid_price
condition_7 = box <= limit_box
hammer = condition_5 & condition_6 & condition_7
price_action = (hammer & volume()) | engulf()
filter1= technical_condition | sma_condition
return Pipeline(columns={"filter":filter1} ,screen = universe & price_action )
factor = run_pipeline(filtro(), start_date="2019-05-5", end_date="2020-06-11")