def initialize(context):
run_daily(period, 'every_bar')
g.stocksnum = 5
g.period = 3
g.days = 0
def period(context):
if g.days % g.period == 0:
stocks = get_index_stocks('000001.XSHG')+get_index_stocks('399106.XSHE')
stocklist = list()
current_data = get_current_data(stocks)
st = get_extras('is_st',stocks,start_date='2015-06-01',end_date='2019-07-11')
# 剔除ST&退市&停牌&涨停股票
for each in stocks:
if not st[each].any():
if not current_data[each].is_st:
if not current_data[each].paused:
if not ('ST' or 'st' or '*' or '退' or '*ST') in current_data[each].name:
if current_data[each].last_price != current_data[each].high_limit:
stocklist.append(each)
# 选出在stocklist内的市值排名最小的前stocksnum只股票
q = query(valuation.code
).filter(
valuation.code.in_(stocklist)
).order_by(
valuation.market_cap.asc()
).limit(g.stocksnum)
df = get_fundamentals(q)
buylist = list(df['code'])
# 代码:若已持有的股票的市值已经不够小而不在要买入的股票中,则卖出这些股票。
# 对于每个当下持有的股票进行判断:现在是否已经不在buylist里,如果是则卖出
for stock in context.portfolio.positions:
if stock not in buylist:
order_target(stock, 0)
else:
#盈利到5%止盈
if (context.portfolio.positions[stock].price / context.portfolio.positions[stock].avg_cost - 1) >= 0.05:
order_target(stock, 0)
buylist.remove(stock)
continue
#损失到5%止损
if (context.portfolio.positions[stock].price / context.portfolio.positions[stock].avg_cost - 1) <= -0.05:
order_target(stock, 0)
buylist.remove(stock)
# 代码:买入要买入的股票,买入金额为可用资金的stocksnum分之一
# 将资金分成g.stocksnum份
position_per_stk = context.portfolio.cash/g.stocksnum
for stock in buylist:
order_value(stock, position_per_stk)
g.days += 1