获取期权数据

获取指定期权标的对应的期权品种列表

为了获取与指定期权标的相关的期权品种列表,你需要使用此函数操作。根据你的需求,这个过程将需要输入期权标的(如某个公司的股票代码)作为参数,接下来,该函数将返回所有与此期权标的相关的期权品种信息。这样的功能使投资者能够对期权市场有更详尽、全面的掌握,从而做出更科学、合理的投资决策。

方式1:内置python

调用方法

#encoding:gbk
def init(ContextInfo):
  pass

def after_init(ContextInfo):
  data=ContextInfo.get_option_undl_data(undl_code_ref)

参数

字段类型说明
undl_code_refstring期权标的代码
  • undl_code_ref:期权标的代码,如'510300.SH',传空字符串时获取全部标的数据

返回

提示

  • 指定期权标的返回的是 列表类型
  • 期权标的为空字符串返回的是 字典类型
#encoding:gbk

def init(ContextInfo):
	ContextInfo.etf_code = "510050.SH"
	
def after_init(ContextInfo):
	data=ContextInfo.get_option_undl_data('510300.SH')
	print(data)

方式2:原生python

调用方法

from xtquant import xtdata
xtdata.get_option_undl_data(undl_code_ref)

参数

字段类型说明
undl_code_refstring期权标的代码
  • undl_code_ref:期权标的代码,如'510300.SH',传空字符串时获取全部标的数据

返回

提示

  • 指定期权标的返回的是 列表类型
  • 期权标的为空字符串返回的是 字典类型
from xtquant import xtdata
print(xtdata.get_option_undl_data("510300.SH"))

获取历史期权列表

函数能帮助用户获取历史期权列表, 包括某日历史在上交所上市的认购合约和认沽合约, 也包括已经退市的合约。通过这一函数, 投资者可以回溯和分析不同类型合约的历史行为, 对市场变化有更全面的理解, 从而制定出更为稳健和有效的投资策略。

方式1:内置python

调用方法

#encoding:gbk
def init(ContextInfo):
  pass

def after_init(ContextInfo):
  ContextInfo.get_option_list(undl_code,dedate,opttype,isavailable)

参数

字段类型说明
undl_codstr期权标的代码
dedatestr期权到期月或当前交易日期,"YYYYMM"格式为期权到期月,"YYYYMMDD"格式为获取当前日期交易的期权
opttypestr期权类型,默认值为空,"CALL","PUT",为空时认购认沽都取
isavailablebool是否可交易,当dedate的格式为"YYYYMMDD"格式为获取当前日期交易的期权时,isavailable为True时返回当前可用,为False时返回当前和历史可用

返回

  • 期权合约列表list

提示

获取历史期权需要下载过期合约列表

#encoding:gbk

'''获取到期月份为202101的上交所510300ETF认购合约 '''

def init(ContextInfo):
  pass

def after_init(ContextInfo):
  # 获取到期月份为202101的上交所510300ETF认购合约
  data=ContextInfo.get_option_list('510300.SH','202101',"CALL")

  # 获取20210104当天上交所510300ETF可交易的认购合约
  #data=ContextInfo.get_option_list('510300.SH','20210104',"CALL",True)

  #获取20210104当天上交所510300ETF已经上市的认购合约(包括退市)
  #data=ContextInfo.get_option_list('510300.SH','20210104',"CALL",False)

  print(data)

方式2:原生python

调用方法

from xtquant import xtdata
xtdata.get_option_list(undl_code,dedate,opttype,isavailable)

参数

字段类型说明
undl_codstr期权标的代码
dedatestr期权到期月或当前交易日期,"YYYYMM"格式为期权到期月,"YYYYMMDD"格式为获取当前日期交易的期权
opttypestr期权类型,默认值为空,"CALL","PUT",为空时认购认沽都取
isavailablebool是否可交易,当dedate的格式为"YYYYMMDD"格式为获取当前日期交易的期权时,isavailable为True时返回当前可用,为False时返回当前和历史可用

返回

  • 期权合约列表list

提示

获取历史期权需要下载过期合约列表

from xtquant import xtdata

# 获取到期月份为202101的上交所510300ETF认购合约
data = xtdata.get_option_list('510300.SH','202101',"CALL")

