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

如何在 joinquant 中获取商品期货的历史 Tick 行情数据?

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

问题描述

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

Title: joinquant 期货高频交易:get_ticks 获取商品期货买卖一档 Tick 数据

Question: 如何在 joinquant 中获取商品期货的历史 Tick 行情数据?

解决方案

在聚宽(JoinQuant)平台中,可以通过使用 API 函数 get_ticks() 来获取商品期货及金融期货的历史 Tick 行情数据(支持 2010 年至今的数据)。

一、get_ticks 函数说明

语法

get_ticks(security, end_dt, start_dt=None, count=None, fields=['time', 'current', 'high', 'low', 'volume', 'money'], skip=True, df=False)

主要参数说明

  • security: 期货合约代码(例如 'AU1812.XSGE''RB2005.XSGE')。注意: Tick 接口需要使用具体合约代码,不支持直接传入主力合约或指数合约代码。若需获取主力合约 Tick,可结合 get_dominant_future() 先查询主力合约。
  • end_dt: 结束时间,格式如 '2018-07-03 15:30:00'
  • start_dt / count: 开始时间与数据条数,二选一输入。
  • fields: 获取的字段列表。期货 Tick 默认包含:time, current, open, high, low, volume, money, position(持仓量), a1_p, a1_v(卖一价量), b1_p, b1_v(买一价量)。
  • skip: 默认为 True,过滤无成交变化的 Tick;设为 False 则保留盘口变化的 Tick。
  • df: 默认为 False(返回 numpy.ndarray),设置为 True 时返回 pandas.DataFrame 格式。

二、代码示例

1. 研究环境中获取指定期货合约 Tick 数据(返回 DataFrame)

from jqdata import *

# 获取螺纹钢 RB1809 合约在指定时间段内的 Tick 数据
tick_df = get_ticks(
    security='RB1809.XSGE', 
    start_dt='2018-07-02 21:00:00', 
    end_dt='2018-07-03 09:15:00', 
    fields=['time', 'current', 'volume', 'position', 'a1_p', 'a1_v', 'b1_p', 'b1_v'],
    df=True
)
print(tick_df.head())

2. 结合主力合约动态获取最新 Tick

如果需要在策略运行中获取主力合约的 Tick 数据,可以按以下方式处理:

from jqdata import *

# 1. 获取当前品种的主力合约代码(例如黄金 AU)
dominant_symbol = get_dominant_future('AU', date='2018-07-02')

# 2. 根据主力合约获取 Tick 数据
ticks = get_ticks(dominant_symbol, end_dt='2018-07-02 23:00:00', count=10, df=True)
print(ticks)

3. Tick 级回测/模拟策略中的实时 Tick 监听

在运行频率为 tick 的策略中,可以使用 handle_tick 函数配合 get_current_ticksubscribe 监听盘口:

# 运行频率设置为 tick
def initialize(context):
    # 设定子账户为期货类型
    set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type='futures')])
    g.symbol = 'RB1909.XSGE'

def before_trading_start(context):
    # 订阅 Tick 事件
    subscribe(g.symbol, 'tick')

def handle_tick(context, tick):
    # 获取当前最新 Tick 数据
    current_tick = get_current_tick(g.symbol)
    if current_tick:
        log.info(f"最新价: {current_tick.current}, 买一价: {current_tick.b1_p}, 卖一价: {current_tick.a1_p}")

def after_trading_end(context):
    unsubscribe_all()

三、注意事项

  1. 真实价格模式:Tick 级回测与模拟必须开启动态复权/真实价格模式(set_option('use_real_price', True))。
  2. 一档盘口:期货 Tick 数据目前提供买一/卖一(b1_p/b1_v, a1_p/a1_v)数据,频次为 0.5 秒一次切片。
  3. 合约限制:不支持对 RB9999.XSGE(主力连续)或 RB8888.XSGE(品种指数)直接调用 get_ticks 或下单。