问题描述
解决方案
在聚宽(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_tick 和 get_current_data 返回的是交易所实时的行情数据。在回测中,这些函数返回的是回测时间点对应的历史快照数据。