🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 平台如何编写 Tick 级别高频交易策略?(附 Python 源码与 handle_tick 详解)

joinquant | 发布时间: 2026/7/23
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 高频交易入门:Tick 级别策略订阅与 handle_tick 使用指南

Question: 如何在 joinquant 中编写 Tick 频率的量化交易策略?

解决方案

joinquant 平台 Tick 级别高频策略开发指南

在 JoinQuant(聚宽)量化交易平台中,Tick 级别策略能够帮助交易者捕捉盘中秒级甚至毫秒级的高频行情变化。本文将详细介绍如何在 JoinQuant 中设置 Tick 回测环境、订阅行情及使用回调函数编写完整的 Tick 策略。


1. Tick 策略核心 API 介绍

编写 Tick 策略主要依赖以下几个专用函数:

  • subscribe(security, frequency='tick'):订阅指定标的的 Tick 事件。必须在开盘前或初始化时调用。
  • unsubscribe_all():取消所有标的的 Tick 事件订阅。
  • handle_tick(context, tick):Tick 级别的核心事件回调函数。每当已订阅的标的产生新的 Tick 快照时,系统会自动触发此函数。
  • get_current_tick(security):在策略运行中获取指定标的最新的 Tick 快照数据(包含最新价、一档/五档买卖盘口等)。

注意事项

  1. Tick 策略回测必须开启动态复权模式set_option('use_real_price', True)
  2. handle_datarun_daily(..., time='every_bar') 在 Tick 策略频率下不会被调用。

2. Tick 策略核心运行流程

  1. 初始化账户与环境 (initialize):设置基准、开启真实价格模式,并根据交易品种配置子账户(如期货需配置 type='futures')。
  2. 开盘前订阅 (before_trading_start / run_daily): 调用 subscribe 订阅需要监听的股票或期货合约。
  3. 事件响应与下单 (handle_tick): 在行情到来时分析 tick 对象的盘口与价格信息,触发下单函数 (order, order_target)。
  4. 收盘后清理 (after_trading_end): 调用 unsubscribe_all() 清理订阅,准备进入下一个交易日。

3. 完整代码示例:商品期货 Tick 级策略

以下是一个在 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 订阅")

4. 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 买一至买五挂单量(期货仅提供买一)

通过掌握 subscribehandle_tick 的结合使用,开发者即可在 JoinQuant 平台上高效构建基于盘口挂单量分析、微观结构量价及秒级动量的 Tick 级交易策略。