# 获取20210104当天上交所510300ETF可交易的认购合约
#data=xtdata.get_option_list('510300.SH','20210104',"CALL",True)

#获取20210104当天上交所510300ETF已经上市的认购合约(包括退市)
#data=xtdata.get_option_list('510300.SH','20210104',"CALL",False)

print(data)

获取指定期权品种的详细信息

该函数能帮助用户获取指定期权品种的详细信息,如期权代码、市场、涨跌停价、期权行权价以及期权行权终止日等关键数据。通过使用此功能,投资者可以快速获取与特定期权品种有关的各项重要信息,更加清楚地理解该期权的具体状况,从而为投资决策提供准确的参考依据。

方法1:内置python

调用方法

#encoding:gbk
def init(ContextInfo):
  pass

def after_init(ContextInfo):
  ContextInfo.get_option_detail_data(optioncode)

参数

字段类型说明
optioncodestr期权代码

提示

当填写空字符串时候默认为当前主图的期权品种

返回

字典类型

字段类型说明
ExchangeIDstr期权市场代码
InstrumentIDstr期权代码
ProductIDstr期权标的的产品ID
OpenDate-发行日期
ExpireDate-到期日
PreClosefloat前收价格
SettlementPricefloat前结算价格
UpStopPricefloat当日涨停价
DownStopPricefloat当日跌停价
LongMarginRatiofloat多头保证金率
ShortMarginRatiofloat空头保证金率
PriceTickfloat最小变价单位
VolumeMultipleint合约乘数
MaxMarketOrderVolumeint涨跌停价最大下单量
MinMarketOrderVolumeint涨跌停价最小下单量
MaxLimitOrderVolumeint限价单最大下单量
MinLimitOrderVolumeint限价单最小下单量
OptUnitint期权合约单位
MarginUnitfloat期权单位保证金
OptUndlCodestr期权标的证券代码
OptUndlMarketstr期权标的证券市场
OptExercisePricefloat期权行权价
NeeqExeTypestr全国股转转让类型
OptUndlRiskFreeRatefloat期权标的无风险利率
OptUndlHistoryRatefloat期权标的历史波动率
EndDelivDate-期权行权终止日
optTypestr期权类型
#encoding:gbk
def init(ContextInfo):
  pass

def after_init(ContextInfo):
  print(ContextInfo.get_option_detail_data('10002235.SHO'))

方法2:原生python

调用方法

from xtquant import xtdata
xtdata.get_option_detail_data(optioncode)

参数

字段类型说明
optioncodestr期权代码

返回

字典类型

字段类型说明
ExchangeIDstr期权市场代码
InstrumentIDstr期权代码
ProductIDstr期权标的的产品ID
OpenDate-发行日期
ExpireDate-到期日
PreClosefloat前收价格
SettlementPricefloat前结算价格
UpStopPricefloat当日涨停价
DownStopPricefloat当日跌停价
LongMarginRatiofloat多头保证金率
ShortMarginRatiofloat空头保证金率
PriceTickfloat最小变价单位
VolumeMultipleint合约乘数
MaxMarketOrderVolumeint涨跌停价最大下单量
MinMarketOrderVolumeint涨跌停价最小下单量
MaxLimitOrderVolumeint限价单最大下单量
MinLimitOrderVolumeint限价单最小下单量
OptUnitint期权合约单位
MarginUnitfloat期权单位保证金
OptUndlCodestr期权标的证券代码
OptUndlMarketstr期权标的证券市场
OptExercisePricefloat期权行权价
NeeqExeTypestr全国股转转让类型
OptUndlRiskFreeRatefloat期权标的无风险利率
OptUndlHistoryRatefloat期权标的历史波动率
EndDelivDate-期权行权终止日
optTypestr期权类型
from xtquant import xtdata
print(xtdata.get_option_detail_data('10002235.SHO'))

基于BS模型计算欧式期权理论价格

基于Black-Scholes-Merton模型,输入期权标的价格、期权行权价、无风险利率、期权标的年化波动率、剩余天数、标的分红率、计算期权的理论价格

方法1:内置python

调用方法

#encoding:gbk
def init(ContextInfo):
  pass

def after_init(ContextInfo):
  ContextInfo.bsm_price(optionType,objectPrices,strikePrice,riskFree,sigma,days,dividend)

