def __make_factors(self): universe = make_china_equity_universe( target_size=3000, mask=default_china_equity_universe_mask([risk_benchmark]), max_group_weight=0.01, smoothing_func=lambda f: f.downsample('month_start'), ) last_price = USEquityPricing.close.latest >= 1.0 # 大于1元 universe = universe & last_price # market cap and book-to-price data gets fed in here outstanding = Fundamental().outstanding outstanding.window_safe = True market_cap = Latest([outstanding]) book_to_price = SimpleBookToPrice() momentum = SimpleMomentum(mask=universe) alpha5 = Alpha5(mask=universe) alpha8 = Alpha8(mask=universe) alpha9 = Alpha9(mask=universe) all_factors = { 'market_cap': market_cap.downsample('month_start'), 'book_to_price': book_to_price.downsample('month_start'), 'momentum': momentum, 'alpha5': alpha5, 'alpha8': alpha8, 'alpha9': alpha9, } return all_factors, universe
def make_pipeline(asset_finder): h2o = USEquityPricing.high.latest / USEquityPricing.open.latest l2o = USEquityPricing.low.latest / USEquityPricing.open.latest c2o = USEquityPricing.close.latest / USEquityPricing.open.latest h2c = USEquityPricing.high.latest / USEquityPricing.close.latest l2c = USEquityPricing.low.latest / USEquityPricing.close.latest h2l = USEquityPricing.high.latest / USEquityPricing.low.latest vol = USEquityPricing.volume.latest outstanding = Fundamental(asset_finder).outstanding outstanding.window_safe = True turnover_rate = vol / Latest([outstanding]) returns = Returns(inputs=[USEquityPricing.close], window_length=5) # 预测一周数据 pipe_columns = { 'h2o': h2o.log1p().zscore(), 'l2o': l2o.log1p().zscore(), 'c2o': c2o.log1p().zscore(), 'h2c': h2c.log1p().zscore(), 'l2c': l2c.log1p().zscore(), 'h2l': h2l.log1p().zscore(), 'vol': vol.zscore(), 'turnover_rate': turnover_rate.log1p().zscore(), 'return': returns.log1p(), } # pipe_screen = (low_returns | high_returns) pipe = Pipeline(columns=pipe_columns) return pipe
class SimpleBookToPrice(CustomFactor): # pb = price to book, but we return the reciprocal fund_pd = Fundamental().pb fund_pd.window_safe = True inputs = [fund_pd] window_length = 1 def compute(self, today, assets, out, pb): out[:] = 1 / pb
def make_pipeline(asset_finder): private_universe = private_universe_mask( hs300.tolist(),asset_finder=asset_finder) #print private_universe_mask(['000001','000002','000005'],asset_finder=asset_finder) ###################################################################################################### returns = Returns(inputs=[USEquityPricing.close], window_length=5) # 预测一周数据 ###################################################################################################### ep = 1/Fundamental(mask = private_universe,asset_finder=asset_finder).pe bp = 1/Fundamental(mask = private_universe,asset_finder=asset_finder).pb bvps = Fundamental(mask = private_universe,asset_finder=asset_finder).bvps market = Fundamental(mask = private_universe,asset_finder=asset_finder).outstanding rev20 = Returns(inputs=[USEquityPricing.close], window_length=20,mask = private_universe) vol20 = AverageDollarVolume(window_length=20,mask = private_universe) illiq = ILLIQ(window_length=22,mask = private_universe) rsi = RSI(window_length=22,mask = private_universe) mom = Momentum(window_length=252,mask = private_universe) sector = get_sector(asset_finder=asset_finder,mask=private_universe) ONEHOTCLASS,sector_indict_keys = get_sector_by_onehot(asset_finder=asset_finder,mask=private_universe) pipe_columns = { 'ep':ep.zscore(groupby=sector).downsample('month_start'), 'bp':bp.zscore(groupby=sector).downsample('month_start'), 'bvps':bvps.zscore(groupby=sector).downsample('month_start'), 'market_cap': market.zscore(groupby=sector).downsample('month_start'), 'vol20':vol20.zscore(groupby=sector), 'rev20':rev20.zscore(groupby=sector), 'ILLIQ':illiq.zscore(groupby=sector,mask=illiq.percentile_between(1, 99)), 'mom' :mom.zscore(groupby=sector,mask=mom.percentile_between(1, 99)), 'rsi' :rsi.zscore(groupby=sector,mask=rsi.percentile_between(1, 99)), #'sector':sector, #'returns':returns.quantiles(100), 'returns': returns.zscore(), } # pipe_screen = (low_returns | high_returns) pipe = Pipeline(columns=pipe_columns, screen=private_universe, ) i = 0 for c in ONEHOTCLASS: pipe.add(c,sector_indict_keys[i]) i +=1 return pipe
def universe_filter(smoothing_func=None, asset_finder=None): """ Create a Pipeline producing Filters implementing common acceptance criteria. Returns ------- zipline.Filter Filter to control tradeablility """ factors = { 'MarketCap': Fundamental(asset_finder=asset_finder).outstanding, 'ADV_adj': ADV_adj(), 'Sector': get_sector(asset_finder=asset_finder), } #func = lambda f: f.downsample('month_start') if smoothing_func != None: factors = {id: smoothing_func(factors[id]) for id in factors.keys()} #print factors factors['MarketCap'] = factors['MarketCap'] > MARKET_CAP_DOWNLIMIT factors['ADV_adj'] = factors['ADV_adj'] > ADV_ADJ_DOWNLIMIT factors['Sector'] = factors['Sector'].notnull() filters = None for value in factors.values(): if filters == None: filters = value else: filters = (filters & value) #print filters #mySymbolsListfiter = default_china_equity_universe_mask() # Equities with an average daily volume greater than 5000000. #high_volume = (AverageDollarVolume(window_length=252) > 5000000) #liquid = ADV_adj().downsample('month_start') > 2500000 #market_cap_filter = MarketCap().downsample('month_start') > market_cap_limit #universe_filter = (mySymbolsListfiter & market_cap_filter & liquid & high_volume ) #universe_filter = ( maket_cap_filter & liquid ) return filters
def make_pipeline(asset_finder, algo_mode): private_universe = private_universe_mask(hs300.tolist(), asset_finder=asset_finder) #private_universe = private_universe_mask( ['000005'],asset_finder=asset_finder) ###private_universe = private_universe_mask( ['000002','000005'],asset_finder=asset_finder) #private_universe = private_universe_mask( ['000001','000002','000005'],asset_finder=asset_finder) #private_universe = private_universe_mask( ['000001'],asset_finder=asset_finder) #print private_universe_mask(['000001','000002','000005'],asset_finder=asset_finder) ###################################################################################################### returns = Returns(inputs=[USEquityPricing.close], window_length=5, mask=private_universe) # 预测一周数据 ###################################################################################################### pe = Fundamental(mask=private_universe, asset_finder=asset_finder).pe pb = Fundamental(mask=private_universe, asset_finder=asset_finder).pb bvps = Fundamental(mask=private_universe, asset_finder=asset_finder).bvps market = Fundamental(mask=private_universe, asset_finder=asset_finder).outstanding totals = Fundamental(mask=private_universe, asset_finder=asset_finder).totals totalAssets = Fundamental(mask=private_universe, asset_finder=asset_finder).totalAssets fixedAssets = Fundamental(mask=private_universe, asset_finder=asset_finder).fixedAssets esp = Fundamental(mask=private_universe, asset_finder=asset_finder).esp rev = Fundamental(mask=private_universe, asset_finder=asset_finder).rev profit = Fundamental(mask=private_universe, asset_finder=asset_finder).profit gpr = Fundamental(mask=private_universe, asset_finder=asset_finder).gpr npr = Fundamental(mask=private_universe, asset_finder=asset_finder).npr rev10 = Returns(inputs=[USEquityPricing.close], window_length=10, mask=private_universe) vol10 = AverageDollarVolume(window_length=20, mask=private_universe) rev20 = Returns(inputs=[USEquityPricing.close], window_length=20, mask=private_universe) vol20 = AverageDollarVolume(window_length=20, mask=private_universe) rev30 = Returns(inputs=[USEquityPricing.close], window_length=30, mask=private_universe) vol30 = AverageDollarVolume(window_length=20, mask=private_universe) illiq22 = ILLIQ(window_length=22, mask=private_universe) illiq5 = ILLIQ(window_length=5, mask=private_universe) rsi5 = RSI(window_length=5, mask=private_universe) rsi22 = RSI(window_length=22, mask=private_universe) mom5 = Momentum(window_length=5, mask=private_universe) mom22 = Momentum(window_length=22, mask=private_universe) sector = get_sector(asset_finder=asset_finder, mask=private_universe) ONEHOTCLASS, sector_indict_keys = get_sector_by_onehot( asset_finder=asset_finder, mask=private_universe) pipe_columns = { 'pe': pe.zscore(groupby=sector).downsample('month_start'), 'pb': pb.zscore(groupby=sector).downsample('month_start'), 'bvps': bvps.zscore(groupby=sector).downsample('month_start'), 'market_cap': market.zscore(groupby=sector).downsample('month_start'), 'totals': totals.zscore(groupby=sector).downsample('month_start'), 'totalAssets': totalAssets.zscore(groupby=sector).downsample('month_start'), 'fixedAssets': fixedAssets.zscore(groupby=sector).downsample('month_start'), 'esp': esp.zscore(groupby=sector).downsample('month_start'), 'rev': rev.zscore(groupby=sector).downsample('month_start'), 'profit': profit.zscore(groupby=sector).downsample('month_start'), 'gpr': gpr.zscore(groupby=sector).downsample('month_start'), 'npr': npr.zscore(groupby=sector).downsample('month_start'), 'vol10': vol10.zscore(groupby=sector).downsample('week_start'), 'rev10': rev10.zscore(groupby=sector).downsample('week_start'), 'vol20': vol20.zscore(groupby=sector).downsample('week_start'), 'rev20': rev20.zscore(groupby=sector).downsample('week_start'), 'vol30': vol30.zscore(groupby=sector).downsample('week_start'), 'rev30': rev30.zscore(groupby=sector).downsample('week_start'), 'ILLIQ5': illiq5.zscore(groupby=sector).downsample('week_start'), 'ILLIQ22': illiq22.zscore(groupby=sector).downsample('week_start'), 'mom5': mom5.zscore(groupby=sector).downsample('week_start'), 'mom22': mom22.zscore(groupby=sector).downsample('week_start'), 'rsi5': rsi5.zscore(groupby=sector).downsample('week_start'), 'rsi22': rsi22.zscore(groupby=sector).downsample('week_start'), } from collections import OrderedDict factors_pipe = OrderedDict() factors_pipe['Returns'] = returns factors_pipe['Returns'].window_safe = True idx = 0 sort_keys = sorted(pipe_columns) for key in sort_keys: #print(key) factors_pipe[key] = pipe_columns[key] factors_pipe[key].window_safe = True idx += 1 if idx == 100: break #for name, f in pipe_columns.items(): # f.window_safe = True # factors_pipe[name] = f # print (name,f) # idx += 1 # if idx == 1: # break i = 0 for c in ONEHOTCLASS: c.window_safe = True factors_pipe[sector_indict_keys[i]] = c #print (c,sector_indict_keys[i]) i += 1 predict = BasicFactorRegress(inputs=factors_pipe.values(), window_length=252, mask=private_universe, n_fwd_days=5, algo_mode=algo_mode, cross=False) predict_rank = predict.rank(mask=private_universe) longs = predict_rank.top(NUM_LONG_POSITIONS) shorts = predict_rank.bottom(NUM_SHORT_POSITIONS) long_short_screen = (longs | shorts) #TODO sector onehot pipe_final_columns = { 'Predict Factor': predict.downsample('week_start'), 'longs': longs.downsample('week_start'), 'shorts': shorts.downsample('week_start'), 'predict_rank': predict_rank.downsample('week_start'), } pipe = Pipeline( columns=pipe_final_columns, screen=long_short_screen, ) return pipe
def make_pipeline(asset_finder): hs300 = ts.get_hs300s()['code'] private_universe = private_universe_mask(hs300.tolist(), asset_finder=asset_finder) #private_universe = private_universe_mask(['000001','000002','000005'],asset_finder=asset_finder) ###################################################################################################### returns = Returns(inputs=[USEquityPricing.close], window_length=5, mask=private_universe) # 预测一周数据 ###################################################################################################### ep = 1 / Fundamental(mask=private_universe, asset_finder=asset_finder).pe bp = 1 / Fundamental(mask=private_universe, asset_finder=asset_finder).pb bvps = Fundamental(mask=private_universe, asset_finder=asset_finder).bvps market = Fundamental(mask=private_universe, asset_finder=asset_finder).outstanding totals = Fundamental(mask=private_universe, asset_finder=asset_finder).totals totalAssets = Fundamental(mask=private_universe, asset_finder=asset_finder).totalAssets fixedAssets = Fundamental(mask=private_universe, asset_finder=asset_finder).fixedAssets esp = Fundamental(mask=private_universe, asset_finder=asset_finder).esp rev = Fundamental(mask=private_universe, asset_finder=asset_finder).rev profit = Fundamental(mask=private_universe, asset_finder=asset_finder).profit gpr = Fundamental(mask=private_universe, asset_finder=asset_finder).gpr npr = Fundamental(mask=private_universe, asset_finder=asset_finder).npr rev10 = Returns(inputs=[USEquityPricing.close], window_length=10, mask=private_universe) vol10 = AverageDollarVolume(window_length=20, mask=private_universe) rev20 = Returns(inputs=[USEquityPricing.close], window_length=20, mask=private_universe) vol20 = AverageDollarVolume(window_length=20, mask=private_universe) rev30 = Returns(inputs=[USEquityPricing.close], window_length=30, mask=private_universe) vol30 = AverageDollarVolume(window_length=20, mask=private_universe) illiq22 = ILLIQ(window_length=22, mask=private_universe) illiq5 = ILLIQ(window_length=5, mask=private_universe) rsi5 = RSI(window_length=5, mask=private_universe) rsi22 = RSI(window_length=22, mask=private_universe) mom5 = Momentum(window_length=5, mask=private_universe) mom22 = Momentum(window_length=22, mask=private_universe) sector = get_sector(asset_finder=asset_finder, mask=private_universe) ONEHOTCLASS, sector_indict_keys = get_sector_by_onehot( asset_finder=asset_finder, mask=private_universe) pipe_columns = { 'ep': ep.zscore(groupby=sector).downsample('month_start'), 'bp': bp.zscore(groupby=sector).downsample('month_start'), 'bvps': bvps.zscore(groupby=sector).downsample('month_start'), 'market_cap': market.zscore(groupby=sector).downsample('month_start'), 'totals': totals.zscore(groupby=sector).downsample('month_start'), 'totalAssets': totalAssets.zscore(groupby=sector).downsample('month_start'), 'fixedAssets': fixedAssets.zscore(groupby=sector).downsample('month_start'), 'esp': esp.zscore(groupby=sector).downsample('month_start'), 'rev': rev.zscore(groupby=sector).downsample('month_start'), 'profit': profit.zscore(groupby=sector).downsample('month_start'), 'gpr': gpr.zscore(groupby=sector).downsample('month_start'), 'npr': npr.zscore(groupby=sector).downsample('month_start'), 'vol10': vol10.zscore(groupby=sector).downsample('week_start'), 'rev10': rev10.zscore(groupby=sector).downsample('week_start'), 'vol20': vol20.zscore(groupby=sector).downsample('week_start'), 'rev20': rev20.zscore(groupby=sector).downsample('week_start'), 'vol30': vol30.zscore(groupby=sector).downsample('week_start'), 'rev30': rev30.zscore(groupby=sector).downsample('week_start'), 'ILLIQ5': illiq5.zscore(groupby=sector).downsample('week_start'), 'ILLIQ22': illiq22.zscore(groupby=sector).downsample('week_start'), 'mom5': mom5.zscore(groupby=sector).downsample('week_start'), 'mom22': mom22.zscore(groupby=sector).downsample('week_start'), 'rsi5': rsi5.zscore(groupby=sector).downsample('week_start'), 'rsi22': rsi22.zscore(groupby=sector).downsample('week_start'), #'rsi22': rsi22.zscore(groupby=sector, mask=rsi22.percentile_between(1, 99)), ####################################################################################################################### # 'ILLIQ5-2' : illiq5.zscore(groupby=quantiles([illiq5],bins = 10,mask = private_universe)).downsample('week_start'), # 'ILLIQ22-2': illiq22.zscore(groupby=quantiles([illiq22],bins = 10,mask = private_universe)).downsample('week_start'), # 'ILLIQ5-2': illiq5.zscore(groupby=market.quantiles(bins=10, mask=private_universe)).downsample('week_start'), # 'ILLIQ22-2': illiq22.zscore(groupby=market.quantiles(bins=10, mask=private_universe)).downsample('week_start'), ############################################################################################################################# 'returns': returns.downsample('week_start'), } pipe = Pipeline( columns=pipe_columns, screen=private_universe, ) i = 0 for c in ONEHOTCLASS: pipe.add(c, sector_indict_keys[i]) i += 1 return pipe