筛选出市值介于10-20亿的股票,选取其中市值最小的三只股票,
每天开盘买入,持有五个交易日,然后调仓。
添加了止损策略,过滤了停牌、退市、涨停股票。
```
'''
筛选出市值介于10-20亿的股票,选取其中市值最小的三只股票,
每天开盘买入,持有五个交易日,然后调仓。
'''
## 初始化函数,设定要操作的股票、基准等等
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# True为开启动态复权模式,使用真实价格交易
set_option('use_real_price', True)
# 设定成交量比例
# 通过选项 order_volume_ratio 设置每日最大的成交量。这里不会超过全天成交量
set_option('order_volume_ratio', 1)
# 股票类交易手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(open_tax=0, close_tax=0.001, \
open_commission=0.0003, close_commission=0.0003,\
close_today_commission=0, min_commission=5), type='stock')
# 持仓数量
g.stocknum = 3
# 交易日计时器
g.days = 0
# 调仓频率
g.refresh_rate = 5
# 运行函数
run_daily(trade, 'every_bar')
## 选出小市值股票
def check_stocks(context):
# 设定查询条件
q = query(
valuation.code,
valuation.market_cap
).filter(
valuation.market_cap.between(10,20)
).order_by(
valuation.market_cap.asc()
).limit(g.stocknum) #个数
# 选出低市值的股票,构成buylist
df = get_fundamentals(q)
buylist =list(df['code'])
# 过滤停牌股票
buylist = filter_paused_stock(buylist,True,False,True,True)
return buylist
## 交易函数
def trade(context):
if g.days%g.refresh_rate == 0:
## 选股
stock_list = check_stocks(context)
## 获取持仓列表
sell_list = list(context.portfolio.positions.keys())
# 如果持仓不在买入列表,则卖出
if len(sell_list) > 0 :
for stock in sell_list:
if stock not in stock_list:
order_target_value(stock, 0)
## 买入股票,每只票调整至g.stocknum分之一
for stock in stock_list:
if len(context.portfolio.positions.keys()) < g.stocknum:
order_target_value(stock, context.portfolio.total_value/g.stocknum)
g.days = 1
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.07:
order_target(stock, 0)
print("亏损 > 7%, 止损")
# 天计数加一
g.days += 1
# 过滤停牌股票
def filter_paused_stock(stock_list,del_paused,del_st,del_delist,del_hl):
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
```
2022-01-10