参数

字段类型说明
optionTypestr期权类型,认购:'C',认沽:'P'
objectPricesfloat期权标的价格,可以是价格列表或者单个价格
strikePricefloat期权行权价
riskFreefloat无风险收益率
sigmafloat标的波动率
daysint剩余天数
dividendfloat分红率

返回

提示

  • objectPrices为float时,返回float
  • objectPrices为list时,返回list
  • 计算结果最小值0.0001,结果保留4位小数,输入非法参数返回nan
#encoding:gbk
import numpy as np


def init(ContextInfo):
  pass

def after_init(ContextInfo):
  object_prices=list(np.arange(3,4,0.01));
  #计算剩余15天的行权价3.5的认购期权,在无风险利率3%,分红率为0,标的年化波动率为23%时标的价格从3元到4元变动过程中期权理论价格序列
  prices=ContextInfo.bsm_price('C',object_prices,3.5,0.03,0.23,15,0)
  print(prices)
  #计算剩余15天的行权价3.5的认购期权,在无风险利率3%,分红率为0,标的年化波动率为23%时标的价格为3.51元的平值期权的理论价格
  price=ContextInfo.bsm_price('C',3.51,3.5,0.03,0.23,15,0)
  print(price)

基于BS模型计算欧式期权隐含波动率

基于Black-Scholes-Merton模型,输入期权标的价格、期权行权价、期权现价、无风险利率、剩余天数、标的分红率,计算期权的隐含波动率

方法1:内置python

调用方法

#encoding:gbk
def init(ContextInfo):
    pass

def after_init(ContextInfo):
    ContextInfo.bsm_iv(optionType,objectPrices,strikePrice,optionPrice,riskFree,days,dividend)

参数

字段类型说明
optionTypestr期权类型,认购:'C',认沽:'P'
objectPricesfloat期权标的价格,可以是价格列表或者单个价格
strikePricefloat期权行权价
riskFreefloat无风险收益率
sigmafloat标的波动率
daysint剩余天数
dividendfloat分红率

返回

double

#encoding:gbk
import numpy as np

def init(ContextInfo):
    pass

def after_init(ContextInfo):
    # 计算剩余15天的行权价3.5的认购期权,在无风险利率3%,分红率为0时,标的现价3.51元,期权价格0.0725元时的隐含波动率
    iv=ContextInfo.bsm_iv('C',3.51,3.5,0.0725,0.03,15)
    print(iv)

期权行情数据

获取期权行情数据

获取期权最新数据,首先需要进行数据订阅。完成合约订阅后,用get_market_data_ex函数即可提取相关信息。这个过程包含两大步骤:第一,通过订阅操作确保能接收到你感兴趣的期权合约的更新;第二,调用get_market_data_ex函数来实际获取并处理这些订阅到的数据,如果需要用到历史数据或过期合约数据,需要使用download_history_data进行下载。这样,使用者就能获得最新和详细的期权数据,有助于做出更精准的投资决策。

调用方法

# coding=utf-8
from xtquant import xtdata
# 下载指定合约历史行情
xtdata.download_history_data(stock_code, period, start_time='', end_time='')
# 订阅指定合约行情
xtdata.subscribe_quote(stock_code, period='', start_time='', end_time='', count=0, callback=None)
# 等待订阅完成
time.sleep(1)  
# 获取指定合约行情
xtdata.get_market_data_ex(field_list = [], stock_list = [], period = '', start_time = '', end_time = '', count = -1, dividend_type = 'none', fill_data = True)

参数

  • xtdata.subscribe_quote
字段类型说明
stock_codestr股票代码
start_timestr开始时间格式YYYYMMDD/YYYYMMDDhhmmss
end_timestr结束时间
countint数量 -1全部/n: 从结束时间向前数n个
periodstr周期 分笔"tick" 分钟线"1m"/"5m" 日线"1d"
  • xtdata.get_market_data_ex
