🚀 AI 一键生成 joinquant 策略代码

如何使用 JoinQuant API 获取期权 T- 型报价和历史 Tick 数据?

joinquant | 发布时间: 2025/12/3
以下内容由 EasyQuant 生成。

问题描述

如何获取期权的实时报价和历史数据?

解决方案

在聚宽(JoinQuant)平台上,获取期权的实时报价和历史数据主要依赖于数据获取函数 API。期权数据涵盖了上交所ETF期权、商品期权等。

以下是获取期权数据的具体方法和代码示例。

1. 获取期权合约代码

在获取数据前,通常需要先获取期权合约的代码。可以使用 get_all_securities 函数。

  • 函数get_all_securities(types=['options'], date=None)
  • 说明:获取指定日期仍在上市的期权合约列表。

2. 获取实时报价 (快照数据)

在回测和模拟交易中,“实时”指的是当前策略运行时间点的数据。

  • 函数get_current_tick(security)

  • 说明:获取最新的 Tick 数据(盘口快照)。对于期权,支持买五卖五数据(上交所ETF期权自2017年起,商品期权自2019-12-02起)。

  • 返回:包含最新价 (current)、买卖五档量价 (a1_v~a5_v, b1_p~b5_p) 等信息的对象。

  • 函数get_current_data()

  • 说明:获取当前单位时间(天/分钟)的快照,如涨跌停价、开盘价、是否停牌等。

3. 获取历史数据 (K线与Tick)

历史 K 线数据

  • 函数get_price(security, ...)get_bars(security, ...)
  • 说明:获取分钟级或日级的历史行情(开高低收、成交量、持仓量等)。
  • 注意:期权的 open_interest 字段代表持仓量。

历史 Tick 数据

  • 函数get_ticks(security, ...)
  • 说明:获取历史的高频 Tick 数据。
  • 字段:包含时间、最新价、持仓量、买卖五档盘口等。

4. 策略代码示例

以下是一个完整的策略代码示例,展示了如何在策略初始化时获取期权列表,并在盘中获取特定期权的实时 Tick 数据和历史 K 线数据。

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

def initialize(context):
    # 设置基准,这里使用50ETF
    set_benchmark('510050.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 过滤掉order系列API产生的比error级别低的log
    log.set_level('order', 'error')
    
    # 设定一个全局变量,用于存储要观察的期权代码
    # 这里为了演示,我们在开盘前动态获取一个上市的期权合约
    run_daily(before_market_open, time='before_open')
    # 盘中运行,获取数据
    run_daily(market_open, time='every_bar')

def before_market_open(context):
    # 获取当前日期所有上市的期权合约
    # types=['options'] 指定获取期权
    options_df = get_all_securities(types=['options'], date=context.current_dt)
    
    if not options_df.empty:
        # 为了演示,我们随机选取列表中的第一个期权合约
        g.target_option = options_df.index[0]
        # 获取该期权的详细信息(如名称、上市日期等)
        info = get_security_info(g.target_option)
        log.info(f"今日观察期权: {g.target_option}, 名称: {info.display_name}")
    else:
        g.target_option = None
        log.warn("当前日期无上市期权合约")

def market_open(context):
    if g.target_option is None:
        return
        
    security = g.target_option
    
    # -------------------------------------------------------
    # 1. 获取实时报价 (Tick快照)
    # -------------------------------------------------------
    # get_current_tick 获取最新的tick数据,包含盘口信息
    current_tick = get_current_tick(security)
    
    if current_tick:
        log.info(f"【实时Tick】代码:{current_tick.code}, 时间:{current_tick.datetime}, "
                 f"最新价:{current_tick.current}, 持仓量:{current_tick.position}")
        # 打印买一价和卖一价
        # 注意:期权支持五档盘口,可以通过 current_tick.a1_p 到 a5_p 获取
        log.info(f"买一价:{current_tick.b1_p}, 卖一价:{current_tick.a1_p}")

    # -------------------------------------------------------
    # 2. 获取历史 K 线数据 (Bar)
    # -------------------------------------------------------
    # 获取过去5分钟的分钟线数据,包含持仓量(open_interest)
    # fields中 'open_interest' 是期权/期货特有的字段
    bars = get_price(security, count=5, frequency='1m', 
                     fields=['close', 'volume', 'open_interest'])
    
    log.info(f"【历史K线】\n{bars}")

    # -------------------------------------------------------
    # 3. 获取历史 Tick 数据
    # -------------------------------------------------------
    # 获取当前时刻前1分钟内的历史Tick数据
    # 注意:get_ticks 返回的是列表或numpy array,df=True返回DataFrame
    end_time = context.current_dt
    start_time = end_time - datetime.timedelta(minutes=1)
    
    ticks = get_ticks(security, start_dt=start_time, end_dt=end_time, df=True)
    
    if not ticks.empty:
        log.info(f"【历史Tick】过去1分钟Tick数量: {len(ticks)}")
        # 打印最近一条历史tick的 current 价格
        log.info(f"最近一条历史Tick价格: {ticks.iloc[-1]['current']}")

常见问题 Q&A

Q: get_price 获取期权数据时,open_interest 字段代表什么?
A: 对于期权和期货,open_interest 代表持仓量(未平仓合约数)。股票数据中该字段通常无意义或为0。

Q: 为什么我使用 get_ticks 获取不到期权数据?
A: 请检查回测的时间段。上交所ETF期权支持 2017-01-01 至今的 Tick 数据,商品期权支持 2019-12-02 至今的数据。如果在这些日期之前查询,将无法获取数据。

Q: 如何筛选特定的期权,比如“50ETF购9月3000”?
A: 您需要先获取所有期权列表 (get_all_securities),然后结合 get_security_info 获取期权的简称 (display_name) 或底层标的,通过字符串匹配来筛选出您需要的特定合约。

Q: 模拟交易中获取的数据是实时的吗?
A: 是的。在聚宽官网的模拟交易中,get_current_tickget_current_data 返回的是交易所实时的行情数据。在回测中,这些函数返回的是回测时间点对应的历史快照数据。