コード例 #1
0
    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
コード例 #2
0
ファイル: training.py プロジェクト: zhuzhenping/strategy-1
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
コード例 #3
0
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
コード例 #4
0
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
コード例 #5
0
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
コード例 #6
0
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
コード例 #7
0
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