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

在聚宽(JoinQuant)中如何使用 get_current_tick 获取最新盘口快照数据?

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

问题描述

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

Title: joinquant 获取最新 Tick 数据:get_current_tick 接口教程

Question: 在聚宽的 tick 级策略中,如何使用 get_current_tick 获取最新的盘口快照数据?

解决方案

在聚宽(JoinQuant)量化交易平台中,get_current_tick 是一个非常核心的回测与模拟专用 API。它允许策略在运行过程中,实时获取指定标的最近一次的 Tick 快照数据(包含最新价、累计成交量、买卖盘口等)。

以下是关于 get_current_tick 接口的详细使用指南、参数说明及完整的策略代码示例。


一、接口定义与参数说明

1. 接口原型

get_current_tick(security, dt=None, df=False)

2. 参数解析

  • security (str | list): 标的代码(如 '000001.XSHE')或包含多个标的代码的列表。支持股票、场内基金、商品期货和股指期货。注意:期货需要使用具体合约代码,不能使用主力合约(如 RB9999)或指数合约代码。
  • dt (datetime, 可选): 指定的时刻。传入时代表返回离该指定时刻最近的一条 tick。默认为 None,表示当前逻辑时间。
  • df (bool, 可选): 默认为 False,返回 Tick 对象;设为 True 时,返回 pandas.DataFrame 格式的数据。

3. 返回值说明

  • 如果传入单个标的代码,默认返回一个 Tick 对象
  • 如果传入标的代码列表,返回一个 dict,其中 key 是标的代码,value 是对应的 Tick 对象。
  • 如果 df=True,则返回 DataFrame 格式数据。

4. Tick 对象常用属性

获取到 Tick 对象后,您可以通过属性访问盘口快照信息:

  • current: 最新价
  • high / low: 截至当前时刻的日内最高价 / 最低价
  • volume / money: 截至当前时刻的累计成交量 / 成交额
  • a1_v ~ a5_v / a1_p ~ a5_p: 卖一到卖五的挂单量与挂单价(期货仅提供一档)
  • b1_v ~ b5_v / b1_p ~ b5_p: 买一到买五的挂单量与挂单价(期货仅提供一档)

二、核心注意事项(避坑指南)

  1. 环境限制:该接口为回测环境/模拟盘专用 API,不支持在投资研究(Notebook)模块中直接调用。
  2. 依赖上下文:必须在 run_dailyhandle_datahandle_tick 等策略运行函数中调用。
  3. 空值处理:如果当天截至当前时刻该标的尚未产生任何 tick,接口将返回 None,编写策略时需做好空值判断。
  4. 真实价格模式:在进行 Tick 级回测或模拟时,强烈建议initialize 中开启真实价格模式:set_option('use_real_price', True)

三、完整策略源码示例

以下是一个在 Tick 级策略中订阅股票并实时获取最新盘口快照的完整示例:

# -*- coding: utf-8 -*-
import jqdata

def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启真实价格模式(Tick级策略必须开启)
    set_option('use_real_price', True)
    
    # 设置佣金与印花税
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    # 定义需要操作的股票
    g.security = '000001.XSHE' # 平安银行

def before_trading_start(context):
    # 订阅标的的 tick 事件
    subscribe(g.security, 'tick')
    log.info("已订阅 %s 的 Tick 数据" % g.security)

def handle_tick(context, tick):
    # 获取当前标的的最新 tick 快照
    tick_data = get_current_tick(g.security)
    
    if tick_data is not None:
        # 打印盘口五档买卖单信息
        log.info("时间: %s, 最新价: %s" % (tick_data.datetime, tick_data.current))
        log.info("买一价: %s, 买一量: %s" % (tick_data.b1_p, tick_data.b1_v))
        log.info("卖一价: %s, 卖一量: %s" % (tick_data.a1_p, tick_data.a1_v))
        
        # 简单的盘口交易逻辑示例:若买一挂单量远大于卖一挂单量,尝试买入
        if tick_data.b1_v > tick_data.a1_v * 3 and g.security not in context.portfolio.positions:
            log.info("买盘力量强劲,尝试市价买入 100 股")
            order(g.security, 100)
    else:
        log.warn("未能获取到 %s 的当前 Tick 数据" % g.security)

def after_trading_end(context):
    # 收盘后取消订阅,释放资源
    unsubscribe_all()
    log.info("已取消所有 Tick 订阅")"))