Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Limiting price in pipeline

When there are two limits/comparisons in the pipeline, they need to be separated like in this example in order to work right, cannot be combined on one line.

'''
        #& (c.prc_lo <= price <= c.prc_hi)     # prc_lo is ignored  
        #& (c.prc_hi >= price >= c.prc_lo)     # prc_hi is ignored

        & (c.prc_lo <= price)                  # These work ...  
        & (price <= c.prc_hi)                  #   ... together ok.  
'''
from quantopian.pipeline                     import Pipeline  
from quantopian.algorithm                    import attach_pipeline, pipeline_output  
from quantopian.pipeline.data                import morningstar as mstar  
from quantopian.pipeline.factors             import AverageDollarVolume  
from quantopian.pipeline.data.builtin        import USEquityPricing  
from quantopian.pipeline.filters.morningstar import IsPrimaryShare

def initialize(context):  
    c = context  
    c.prc_lo = 30.00  
    c.prc_hi = 40.00  
    pipe     = attach_pipeline(Pipeline(), 'zoo')  
    price    = USEquityPricing.close.latest  
    tradable = (  
        IsPrimaryShare()  
        &  mstar.valuation.market_cap.latest.notnull()  
        &  mstar.balance_sheet.limited_partnership.latest.isnull()  
        &  mstar.share_class_reference.security_type.latest.eq('ST00000001')  
        & ~mstar.share_class_reference.is_depositary_receipt.latest  
        & ~mstar.share_class_reference.symbol.latest.endswith('.WI')  
        & ~mstar.share_class_reference.exchange_id.latest.startswith('OTC')  
        & ~mstar.company_reference.standard_name.latest.matches('.* L[. ]?P.?$')  
        & AverageDollarVolume(window_length=20).percentile_between(90, 100)


        #& (c.prc_lo <= price <= c.prc_hi)     # prc_lo is ignored  
        #& (c.prc_hi >= price >= c.prc_lo)     # prc_hi is ignored

        & (c.prc_lo <= price)                  # These work ...  
        & (price <= c.prc_hi)                  #   ... together ok.


    )  
    pipe.add(price, 'prc')  
    pipe.set_screen(tradable)

def before_trading_start(context, data):  
    c = context  
    c.output  = pipeline_output('zoo')  
    log.info('{} stocks  min {}  max {}'.format(len(c.output), min(c.output['prc'].values), max(c.output['prc'].values)))

'''
        & (c.prc_lo <= price <= c.prc_hi)     # prc_lo is ignored  
2017-02-01 05:45 before_trading_start:42 INFO 164 stocks  min 3.49  max 39.85  
2017-02-02 05:45 before_trading_start:42 INFO 169 stocks  min 3.4  max 39.99  
2017-02-03 05:45 before_trading_start:42 INFO 169 stocks  min 3.37  max 39.99  
2017-02-06 05:45 before_trading_start:42 INFO 164 stocks  min 3.425  max 39.865  
2017-02-07 05:45 before_trading_start:42 INFO 169 stocks  min 3.33  max 40.0

        & (c.prc_hi >= price >= c.prc_lo)     # prc_hi is ignored  
2017-02-01 05:45 before_trading_start:42 INFO 485 stocks  min 30.22  max 1575.92  
2017-02-02 05:45 before_trading_start:42 INFO 480 stocks  min 30.03  max 1575.32  
2017-02-03 05:45 before_trading_start:42 INFO 481 stocks  min 30.12  max 1573.11  
2017-02-06 05:45 before_trading_start:42 INFO 486 stocks  min 30.27  max 1583.37  
2017-02-07 05:45 before_trading_start:42 INFO 488 stocks  min 30.13  max 1587.37

        & (c.prc_lo <= price)               # These work ...  
        & (price <= c.prc_hi)               #   ... together ok.  
2017-02-01 05:45 before_trading_start:42 INFO 56 stocks  min 30.22  max 39.85  
2017-02-02 05:45 before_trading_start:42 INFO 55 stocks  min 30.03  max 39.99  
2017-02-03 05:45 before_trading_start:42 INFO 57 stocks  min 30.12  max 39.99  
2017-02-06 05:45 before_trading_start:42 INFO 55 stocks  min 30.27  max 39.865  
2017-02-07 05:45 before_trading_start:42 INFO 59 stocks  min 30.13  max 40.0  
'''