参数名称类型描述
field_listlist表示所有字段。不同的数据周期,取值范围有所不同。
stock_listlist合约代码列表
periodstr数据周期,默认是当前主图周期。可选值如下: 'tick' (分笔线), '1d' (日线), '1m' (1分钟线), '5m' (5分钟线), '15m' (15分钟线), 'l2quote' (Level2行情快照), 'l2quoteaux' (Level2行情快照补充), 'l2order' (Level2逐笔委托), 'l2transaction' (Level2逐笔成交),'l2transactioncount' (Level2大单统计), 'l2orderqueue' (Level2委买委卖队列)
start_timestr开始时间。为空时默认为最早时间。时间格式为'20201231'或'20201231093000'
end_timestr结束时间。为空时默认为最新时间。时间格式为'20201231'或'20201231235959'
countint数据最大个数。-1表示不做个数限制
dividend_typestr复权方式,默认是当前主图复权方式。可选值包括: 'none' (不复权), 'front'(前复权), 'back' (后复权), 'front_ratio' (等比前复权), 'back_ratio' (等比后复权)
fill_databool停牌填充方式

返回值

  • period为1m 5m 1dK线周期时
    • 返回dict { field1 : value1, field2 : value2, ... }
    • value1, value2, ... :pd.DataFrame 数据集,index为stock_list,columns为time_list
    • 各字段对应的DataFrame维度相同、索引相同
  • period为tick分笔周期时
    • 返回dict { stock1 : value1, stock2 : value2, ... }
    • stock1, stock2, ... :合约代码
    • value1, value2, ... :np.ndarray 数据集,按数据时间戳time增序排列
# coding=utf-8
from xtquant import xtdata
# 订阅指定合约最新行情
xtdata.subscribe_quote('10005329.SHO', period='1d', start_time='', end_time='20231026150000', count=1, callback=None)
# 下载指定合约历史行情
xtdata.download_history_data('10005329.SHO',period = "1d") # ETF期权
xtdata.download_history_data('a2407-C-5200.DF',period = "1d") # 商品期货期权
xtdata.download_history_data('IO2312-C-3550.IF',period = "1d") # 股指期货期权
# 获取指定合约历史行情
day_data = xtdata.get_market_data_ex([], ['10005329.SHO'], period='1d', start_time='20230101', end_time='20231026', count=-1, dividend_type='front', fill_data=True)
print(day_data)

获取过期期权合约代码

注意

获取过期期权合约代码本质上是通过get_stock_list_in_sector()获取到过期板块内容,所以在使用前,请务必确保已经下载过历史合约信息

  1. 原生python:调用xtdata.download_history_contracts()进行下载

  2. 内置python:在界面端数据管理 - 过期合约数据 - 过期合约列表勾选下载,下载后需要重启客户端生效

内置python

调用方法

C.get_stock_list_in_sector(sector_name)

参数

字段类型说明
sector_namestring板块名称

返回值

  • list:内含成份股代码,代码形式为 'stockcode.market',如 '000002.SZ'

示例

#encoding:gbk

import re

def init(C):

  option_code_list1 = get_option_code(C,"IF",data_type = 0) # 获取中金所当前可交易期权合约

  option_code_list2 = get_option_code(C,"SHO",data_type = 1) # 获取上交所已退市可交易期权合约
  option_code_list3 = get_option_code(C,"IF",data_type = 2) # 获取 中金所 所有期权(包含历史)合约

  print(option_code_list1[:5])
  print("="*20)
  print(option_code_list2[:5])
  print("="*20)
  print(option_code_list3[:5])

  # 可通过C.get_option_detail_data()查看合约具体信息

def hanldbar(C):
  return

