3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)量化交易平台中,Tick 级别策略能够帮助交易者捕捉盘中秒级甚至毫秒级的高频行情变化。本文将详细介绍如何在 JoinQuant 中设置 Tick 回测环境、订阅行情及使用回调函数编写完整的 Tick 策略。
编写 Tick 策略主要依赖以下几个专用函数:
subscribe(security, frequency='tick'):订阅指定标的的 Tick 事件。必须在开盘前或初始化时调用。unsubscribe_all():取消所有标的的 Tick 事件订阅。handle_tick(context, tick):Tick 级别的核心事件回调函数。每当已订阅的标的产生新的 Tick 快照时,系统会自动触发此函数。get_current_tick(security):在策略运行中获取指定标的最新的 Tick 快照数据(包含最新价、一档/五档买卖盘口等)。注意事项:
- Tick 策略回测必须开启动态复权模式:
set_option('use_real_price', True)。handle_data与run_daily(..., time='every_bar')在 Tick 策略频率下不会被调用。
initialize):设置基准、开启真实价格模式,并根据交易品种配置子账户(如期货需配置 type='futures')。before_trading_start / run_daily): 调用 subscribe 订阅需要监听的股票或期货合约。handle_tick): 在行情到来时分析 tick 对象的盘口与价格信息,触发下单函数 (order, order_target)。after_trading_end): 调用 unsubscribe_all() 清理订阅,准备进入下一个交易日。以下是一个在 JoinQuant 运行的商品期货(螺纹钢主力合约)Tick 级别策略示例:
# 导入聚宽数据库
import jqdata
def initialize(context):
# 设定基准
set_benchmark('000300.XSHG')
# 开启真实价格模式(Tick 策略必须)
set_option('use_real_price', True)
# 获取初始资金并设置期货账户
init_cash = context.portfolio.starting_cash
set_subportfolios([SubPortfolioConfig(cash=init_cash, type='futures')])
# 保存要交易的期货品种代码(如螺纹钢主力合约)
g.symbol = 'RB9999.XSGE'
# 设置定时任务:开盘前订阅,收盘后取消订阅
run_daily(before_market_open, time='08:30', reference_security=g.symbol)
run_daily(after_market_close, time='15:30', reference_security=g.symbol)
def before_market_open(context):
# 获取当前实际主力合约代码
g.dominant_future = get_dominant_future('RB', context.current_dt)
# 订阅该合约的 Tick 事件
subscribe(g.dominant_future, 'tick')
log.info(f"成功订阅合约 Tick 行情: {g.dominant_future}")
def handle_tick(context, tick):
"""
每当有新的 Tick 产生时触发此函数
tick 对象包含: code, datetime, current, a1_p, a1_v, b1_p, b1_v, volume 等属性
"""
# 仅处理我们订阅的合约
if tick.code != g.dominant_future:
return
# 获取盘口数据
ask_price = tick.a1_p # 卖一价
bid_price = tick.b1_p # 买一价
current_price = tick.current # 最新成交价
# 获取当前持仓
position = context.subportfolios[0].long_positions.get(g.dominant_future, None)
current_amount = position.total_amount if position else 0
# 简单高频逻辑示例:买一卖一价差放大且无持仓时开多单
if current_amount == 0 and (ask_price - bid_price) >= 2:
log.info(f"触发开仓条件:买一 {bid_price}, 卖一 {ask_price}, 最新价 {current_price}")
order(g.dominant_future, 1, side='long', pindex=0)
# 有持仓时,判断微小止盈/止损
elif current_amount > 0:
cost_price = position.hold_cost
if current_price >= cost_price + 5 or current_price <= cost_price - 3:
log.info(f"触发平仓条件:持仓成本 {cost_price}, 当前价 {current_price}")
order(g.dominant_future, -1, side='long', pindex=0)
def after_market_close(context):
# 收盘后取消所有 Tick 订阅
unsubscribe_all()
log.info("已取消所有 Tick 订阅")
在 handle_tick(context, tick) 中接收到的 tick 对象包含如下常用字段:
| 属性名 | 类型 | 说明 |
|---|---|---|
code |
str | 标的代码(如 '000001.XSHE' 或 'RB2010.XSGE') |
datetime |
datetime | Tick 产生的时间戳 |
current |
float | 最新成交价 |
open / high / low |
float | 当日开盘价 / 最高价 / 最低价 |
volume |
float | 当日累计成交量 |
money |
float | 当日累计成交额 |
a1_p ~ a5_p |
float | 卖一至卖五价格(期货仅提供卖一) |
a1_v ~ a5_v |
float | 卖一至卖五挂单量(期货仅提供卖一) |
b1_p ~ b5_p |
float | 买一至买五价格(期货仅提供买一) |
b1_v ~ b5_v |
float | 买一至买五挂单量(期货仅提供买一) |
通过掌握 subscribe 和 handle_tick 的结合使用,开发者即可在 JoinQuant 平台上高效构建基于盘口挂单量分析、微观结构量价及秒级动量的 Tick 级交易策略。