```
# 导入函数库
from jqdata import *
def initialize(context):
# 股票交易费用
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
set_option('use_real_price', True)
run_daily(period,time='every_bar')
# 设定好要交易的股票数量
g.stocksnum = 10
# 设定交易周期
g.period = 7
# 记录策略进行天数
g.days = 0
def period(context):
# 判断策略进行天数是否能被轮动频率整除余1
if g.days % g.period == 0:
# 代码:找出市值排名最小的前stocksnum只股票作为要买入的股票
# 获取上证指数和深证综指的成分股代码并连接,即为全A股市场所有股票的股票代码
# 用加号可以连接两个list
scu = get_index_stocks('000001.XSHG')+get_index_stocks('399106.XSHE')
#ST股票列表,筛选出不是ST的股票
# sort_st_stocks = get_extras('is_st', scu, start_date=context.current_dt, end_date=context.current_dt, df=True).iloc[0,:]
# not_st_stocks = list(sort_st_stocks[sort_st_stocks == 0].index)
# 选出在scu内的市值排名最小的前stocksnum只股票,切不是ST股票
q=query(valuation.code
).filter(valuation.code.in_(scu) #,valuation.code.in_(not_st_stocks)
).order_by(
valuation.market_cap.asc()
).limit(g.stocksnum)
df = get_fundamentals(q)
# 选取股票代码并转为list
buylist=list(df['code'])
# 代码:若已持有的股票的市值已经不够小而不在要买入的股票中,则卖出这些股票。
# 对于每个当下持有的股票进行判断:现在是否已经不在buylist里,如果是则卖出
for stock in context.portfolio.positions:
if stock not in buylist: #如果stock不在buylist
stockvalue = context.portfolio.positions[stock].value
print('卖出了股票:',stock,'卖出价值:',stockvalue)
order_target(stock, 0) #调整stock的持仓为0,即卖出
# 代码:买入要买入的股票,买入金额为可用资金的stocksnum分之一
# 将资金分成g.stocksnum份
position_per_stk = context.portfolio.cash/g.stocksnum
# 用position_per_stk大小的g.stocksnum份资金去买buylist中的股票
for stock in buylist:
order_value(stock, position_per_stk)
# 策略进行天数增加1
g.days = g.days + 1
```
2021-10-11