def get_option_code(C,market,data_type = 0):

    '''

    ToDo:取出指定market的期权合约

    Args:
        market: 目标市场,比如中金所填 IF 

    data_type: 返回数据范围,可返回已退市合约,默认仅返回当前

        0: 仅当前
        1: 仅历史
        2: 历史 + 当前
    
    '''
    _history_sector_dict = {
        "IF":"过期中金所",
        "SF":"过期上期所",
        "DF":"过期大商所",
        "ZF":"过期郑商所",
        "INE":"过期能源中心",
        "SHO":"过期上证期权",
        "SZO":"过期深证期权",
    }

    # _now_secotr_dict = {
    #     "IF":"中金所",
    #     "SF":"上期所",
    #     "DF":"大商所",
    #     "ZF":"郑商所",
    #     "INE":"能源中心",
    #     "SHO":"上证期权",
    #     "SZO":"深证期权",
    # }

    _sector = _history_sector_dict.get(market)
    # _now_sector = _now_secotr_dict.get(market)
    if _sector == None:
        raise KeyError(f"不存在该市场:{market}")
    _now_sector = _sector[2:]
    
    
    # 过期上证和过期深证有专门的板块,不需要处理
    if market == "SHO" or market == "SZO":
        if data_type == 0:
            _list = C.get_stock_list_in_sector(_now_sector)
        elif data_type == 1:
            _list = C.get_stock_list_in_sector(_sector)
        elif data_type == 2:
            _list = C.get_stock_list_in_sector(_sector) + C.get_stock_list_in_sector(_now_sector)
        else:
            raise KeyError(f"data_type参数错误:{data_type}")
        return _list
        
    # 期货期权需要额外处理
    if data_type == 0:
        all_list = C.get_stock_list_in_sector(_now_sector)
    elif data_type == 1:
        all_list = C.get_stock_list_in_sector(_sector)
    elif data_type == 2:
        all_list = C.get_stock_list_in_sector(_sector) + C.get_stock_list_in_sector(_now_sector)
    else:
        raise KeyError(f"data_type参数错误:{data_type}")
    
    _list = []
    pattern1 = r'^[A-Z]{2}\d{4}-[A-Z]-\d{4}\.[A-Z]+$'
    pattern2 = r'^[a-zA-Z]+\d+[a-zA-Z]\d+\.[A-Z]+$'
    pattern3 = r'^[a-zA-Z]+\d+-[a-zA-Z]-\d+\.[A-Z]+$'
    for i in all_list:
        if re.match(pattern1,i):
            _list.append(i)
        elif re.match(pattern2,i):
            _list.append(i)
        elif re.match(pattern3,i):
            _list.append(i)
    # _list =[i for i in all_list if re.match(pattern, i)]
    return _list


原生Python

调用方法

# coding=utf-8
from xtquant import xtdata
xtdata.get_stock_list_in_sector(sector_name)

参数

字段类型说明
sector_namestring板块名称

返回值

  • list:内含成份股代码,代码形式为 'stockcode.market',如 '000002.SZ'

示例

from xtquant import xtdata
import re


def get_option_code(market,data_type = 0):

    '''

    ToDo:取出指定market的期权合约

    Args:
        market: 目标市场,比如中金所填 IF 

    data_type: 返回数据范围,可返回已退市合约,默认仅返回当前

        0: 仅当前
        1: 仅历史
        2: 历史 + 当前
    
    '''
    _history_sector_dict = {
        "IF":"过期中金所",
        "SF":"过期上期所",
        "DF":"过期大商所",
        "ZF":"过期郑商所",
        "INE":"过期能源中心",
        "SHO":"过期上证期权",
        "SZO":"过期深证期权",
    }

    # _now_secotr_dict = {
    #     "IF":"中金所",
    #     "SF":"上期所",
    #     "DF":"大商所",
    #     "ZF":"郑商所",
    #     "INE":"能源中心",
    #     "SHO":"上证期权",
    #     "SZO":"深证期权",
    # }

    _sector = _history_sector_dict.get(market)
    # _now_sector = _now_secotr_dict.get(market)
    if _sector == None:
        raise KeyError(f"不存在该市场:{market}")
    _now_sector = _sector[2:]
    
    
    # 过期上证和过期深证有专门的板块,不需要处理
    if market == "SHO" or market == "SZO":
        if data_type == 0:
            _list = xtdata.get_stock_list_in_sector(_now_sector)
        elif data_type == 1:
            _list = xtdata.get_stock_list_in_sector(_sector)
        elif data_type == 2:
            _list = xtdata.get_stock_list_in_sector(_sector) + xtdata.get_stock_list_in_sector(_now_sector)
        else:
            raise KeyError(f"data_type参数错误:{data_type}")
        return _list
        
    # 期货期权需要额外处理
    if data_type == 0:
        all_list = xtdata.get_stock_list_in_sector(_now_sector)
    elif data_type == 1:
        all_list = xtdata.get_stock_list_in_sector(_sector)
    elif data_type == 2:
        all_list = xtdata.get_stock_list_in_sector(_sector) + xtdata.get_stock_list_in_sector(_now_sector)
    else:
        raise KeyError(f"data_type参数错误:{data_type}")
    
    _list = []
    pattern1 = r'^[A-Z]{2}\d{4}-[A-Z]-\d{4}\.[A-Z]+$'
    pattern2 = r'^[a-zA-Z]+\d+[a-zA-Z]\d+\.[A-Z]+$'
    pattern3 = r'^[a-zA-Z]+\d+-[a-zA-Z]-\d+\.[A-Z]+$'
    for i in all_list:
        if re.match(pattern1,i):
            _list.append(i)
        elif re.match(pattern2,i):
            _list.append(i)
        elif re.match(pattern3,i):
            _list.append(i)
    # _list =[i for i in all_list if re.match(pattern, i)]
    return _list


