QMT期权实盘交易所需数据获取方法
获取期权数据
获取指定期权标的对应的期权品种列表
为了获取与指定期权标的相关的期权品种列表,可以使用以下函数操作。该函数需要输入期权标的(ETF标的代码)作为参数,并返回所有与此期权标的相关的期权品种信息。
调用方法
#encoding:gbk
def init(ContextInfo):
pass
def after_init(ContextInfo):
data = ContextInfo.get_option_undl_data(undl_code_ref)
参数
字段 | 类型 | 说明 |
---|---|---|
undl_code_ref | string | 期权标的代码,如’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)
获取历史期权列表
该函数帮助用户获取历史期权列表,包括某日历史在上交所上市的认购合约和认沽合约,也包括已经退市的合约。
调用方法
#encoding:gbk
def init(ContextInfo):
pass
def after_init(ContextInfo):
ContextInfo.get_option_list(undl_code, dedate, opttype, isavailable)
参数
字段 | 类型 | 说明 |
---|---|---|
undl_code | str | 期权标的代码 |
dedate | str | 期权到期月或当前交易日期,”YYYYMM”格式为期权到期月,”YYYYMMDD”格式为获取当前日期交易的期权 |
opttype | str | 期权类型,默认值为空,”CALL”,”PUT”,为空时认购认沽都取 |
isavailable | bool | 是否可交易,当dedate的格式为”YYYYMMDD”格式为获取当前日期交易的期权时,isavailable为True时返回当前可用,为False时返回当前和历史可用 |
返回
- 期权合约列表
list
提示
获取历史期权需要下载过期合约列表。
示例返回值
#encoding:gbk
def init(ContextInfo):
pass
def after_init(ContextInfo):
# 获取到期月份为202101的上交所510300ETF认购合约
data = ContextInfo.get_option_list('510300.SH', '202101', "CALL")
print(data)
获取指定期权品种的详细信息
该函数帮助用户获取指定期权品种的详细信息,如期权代码、市场、涨跌停价、期权行权价以及期权行权终止日等关键数据。
调用方法
#encoding:gbk
def init(ContextInfo):
pass
def after_init(ContextInfo):
ContextInfo.get_option_detail_data(optioncode)
参数
字段 | 类型 | 说明 |
---|---|---|
optioncode | str | 期权代码 |
提示
当填写空字符串时默认为当前主图的期权品种。
返回
- 字典类型
字段 | 类型 | 说明 |
---|---|---|
ExchangeID | str | 期权市场代码 |
InstrumentID | str | 期权代码 |
ProductID | str | 期权标的的产品ID |
OpenDate | - | 发行日期 |
ExpireDate | - | 到期日 |
PreClose | float | 前收价格 |
SettlementPrice | float | 前结算价格 |
UpStopPrice | float | 当日涨停价 |
DownStopPrice | float | 当日跌停价 |
LongMarginRatio | float | 多头保证金率 |
ShortMarginRatio | float | 空头保证金率 |
PriceTick | float | 最小变价单位 |
VolumeMultiple | int | 合约乘数 |
MaxMarketOrderVolume | int | 涨跌停价最大下单量 |
MinMarketOrderVolume | int | 涨跌停价最小下单量 |
MaxLimitOrderVolume | int | 限价单最大下单量 |
MinLimitOrderVolume | int | 限价单最小下单量 |
OptUnit | int | 期权合约单位 |
MarginUnit | float | 期权单位保证金 |
OptUndlCode | str | 期权标的证券代码 |
OptUndlMarket | str | 期权标的证券市场 |
OptExercisePrice | float | 期权行权价 |
NeeqExeType | str | 全国股转转让类型 |
OptUndlRiskFreeRate | float | 期权标的无风险利率 |
OptUndlHistoryRate | float | 期权标的历史波动率 |
EndDelivDate | - | 期权行权终止日 |
optType | str | 期权类型 |
示例返回值
#encoding:gbk
def init(ContextInfo):
pass
def after_init(ContextInfo):
print(ContextInfo.get_option_detail_data('10002235.SHO'))
基于BS模型计算欧式期权理论价格
基于Black-Scholes-Merton模型,输入期权标的价格、期权行权价、无风险利率、期权标的年化波动率、剩余天数、标的分红率,计算期权的理论价格。
调用方法
#encoding:gbk
def init(ContextInfo):
pass
def after_init(ContextInfo):
ContextInfo.bsm_price(optionType, objectPrices, strikePrice, riskFree, sigma, days, dividend)
参数
字段 | 类型 | 说明 |
---|---|---|
optionType | str | 期权类型,认购:’C’,认沽:’P’ |
objectPrices | float | 期权标的价格,可以是价格列表或者单个价格 |
strikePrice | float | 期权行权价 |
riskFree | float | 无风险收益率 |
sigma | float | 标的波动率 |
days | int | 剩余天数 |
dividend | float | 分红率 |
返回
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)
基于BS模型计算欧式期权隐含波动率
基于Black-Scholes-Merton模型,输入期权标的价格、期权行权价、期权现价、无风险利率、剩余天数、标的分红率,计算期权的隐含波动率。
调用方法
#encoding:gbk
def init(ContextInfo):
pass
def after_init(ContextInfo):
ContextInfo.bsm_iv(optionType, objectPrices, strikePrice, optionPrice, riskFree, days, dividend)
参数
字段 | 类型 | 说明 |
---|---|---|
optionType | str | 期权类型,认购:’C’,认沽:’P’ |
objectPrices | float | 期权标的价格,可以是价格列表或者单个价格 |
strikePrice | float | 期权行权价 |
optionPrice | float | 期权现价 |
riskFree | float | 无风险收益率 |
days | int | 剩余天数 |
dividend | float | 分红率 |
返回
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_stock_list_in_sector()
获取到过期板块内容,所以在使用前,请务必确保已经下载过历史合约信息。
调用方法
#encoding:gbk
def init(C):
pass
def after_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])
def get_option_code(C, market, data_type=0):
_history_sector_dict = {
"IF": "过期中金所",
"SF": "过期上期所",
"DF": "过期大商所",
"ZF": "过期郑商所",
"INE": "过期能源中心",
"SHO": "过期上证期权",
"SZO": "过期深证期权",
}
_sector = _history_sector_dict.get(market)
if _sector is 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)
return _list
获取期权全推数据
获取全推tick数据的函数是用户主动调用的工具。所谓”全推tick数据”,指的是以tick(最小报价单位)为单位的实时市场数据,包括每一笔交易的信息,如成交金额、成交量、收盘价等。
调用方法
# coding=utf-8
from xtquant import xtdata
xtdata.get_full_tick(code_list)
参数
字段 | 类型 | 说明 |
---|---|---|
code_list | list | 合约列表 |
返回值
dict
数据集{ stock1 : tick1, stock2 : tick2, ... }
,tick
字段如下:
字段 | 类型 | 说明 |
---|---|---|
timetag | str | 时间 |
lastPrice | float | 最新价 |
open | float | 开盘价 |
low | float | 最低价 |
amount | float | 成交额 |
volume | int | 成交总量 |
pvolume | int | 原始成交总量 |
openInt | int | 持仓量 |
stockStatus | str | 证券状态 |
lastClose | float | 前收盘价 |
lastSettlementPrice | float | 前结算价 |
settlementPrice | float | 今结算价 |
askPrice | list | 多档委卖价 |
bidPrice | list | 多档委买价 |
askVol | list | 多档委卖量 |
bidVol | list | 多档委买量 |
示例返回值
# coding=utf-8
from xtquant import xtdata
ret_full_tick = xtdata.get_full_tick(['10005331.SHO'])
print(ret_full_tick)
期权VIX指数
VIX指数合约代码规则
沪深VIX指数的合约代码如下:
名称 | VIX指数合约代码 |
---|---|
深圳100ETFVIX | 159901VIX.SZO.VIX |
创业板ETFVIX | 159915VIX.SZO.VIX |
沪深300ETFVIX | 159919VIX.SZO.VIX |
中证500ETFVIX | 159922VIX.SZO.VIX |
50ETFVIX | 510050VIX.SHO.VIX |
300ETFVIX | 510300VIX.SHO.VIX |
500ETFVIX | 510500VIX.SHO.VIX |
科创50VIX | 588000VIX.SHO.VIX |
科创板50VIX | 588080VIX.SHO.VIX |
获取VIX指数行情
获取VIX指数行情的函数可以帮助用户实时获取VIX指数的市场数据,以便进行波动率分析和风险管理。
调用方法
# coding=utf-8
from xtquant import xtdata
vix_data = xtdata.get_market_data_ex([], ['510050VIX.SHO.VIX'], period='1d')
print(vix_data)
参数
字段 | 类型 | 说明 |
---|---|---|
field_list | list | 表示所有字段,不同的数据周期,取值范围有所不同 |
stock_list | list | 合约代码列表 |
period | str | 数据周期,默认是当前主图周期。可选值如下:’tick’ (分笔线),’1d’ (日线),’1m’ (1分钟线),’5m’ (5分钟线),’15m’ (15分钟线) |
返回值
period
为1m
、5m
、1d
K线周期时,返回dict
,格式为{ field1 : value1, field2 : value2, ... }
,其中value1, value2, ...
为pd.DataFrame
数据集,index
为stock_list
,columns
为time_list
。period
为tick
分笔周期时,返回dict
,格式为{ stock1 : value1, stock2 : value2, ... }
,其中stock1, stock2, ...
为合约代码,value1, value2, ...
为np.ndarray
数据集,按数据时间戳time
增序排列。
示例返回值
# coding=utf-8
from xtquant import xtdata
vix_data = xtdata.get_market_data_ex([], ['510050VIX.SHO.VIX'], period='1d')
print(vix_data)
本文由 海星量化研究所 作者提供,转载请保留链接和署名!网址:https://qmt.hxquant.com/?id=15
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源; 2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任; 3.作者投稿可能会经我们编辑修改或补充。