```
from jqdata import *
# 初始化
def initialize(context):
run_daily(period, time = 'every_bar')
# 获取上证和深证成分股,赋给g.security
g.securities = get_index_stocks('000001.XSHG') + get_index_stocks('399106.XSHE')
# 定义标的数量
g.objects = 10
# 定义周期period = 30天
g.period = 30
# 定义当前策略运行天数
g.day = 0
# 剔除退市和停牌的股票
def stock_filter(stock_list, del_paused, del_st, del_delist, del_hl):
# 股票st/停牌/退市/涨跌停 的 APi
current_data = get_current_data()
if del_paused: # 删除停牌
stock_list = [stock for stock in stock_list if not current_data[stock].paused]
if del_st: # 删除ST
stock_list = [stock for stock in stock_list if not current_data[stock].is_st]
if del_delist: # 删除退市
stock_list = [stock for stock in stock_list if not '退' in current_data[stock].name]
if del_hl: # 删除涨停
stock_list = [stock for stock in stock_list if not current_data[stock].day_open >= current_data[stock].high_limit]
return stock_list
def period(context):
g.security = stock_filter(g.securities, True, True, True, True)
# 判断策略运行时长,当一个period后即运行以下内容
if g.day % g. period == 0:
# 筛选出相关数据
q = query(valuation.code, valuation.market_cap
# 按照上证指数成分股, 流通市值进行筛选
).filter(valuation.code.in_(g.security), valuation.market_cap
# 按照市值从大到小排序
).order_by(valuation.market_cap.asc()
# 限制十行数据
).limit(g.objects)
'''
q=query(valuation.code
).filter(
valuation.code.in_(g.security)
).order_by(
valuation.market_cap.asc()
).limit(7)
'''
# 获取筛选出的数据,赋值给code
code = get_fundamentals(q)
# 将数据提取转换为list
g.stocksnum = list(code['code'])
# 将现在的持仓赋给g.positions
g.positions = context.portfolio.positions
# 循环判断持仓是否在所筛选出的小市值股票里
for buy in g.positions:
# 持仓仍然是小市值,保留
if buy in g.stocksnum:
print("持仓仍是目标标的")
# 持仓不再是小市值,清仓相关标的
elif buy not in g.stocksnum:
print("持仓不是目标标的,执行卖出")
order_target(buy, 0)
# 获取可用现金
price = context.portfolio.available_cash
# 剔除同时存在于筛选出的'小市值股票list'和'持仓list'中的标的,生成一个新list,赋值给num
num = [i for i in g.stocksnum if i not in g.positions]
# 统计剩下的list中元素个数,赋值给count
count = len(num)
# 将现金切割为n份,每份现值赋值给g.price
# 可用现金 / 要购买的标的数量
g.price = price / count
# 判断持仓和筛选出的list(num)是否完全重合
if count != 0:
# 循环购买num中的标的
for buylist in num:
order_value(buylist, g.price)
print("买入了:%s" %num)
else:
# 将持仓循环赋给stock
for stock in context.portfolio.positions:
# 获取单个标的开仓价
cost= context.portfolio.positions[stock].avg_cost
# 获取单个标的现价
price = context.portfolio.positions[stock].price
# 计算收益率
ret = price / cost - 1
# 止损止盈
if ret < -0.01:
order_target(stock, 0)
print("亏损 > 10%, 止损")
elif ret >= 0.15:
order_target(stock, 0)
print("盈利 > 15%, 止盈")
# 策略运行天数加一
g.day = g.day + 1
```
2021-05-25