我的想法略有不同,先排除了筛选范围内的ST,退市和停牌股,然后再做选择,保证每次都能选出n支可交易的股票。
```
def initialize(context):
run_daily(period,'every_bar')
g.stocksnum = 3
# g.stock_last_list = get_stock()
g.period = 7
g.day = 0
def paused_filter(security_list):
current_data = get_current_data()
security_list = [stock for stock in security_list if not current_data[stock].paused]
return security_list
def delisted_filter(security_list):
current_data = get_current_data()
security_list = [stock for stock in security_list if not '退' in current_data[stock].name]
return security_list
def st_filter(security_list):
current_data = get_current_data()
security_list = [stock for stock in security_list if not current_data[stock].is_st]
return security_list
def get_stock():
sc = get_index_stocks('000001.XSHG')+get_index_stocks('399106.XSHE')
sc_filter_pd = paused_filter(sc)
sc_filter_pdst = st_filter(sc_filter_pd)
sc_filter_pdstd = delisted_filter(sc_filter_pdst)
q = query(valuation.code).filter(valuation.code.in_(sc_filter_pdstd)).order_by(valuation.market_cap.asc()).limit(g.stocksnum)
dq = get_fundamentals(q)
return list(dq.code)
def period(context):
# q = query(valuation.code).order_by(valuation.market_cap.asc()).limit(g.stocksnum)
# dq = get_fundamentals(q)
if g.day%g.period == 0:
stock = get_stock()
print(stock)
for i in context.portfolio.positions:
if i not in stock:
order_target(i,0)
print('%s is not in stock' % i)
Mvalue = context.portfolio.available_cash/g.stocksnum
print(Mvalue)
for i in stock:
if i in stock:
print('%s is in stock' % i)
order_value(i,Mvalue)
print(context.portfolio.positions)
g.day = g.day + 1
```
def initialize(context):
run_daily(period,time='every_bar')
#设置选股数量,仓位调整周期
g.stocksnum=3
g.times=7
g.circle=0
def period(context):
#判断当前账户股票收益与损失大与5%止盈,损失大与10%止损
for j in context.portfolio.positions:
cost=context.portfolio.positions[j].avg_cost
price=context.portfolio.positions[j].price
t=price/cost-1
if (t>=0.05)or(t< =-0.1):
order_target(j,0)
#
if g.circle%g.times==0:
stockslist=get_index_stocks("000001.XSHG")+get_index_stocks("399106.XSHE")
q=query(valuation.code).filter(valuation.code.in_(stockslist)).order_by(valuation.market_cap.asc()).limit(g.stocksnum)
df=get_fundamentals(q)
lists=list(df['code'])
for i in context.portfolio.positions:
if i not in lists:
order_target(i,0)
avlaiblem=context.portfolio.available_cash/10
for j in lists:
order(j,avlaiblem)
g.circle=g.circle+1