0基础小白来交作业了
def initialize(context):
run_daily(period, time="every_bar")
g.stocksnum = 10
g.cycle = 7
g.days = 6
#对止损的股票设置小黑屋:
g.blacklist = {}
def period(context):
g.days += 1
#获取今日日期:
today = context.current_dt.date()
#从小黑屋放股票出来:
items = list(g.blacklist.items())
for st , end_date in items:
#如果今日日期在刑满日期之后,把这只股票放出:
if today > end_date:
del g.blacklist[st]
#设置止损和止盈:
st_hold = list(context.portfolio.positions.keys())
for st in st_hold:
price = context.portfolio.positions[st].price
cost = context.portfolio.positions[st].avg_cost
ret = price / cost - 1
if ret < -0.1:
order_target(st, 0)
#关进小黑屋,刑期20天:
end_date = today + datetime.timedelta(20)
g.blacklist[st] = end_date
print(f"紧急止损{st},该股票亏损{ret},关入黑名单20天")
if ret > 0.3:
order_target(st,0)
print(f"止盈{st},该股票获利{ret}")
if g.days % g.cycle ==0:
#筛选市值最小的10支股票:
a = list(get_all_securities(["stock"], date = context.current_dt).index)
q=query(valuation.code
).filter(valuation.code.in_(a)
).order_by(valuation.market_cap.asc()
).limit(30)
w=get_fundamentals(q)
beixuan_list = w["code"]
#剔除掉小黑屋股、st股票、停牌股票、与涨停股票:
clean_list = []
current_data = get_current_data()
for st in beixuan_list:
if st in g.blacklist:
continue
if current_data[st].is_st:
continue
if current_data[st].paused:
continue
if current_data[st].day_open >= current_data[st].high_limit:
continue
clean_list.append(st)
target_st = clean_list[:g.stocksnum]
#若持仓股票不在目标股票中,卖出:
#因为部分持仓股票可能已经关进小黑屋,所以需要重新获取持仓股票:
st_hold_now = list(context.portfolio.positions.keys())
for st in st_hold_now:
if st not in target_st:
order_target(st, 0)
#买入目标股票,动态调仓:
for st in target_st:
order_target_value(st, context.portfolio.total_value / g.stocksnum)