'''
股票在当日收盘30分钟内涨幅达到9.5%~9.9%时间段,进行买入操作,在第二天开盘卖出
需要注意的是,该策略需要按分钟进行回测
'''
import jqdata
def initialize(context):
"""初始化函数"""
# 开启动态复权模式
set_option('use_real_price', True)
# 每天买入股票数量
g.daily_buy_count = 5
# 设置要操作的股票池,这里选择计算机信息技术相关板块
g.stocks = get_industry_stocks('I64') + get_industry_stocks('I65')
# 去年重复的代码
g.stocks = set(g.stocks)
# 每天早上开盘时执行
run_daily(morning_sell_all, 'open')
def morning_sell_all(context):
"""每天早上开盘时执行函数"""
for security in context.portfolio.positions:
# 全部卖出
order_target(security, 0)
# 记录这次卖出
log.info('卖出股票 %s' % (security))
def before_trading_start(context):
"""开始交易前被调用函数"""
# 今天已经买入的股票
g.today_bought_stocks = set()
# 得到所有股票昨日收盘价,每天只需要取一次,所以放在before_trading_start中
g.last_df = history(1, '1d', 'close', g.stocks)
def handle_data(context, data):
"""单位时间调用的函数,在每分钟的第一秒运行,data是上一分钟的切片数据"""
# 判断是否在当日最后的2小时,这里只追涨最后2小时满足条件的股票
if context.current_dt.hour < 15 and context.current_dt.minute < 30:
return
# 每天只买这么多只
if len(g.today_bought_stocks) >= g.daily_buy_count:
return
# 只遍历今天还没有买入的股票
for security in (g.stocks - g.today_bought_stocks):
# 得当当前价格
price = data[security].close
# 获取这只股票昨天收盘价
last_close = g.last_df[security][0]
# 如果上一时间点价格已经涨了9.5%~9.9%
# 今天的涨停价格区间大于1元,今天没有买入该只股票
if price/last_close > 1.095 \
and price/last_close < 1.099 \
and data[security].high_limit - last_close >= 1.0:
# 得到当前资金余额
cash = context.portfolio.cash
# 计算今天还需要买入的股票数量
need_count = g.daily_buy_count - len(g.today_bought_stocks)
# 把现金分成几价
buy_cash = cash/need_count
# 买入这么多现金的股票
order_value(security, buy_cash)
# 放入今天已买股票的集合
g.today_bought_stocks.add(security)
# 记录这次买入
log.info('买入股票 %s' % (security))
# 买够5只之后就不再买入
if len(g.today_bought_stocks) >= g.daily_buy_count:
break
回测结果:
注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!