def initialize(context):
run_daily(period,time='every_bar')
# 代码:设定好要交易的股票数量stocksnum
g.stocksnum=5
def period(context):
# 获取全部股票数据,并转换为[]
allstocks=get_all_securities(date=context.current_dt).index.tolist()
#剔除停牌/st股/科创部(把票加入clist)
current_data = get_current_data()
clist=[]
for stock in allstocks :
if current_data[stock].paused == False and current_data[stock].is_st==False and stock.startswith('688')==False:
clist.append(stock)
'''#另一法剔除st(st是个df对象)
date=context.current_dt
st=get_extras('is_st', clist,start_date=date, end_date=date)
st=st.loc[context.current_dt.strftime("%Y-%m-%d")]
blist=list(st[st==False].index)
#stock_to_hold = blist[:]'''
# 获取全部股票数据中市值最小的前stocksnum个股票的财务数据
q=query(valuation.code).filter(valuation.code.in_(clist)).order_by(valuation.market_cap.asc()).limit(g.stocksnum)
mincapstocks=get_fundamentals(q)
# 在获取的财务数据中选取股票代码并转为列表
buylist=list(mincapstocks['code'])
# 将可用资金拆分成stocksnum份
position_per_stk1 = context.portfolio.available_cash/g.stocksnum
# 判断是否有持仓,没有持仓时则买入前stocksnum个最小市值的股票
if context.portfolio.positions_value == 0:
for i in buylist:
order_value(i,position_per_stk1)
# 有持仓时
else:
#遍历持仓,若某持仓股不在list中,则卖之
for a in context.portfolio.positions:
if a not in buylist:
order_target(a,0)
#遍历list,若list中某几股现在仓内没有,则累加看有几个
missnum=0
for x in buylist:
if x not in context.portfolio.positions:
missnum += 1
#若list中确实有新股,则用剩余现金等权买入
if missnum !=0:
moneypay=context.portfolio.available_cash/missnum
for ms in buylist:
if ms not in context.portfolio.positions:
order_value(ms,moneypay)