Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Dictionary Error on Security History

I occasionally receive the KeyError where a security is not in my price history list that is called at the beginning of the day. I think the issue is when a security is being held and it is removed from the morningstar Q1500(). I want to do something like

price_history = data.history(context.security_list, "price", sma_day, "1d")  
    cpp = context.portfolio.positions  
    price_history = price_history + data.history(cpp, "price", sma_day, "1d")  

but this is not correct and causes no price history. How do I call all of the new stocks pull from pipeline and all of my current holdings at the beginning of the day to be referenced frequently???

from quantopian.algorithm import attach_pipeline, pipeline_output  
from quantopian.pipeline import Pipeline  
from quantopian.pipeline.data.builtin import USEquityPricing  
from quantopian.pipeline.factors import AverageDollarVolume  
from quantopian.pipeline.filters.morningstar import Q1500US  
from datetime import datetime  
import pandas

sma_day = 20  
trade_cushion = .02  
sd = 2

def initialize(context):  
    schedule_function(my_rebalance, date_rules.every_day(), time_rules.market_open())  
    schedule_function(my_record_vars, date_rules.every_day(), time_rules.market_close())  
    attach_pipeline(make_pipeline(), 'my_pipeline')  
    context.assets = Q1500US()  
    context.portfolio.roi_limit = .05  
def make_pipeline():  
    base_universe = Q1500US()  
    pipe = Pipeline(  
        screen = base_universe,  
    )  
    return pipe  
def before_trading_start(context, data):  
    long_list = list()  
    short_list = list()  
    context.output = pipeline_output('my_pipeline')  
    context.security_list = context.output.index  
    price_history = data.history(context.security_list, "price", sma_day, "1d")  
    context.price_history = price_history  
    cpp = context.portfolio.positions  
    for security in context.security_list:  
        sma = price_history[security]  
        close = price_history[security][sma_day-1]  
        mean = sma.mean()  
        stddev = sma.std()  
        lower_bb = mean - (sd*stddev)  
        upper_bb = mean + (sd*stddev)  
        upper_lower_bb = mean + ((sd+.25)*stddev)  
        if close < lower_bb:  
            if security not in cpp:  
                long_list.append(security)  
        if close > upper_bb:  
            if close < upper_lower_bb:  
                if security not in cpp:  
                    short_list.append(security)  
    record(avalible_long = len(long_list))  
    record(avalible_short = len(short_list))  
    context.long_list = long_list  
    context.short_list = short_list  
def my_assign_weights(context, data):  
    pass  
def my_rebalance(context,data):  
    cpp = context.portfolio.positions  
    for security in cpp:  
        if data.can_trade(security):  
            if cpp[security]["amount"] > 0:  
                if context.price_history[security].mean() <= data.current(security, "price"):  
                    if len(get_open_orders(security)) == 0:  
                        order(security, -cpp[security]["amount"])  
            if cpp[security]["amount"] < 0:  
                if context.price_history[security].mean() >= data.current(security, "price"):  
                    if len(get_open_orders(security)) == 0:  
                        order(security, cpp[security]["amount"])  
    cpp = context.portfolio.positions  
    for security in cpp:  
        diff = cpp[security]["last_sale_date"] - get_datetime()  
        log.info = diff.days  
        #log.info(cpp[security]["last_sale_date"])  
        #if cpp[security]["last_sale_date"]- <= data.current(security, "price"):  
            #if len(get_open_orders(security)) == 0:  
                #order(security, -cpp[security]["amount"])  
    day_cash = context.portfolio.cash  
    if day_cash > 0:  
        if len(context.long_list) + len(context.short_list) > 0:  
            cash_position = day_cash*2  
            if len(context.long_list) > 0:  
                cash_position = cash_position/len(context.long_list)  
                for security in context.long_list:  
                    close = context.price_history[security][sma_day-1]  
                    quan = cash_position//close  
                    if security not in cpp:  
                        order(security, quan, style=LimitOrder(close*(1+trade_cushion)))  
            if len(context.short_list) > 0:  
                cash_position = cash_position/len(context.short_list)  
                for security in context.short_list:  
                    close = context.price_history[security][sma_day-1]  
                    quan = cash_position//close  
                    if security not in cpp:  
                        order(security, -quan, style=LimitOrder(close*(1-trade_cushion)))  
    cpp = context.portfolio.positions  
    record(open_positions = len(cpp))  
    pass  
def my_record_vars(context, data):  
    pass  
def handle_data(context,data):  
    '''  
    if context.portfolio.returns > context.portfolio.roi_limit:  
        context.roi_limit = context.portfolio.returns + .05  
        for security in context.portfolio.positions:  
            if len(get_open_orders(security)) == 0:  
                if data.can_trade(security):  
                    order_share = context.portfolio.positions[security].amount  
                    if order_share > 0:  
                        order_target(security, 0)  
                    elif order_share < 0:  
                        order_target(security,0)'''  

    cpp = context.portfolio.positions  
    for security in cpp:  
        if data.can_trade(security):  
            if cpp[security]["amount"] > 0:  
                if context.price_history[security].mean() <= data.current(security, "price"):  
                    if len(get_open_orders(security)) == 0:  
                        order(security, -cpp[security]["amount"])  
                if (data.current(security, "price") - cpp[security]["cost_basis"])*100/cpp[security]["cost_basis"] <= -3:  
                    if len(get_open_orders(security)) == 0:  
                        order(security, -cpp[security]["amount"])  
                if (data.current(security, "price") - cpp[security]["cost_basis"])*100/cpp[security]["cost_basis"] >= 7:  
                    if len(get_open_orders(security)) == 0:  
                        order(security, -cpp[security]["amount"])  
            if cpp[security]["amount"] < 0:  
                if context.price_history[security].mean() >= data.current(security, "price"):  
                    if len(get_open_orders(security)) == 0:  
                        order(security, cpp[security]["amount"])  
                if (data.current(security, "price") - cpp[security]["cost_basis"])*100/cpp[security]["cost_basis"] >= 3:  
                    if len(get_open_orders(security)) == 0:  
                        order(security, cpp[security]["amount"])  
                if (data.current(security, "price") - cpp[security]["cost_basis"])*100/cpp[security]["cost_basis"] <= -7:  
                    if len(get_open_orders(security)) == 0:  
                        order(security, cpp[security]["amount"])  
    pass