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