if __name__ == "__main__":
  xtdata.download_history_contracts() # 下载历史合约信息

  option_code_list1 = get_option_code("IF",data_type = 0) # 获取中金所当前可交易期权合约

  option_code_list2 = get_option_code("SHO",data_type = 1) # 获取上交所已退市可交易期权合约
  option_code_list3 = get_option_code("IF",data_type = 2) # 获取 中金所 所有期权(包含历史)合约

  print(option_code_list1[:5])
  print("="*20)
  print(option_code_list2[:5])
  print("="*20)
  print(option_code_list3[:5])

  # 可通过xtdata.get_option_detail_data()查看合约具体信息


获取期权全推数据

获取全推tick数据的函数是用户主动调用的工具。所谓"全推tick数据",指的是以tick(最小报价单位)为单位的实时市场数据,包括每一笔交易的信息,如成交金额、成交量、收盘价等。通过主动调用这个函数,用户能实时获得最新的市场动态,从而做出及时和准确的投资决策。

调用方法

# coding=utf-8
from xtquant import xtdata
xtdata.get_full_tick(code_list)

参数

字段类型说明
code_listlist合约列表
  • code_list:合约字符串格式, 例如 ['10005331.SHO', '10005332.SHO']

返回值

  • dict 数据集 { stock1 : tick1, stock2 : tick2, ... }, tick字段如下
字段类型说明
timetagstr时间
lastPricefloat最新价
openfloat开盘价
lowfloat最低价
amountfloat成交额
volumeint成交总量
pvolumeint原始成交总量
openIntint持仓量
stockStatusstr证券状态
lastClosefloat前收盘价
lastSettlementPricefloat前结算价
settlementPricefloat今结算价
askPricelist多档委卖价
bidPricelist多档委买价
askVollist多档委卖量
bidVollist多档委买量
# coding=utf-8
from xtquant import xtdata
ret_full_tick = xtdata.get_full_tick(['10005331.SHO'])
print(ret_full_tick)

期权VIX指数

VIX指数编制规则

其中:

σ:VIX/100即VIX=σ*100

T:到期时间

F:指数期权价格对应的远期指数水平

K0:低于F的第一个行权价

Ki:第i个虚值期权的行权价格;如果Ki > K0为看涨期权;如果Ki < K0为看跌期权;如果Ki=K0都选

∆Ki:行权价价格————Ki附近行权价差的一半(注:Ki为最低行权价时∆Ki是最低行权价和下一根行权价的差,类似的,∆Ki为最高行权价时,∆Ki是最好行权价和上一个行权价的差)

R:至到期日的无风险利率

Q(Ki):行权价为Ki的每个期权的bid-ask价差的中点

VIX指数合约代码规则

沪深VIX指数

名称VIX指数合约代码
深圳100ETFVIX159901VIX.SZO.VIX
创业板ETFVIX159915VIX.SZO.VIX
沪深300ETFVIX159919VIX.SZO.VIX
中证500ETFVIX159922VIX.SZO.VIX
50ETFVIX510050VIX.SHO.VIX
300ETFVIX510300VIX.SHO.VIX
500ETFVIX510500VIX.SHO.VIX
科创50VIX588000VIX.SHO.VIX
科创板50VIX588080VIX.SHO.VIX

获取VIX指数行情

上次更新:
邀请注册送VIP优惠券
分享下方的内容给好友、QQ群、微信群,好友注册您即可获得VIP优惠券
玩转qmt,上迅投qmt知识库