- 金融科技
【免费下载链接】tqsdk-python
天勤量化开发包, 期货量化, 实时行情/历史数据/实盘交易
本篇基于 tqsdk-python 仓库中的期权基础使用文档 doc/demo/option_base.rst,系统讲解 tqsdk 提供的期权全链路功能:获取期权实时行情、按条件筛选期权合约、查询实值/平值/虚值期权、计算希腊字母与隐含波动率、获取波动率曲面、期权套利下单以及 ETF 期权卖方保证金的本地计算。读完后,你可以直接使用query_options、query_atm_options、query_all_level_options等 API 完成期权筛选,并结合tqsdk.ta中的OPTION_GREEKS、OPTION_IMPV、VOLATILITY_CURVE函数对期权做定价分析,把期权逻辑落进量化策略。
本组示例默认你已经熟悉 tqsdk 的基础行情、K 线和wait_update主循环写法。第一次接触期权功能时,建议按下面的顺序阅读:
- 先看 o10.py、o20.py,熟悉期权行情和筛选接口;
- 再看 o30.py、o40.py、o41.py,理解实值/平值/虚值分类与希腊值计算;
- 最后看 o60.py 到 o74.py,处理波动率曲面、套利和保证金计算。
前提说明:期权功能的适用范围
所有示例都通过TqApi(auth=TqAuth("快期账户", "账户密码"))创建 API 实例并传入快期账户认证。需要注意两点:
- 认证:示例中的
"快期账户"、"账户密码"需要替换为你自己的快期账户信息; - 行情系统限制:从 tqsdk/api.py 的源码看,
query_options等合约查询接口在期货行情系统(_stock = False)下调用会抛出期货行情系统(_stock = False)不支持当前接口调用,即期权合约查询依赖天勤期货行情系统。
o10 - 获取期权实时行情
期权合约与普通期货合约一样,通过api.get_quote()获取实时行情对象。期权代码格式为交易所.标的代码-C/P-行权价(中金所股指期权使用年月格式),例如:
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'ringo' from tqsdk import TqApi, TqAuth # 创建API实例,传入自己的快期账户 api = TqApi(auth=TqAuth("快期账户", "账户密码")) # 获取大商所豆粕期权行情 quote_m = api.get_quote("DCE.m1807-C-2450") # 获取中金所股指期权行情 quote_IO = api.get_quote("CFFEX.IO2002-C-3550") # 输出 m1807-C-2450 的最新行情时间和最新价 print(quote_m.datetime, quote_m.last_price) # 关闭api,释放资源 api.close()示例代码见 tqsdk/demo/option_tutorial/o10.py。行情对象除了datetime、last_price等通用字段外,还包含期权特有字段,如strike_price(行权价)、option_class(CALL/PUT)、underlying_symbol(标的合约)、expire_datetime(到期时间)等,这些字段在后面的筛选、希腊值计算和保证金计算中都会用到。
o20 - 查询符合要求的期权(query_options)
query_options用于按标的合约和多种条件查询期权合约列表,返回合约代码列表(SymbolList)。
from tqsdk import TqApi, TqAuth api = TqApi(auth=TqAuth("快期账户", "账户密码")) ls = api.query_options("SHFE.au2012") print(ls) # 标的为 "SHFE.au2012" 的所有期权 ls = api.query_options("SHFE.au2012", option_class="PUT") print(ls) # 标的为 "SHFE.au2012" 的看跌期权 ls = api.query_options("SHFE.au2012", option_class="PUT", expired=False) print(ls) # 标的为 "SHFE.au2012" 的看跌期权, 未下市的 ls = api.query_options("SHFE.au2012", strike_price=340) print(ls) # 标的为 "SHFE.au2012" 、行权价为 340 的期权 ls = api.query_options("SSE.000300", exchange_id="CFFEX") print(ls) # 中金所沪深300股指期权 ls = api.query_options("SSE.510300", exchange_id="SSE") print(ls) # 上交所沪深300etf期权 ls = api.query_options("SSE.510300", exchange_id="SSE", exercise_year=2020, exercise_month=12) print(ls) # 上交所沪深300etf期权, 限制条件 2020 年 12 月份行权 api.close()示例代码见 tqsdk/demo/option_tutorial/o20.py。结合 tqsdk/api.py 中query_options的完整签名,各参数含义如下:
| 参数 | 类型 | 说明 |
|---|---|---|
underlying_symbol | str | 必填,标的合约 |
option_class | str | 可选,期权类型:CALL(看涨)/PUT(看跌) |
exercise_year | int | 可选,最后行权日年份 |
exercise_month | int | 可选,最后行权日月份 |
strike_price | float | 可选,行权价格 |
expired | bool | 可选,是否下市(expired=False表示未下市) |
has_A | bool | 可选,是否含 A 系列:True只含 A 期权,False不含 A 期权,None不区分 |
has_MS | bool | 可选,是否含 MS 系列:True只含 MS 系列期权,False排除 MS 系列期权,None不区分 |
从源码结构看,query_options内部先通过_query_options_by_underlying向合约服务发起查询,再用_get_options_filtered对结果做本地过滤,最终返回形如["SHFE.cu2012C24000", "SHFE.cu2012P24000"]的合约代码列表。同一标的对应多个交易所时(如SSE.000300对应中金所股指期权、SSE.510300对应上交所 ETF 期权),可用exchange_id等关键字参数进一步限定。
o30 - 查询平值/虚值/实值期权(query_atm_options)
query_atm_options以指定价格比对标的,按“档位”查询实值/平值/虚值期权:
from tqsdk import TqApi, TqAuth api = TqApi(auth=TqAuth("快期账户", "账户密码")) quote = api.get_quote("SHFE.au2012") # 预计输出的为以au2012现在最新价来比对的认购的平值期权,当没有符合的平值期权时返回为空,如果有返回则格式为 ["SHFE.au2012C30000"] ls = api.query_atm_options("SHFE.au2012", quote.last_price, 0, "CALL") # 预计输出的为au2012,以开盘价来比对的认购的实值3档,实值2档,实值1档期权,如果没有符合要求的期权则对应栏返回为None,如果有则返回格式例如 [None,None,"SHFE.au2012C30000"] ls = api.query_atm_options("SHFE.au2012", quote.open, [3, 2, 1], "CALL") # 预计输出的为au2012,以开盘价来比对的认购的实值1档,平值期权,虚值1档,如果没有符合要求的期权则对应栏返回为None,如果有则返回格式例如 ls = api.query_atm_options("SHFE.au2012", quote.open, [1, 0, -1], "CALL") # 预计输出的为au2012,以现在最新价来比对的认购的虚值1档期权 ls = api.query_atm_options("SHFE.au2012", quote.last_price, -1, "CALL") # 预计输出沪深300股指期权,2020年12月的虚值1档期权 ls = api.query_atm_options("SSE.000300", quote.last_price, -1, "CALL", exercise_year=2020, exercise_month=12) # 预计输出 上交所 沪深300股指ETF期权,2020年12月的虚值1档期权 ls = api.query_atm_options("SSE.510300", quote.last_price, -1, "CALL", exercise_year=2020, exercise_month=12) api.close()示例代码见 tqsdk/demo/option_tutorial/o30.py。参数说明(源自 tqsdk/api.py 的接口文档):
underlying_symbol:必填,标的合约(目前每个标的只对应一个交易所的期权);underlying_price:必填,标的价格,用户可输入任意值,如合约最新价、最高价、开盘价,接口以该值比对实值/平值/虚值期权;price_level:必填,实值/平值/虚值档位,支持-100 ~ 100之间的整数。其中3, 2, 1, 0, -1, -2, -3分别代表实值 3 档、实值 2 档、实值 1 档、平值期权、虚值 1 档、虚值 2 档、虚值 3 档,以此类推;没有指定档位的期权时(如-100档),返回列表对应位置为None,例如price_level=[-100, 0]可能返回[None, "平值期权合约代码"];option_class:必填,CALL或PUT;exercise_year/exercise_month:ETF 期权、股指期权必填,期权最后行权日年/月。
平值期权的选取逻辑(接口文档明确说明):
- 根据用户传入参数生成一个期权列表,其中是否有与传入价格相比的平值期权并返回;
- 如果没有符合的平值期权,则取行权价距离传入价格绝对值相差最小的期权作为平值期权;
- 如果存在最近的两个期权的行权价到传入价格的绝对值最小且相等,则取虚值的那个期权作为平值期权,其他档位期权依次展开。
o40 - 计算期权的希腊字母(OPTION_GREEKS)
期权希腊值通过tqsdk.ta模块的OPTION_GREEKS函数计算,输入为期权合约与对应标的合约组成的多 K 线序列:
from tqsdk import TqApi, TqAuth from tqsdk.ta import OPTION_GREEKS api = TqApi(auth=TqAuth("快期账户", "账户密码")) # 获取指定期权行情 quote = api.get_quote("SHFE.cu2006C44000") # 获取期权和其对应标的的多合约的 kline 数据 klines = api.get_kline_serial(["SHFE.cu2006C44000", "SHFE.cu2006"], 24 * 60 * 60, 30) # 运行 OPTION_GREEKS 希腊值计算函数 greeks = OPTION_GREEKS(klines, quote, 0.025) # 输出希腊字母 print(list(greeks["delta"])) print(list(greeks["theta"])) print(list(greeks["gamma"])) print(list(greeks["vega"])) print(list(greeks["rho"])) api.close()示例代码见 tqsdk/demo/option_tutorial/o40.py。函数签名与要点(见 tqsdk/ta.py):
OPTION_GREEKS(df, quote, r=0.025, v=None)df:期权合约及对应标的合约组成的多 K 线序列(api.get_kline_serial()返回的 DataFrame)。第一个参数列表中顺序必须是期权合约在前、对应标的合约在后,否则返回序列值全为 nan。例如api.get_kline_serial(["SHFE.cu2006C44000", "SHFE.cu2006"], 60, 100);quote:期权对象,必须是df中多 K 线序列里的那个期权合约对象,否则同样全为 nan;r:可选,无风险利率,示例中取0.025;v:可选,波动率。None(默认)时使用df序列计算出的隐含波动率;传入float时每一行使用相同的v;传入与df行数相同的pandas.Series时逐行使用对应值;- 返回值:与
df行数相同的 DataFrame,包含delta、theta、gamma、vega、rho五列。
从 tqsdk/ta.py 的实现看,函数先校验quote是否为 OPTION 类型且与多 K 线序列中的symbol/symbol1匹配,不匹配时直接返回全 nan;匹配时则依次通过tqsdk.tafunc._get_t_series计算剩余到期时间、用get_impv求隐含波动率,再基于 Black-Scholes 框架的_get_d1、get_delta、get_theta、get_gamma、get_vega、get_rho逐列计算,多合约 K 线中的close(标的收盘价)与close1(期权收盘价)分别作为标的价与期权价参与计算。
o41 - 计算期权隐含波动率和历史波动率(OPTION_IMPV)
隐含波动率使用OPTION_IMPV函数,输入结构同上:
from tqsdk import TqApi, TqAuth from tqsdk.ta import OPTION_IMPV api = TqApi(auth=TqAuth("快期账户", "账户密码")) # 获取指定期权行情 quote = api.get_quote("SHFE.cu2006C50000") # 获取期权和对应标的的多合约 kline klines = api.get_kline_serial(["SHFE.cu2006C50000", "SHFE.cu2006"], 24 * 60 * 60, 20) # 通过 OPTION_IMPV 函数计算隐含波动率,设置无风险利率为 0.025 impv = OPTION_IMPV(klines, quote, 0.025) print(list(impv["impv"] * 100)) api.close()示例代码见 tqsdk/demo/option_tutorial/o41.py。函数签名为OPTION_IMPV(df, quote, r=0.025)(见 tqsdk/ta.py):df、quote的要求与OPTION_GREEKS相同(期权在前、标的在后),返回包含一列impv的 DataFrame,行数与df相同,示例中乘以 100 后按百分比展示。
从 tqsdk/ta.py 的实现看:函数校验合约匹配后,先用_get_volatility基于期权历史价格计算一个历史波动率估计his_v(计算失败取nan时回退为0.3),再结合_get_t_series得到的剩余期限序列调用get_impv反解每一行的隐含波动率。
o60 - 获取期权波动率曲面(VOLATILITY_CURVE)
波动率曲面按行权价展开各档期权的隐含波动率,一次覆盖同一标的的多个期权合约:
from tqsdk import TqApi, TqAuth from tqsdk.ta import VOLATILITY_CURVE api = TqApi(auth=TqAuth("快期账户", "账户密码")) # 获取 m2112 的看跌期权 underlying = "DCE.m2101" options = api.query_options(underlying_symbol=underlying, option_class="PUT", expired=False) # 批量获取合约的行情信息, 存储结构必须为 dict, key 为合约, value 为行情数据 quote = {} for symbol in options: quote[symbol] = api.get_quote(symbol) options.append(underlying) klines = api.get_kline_serial(options, 24 * 60 * 60, 20) # 使用 VOLATILITY_CURVE 函数计算波动率曲面 vc = VOLATILITY_CURVE(klines, quote, underlying, r=0.025) print(vc) api.close()示例代码见 tqsdk/demo/option_tutorial/o60.py。要点:
df:期权合约及基础标的基础合约组成的多 K 线序列(Dataframe 格式);quotes:批量合约行情的 dict,key 为合约代码、value 为行情对象,例如{'SHFE.cu2101': {...}, 'SHFE.cu2101C34000': {...}},示例中先把查到的未下市看跌期权逐个get_quote存入字典;underlying:基础标的合约名称,如DCE.m2101;多合约 K 线序列的合约列表中必须包含标的合约(示例中options.append(underlying)就是为了加入标的);r:可选,无风险利率。
返回值是一个 DataFrame,行索引对应 K 线时间点(datetime列),列名为各档行权价。接口文档给出的预计输出形如:
datetime 2450.0 2500.0 ... 3600.0 3650.0 0 1.603382e+18 0.336557 0.314832 ... 0.231657 0.237882 1 1.603642e+18 0.353507 0.331051 ... 0.231657 0.237882从 tqsdk/ta.py 的实现看:函数会先检查 K 线数据中是否包含基础标的合约,缺失时抛出kline 数据中未包含基础标的合约的K线数据, 请更正;然后对每个期权合约列,以标的收盘价与期权收盘价反解隐含波动率,并对单行结果做interpolate(method='linear')线性插值以平滑缺口,最终按行权价升序组织成曲面 DataFrame。
o70 - 期权套利策略(期货-期权平价套利)
下面示例演示一个经典的期货-期权平价套利:当“买入看涨期权并立即行权获得期货”的成本低于期货现价卖价时,同时买入看涨期权、卖出标的期货锁定差价。
from tqsdk import TqApi, TqAuth ''' 如果买入看涨期权构建多头期货的价格小于卖出期货价格 存在套利机会则发出双边挂单 ''' api = TqApi(auth=TqAuth("快期账户", "账号密码")) # 获取行权价为2950的MA109看涨期权的quote数据 quote_option = api.get_quote('CZCE.MA109C2950') # 获取期权对应标的期货,即MA109的quote数据 quote = api.get_quote(quote_option.underlying_symbol) # 套利机会尝试次数 times = 0 while True: api.wait_update() # 以对手价来计算买入看涨期权然后行权后的期货成本价格 option_buy = quote_option.strike_price + quote_option.ask_price1 # 判断当期货的买入1档,即卖出期货价格大于买入看涨期权的期货成本价格,形成套利空间时进行限价下单 if quote.bid_price1 > option_buy and times == 0: times += 1 # 以现在卖1档价格买入看涨期权 order_opiton = api.insert_order('CZCE.MA109C2950', "BUY", "OPEN", 1, quote_option.ask_price1) # 以现在买1档的价格卖出期货 order_future = api.insert_order(quote.underlying_symbol, "SELL", "OPEN", 1, quote.bid_price1) print("存在期货,期权套利空间尝试买入")示例代码见 tqsdk/demo/option_tutorial/o70.py。核心逻辑:
quote_option.underlying_symbol直接从期权 quote 对象取得标的期货合约,再通过api.get_quote()获取期货行情;- 期权行权后的期货成本 = 行权价
strike_price+ 期权卖一价ask_price1(对手价成交假设); - 当期货买一价
bid_price1大于该成本、形成套利空间时,用api.insert_order()双边限价下单:按期权卖一价买入 1 手看涨期权(BUY/OPEN),按期货买一价卖出 1 手期货(SELL/OPEN); times标志位保证套利机会只尝试触发一次,避免盘中重复下单。
主循环使用api.wait_update()驱动,行情每更新一次就重新判断一次价差,这是 tqsdk 事件驱动策略的标准写法。
o71 - 获取一组期权和其对应行权价
拿到一组期权合约后,常需要“合约 -> 行权价”的映射,api.get_quote_list()可以批量获取行情再遍历组装:
from tqsdk import TqApi, TqAuth ''' 获取标的对应看涨期权的期权和行权价对应列表 ''' api = TqApi(auth=TqAuth("快期账户", "账号密码")) # 获取沪深300股指期权的认购在市合约 ls = api.query_options("SSE.000300", "CALL", expired=False) # 批量获取这些合约的quote合约信息 quote_ls = api.get_quote_list(ls) option_ls = {} # 遍历quote合约信息,将合约和其对应行权价组装成字典 for i in quote_ls: option_ls[i.instrument_id] = i.strike_price print(option_ls) api.close()示例代码见 tqsdk/demo/option_tutorial/o71.py。get_quote_list的签名见 tqsdk/api.py,接收合约代码列表返回批量 quote。这里以股指期权标的SSE.000300为例,先查认购未下市合约,再批量取行情,最终得到形如{"IO2312-C-3500": 3500.0, ...}的映射,是构建行权价维度数据(如行权价矩阵、波动率图横轴)的基础操作。
o72 - 按虚值/平值/实值分类:query_all_level_options(方法一)
query_all_level_options一次返回全部实值、平值、虚值期权三个列表,适合做期权链(Option Chain)展示:
from tqsdk import TqApi, TqAuth ''' 查询标的对应期权按虚值平值实值分类 ''' api = TqApi(auth=TqAuth("快期账户", "账户密码")) quote = api.get_quote("SHFE.au2112") in_money_options, at_money_options, out_of_money_options = api.query_all_level_options("SHFE.au2112", quote.last_price, "CALL") print(in_money_options) # 实值期权列表 print(at_money_options) # 平值期权列表 print(out_of_money_options) # 虚值期权列表 api.close()示例代码见 tqsdk/demo/option_tutorial/o72.py。接口定义与返回规则(见 tqsdk/api.py):
- 参数:
underlying_symbol(标的合约)、underlying_price(比对价格,可任意取值,如quote.last_price)、option_class(必须是CALL或PUT,源码中会校验并抛出option_class 参数错误,option_class 必须是 'CALL' 或者 'PUT');ETF 期权、股指期权还需传exercise_year/exercise_month;同样支持has_A、has_MS过滤; - 返回值:三个列表,实值/平值/虚值,平值列表只包含一个元素;
- 排序规则:看涨期权返回的实值、平值、虚值列表行权价依次递增;看跌期权则依次递减;
- 平值选取逻辑与
query_atm_options一致:先找严格平值,找不到取行权价距离价差最小的;两个行权价距离相等时取虚值的那个; - 从实现看,源码先通过
_get_options_filtered过滤合约,再调用_get_options_sorted(options, underlying_price, option_class)排序并定位平值下标option_0_index,下标之前为实值、之后为虚值(tqsdk/api.py)。
o73 - 按到期月份筛选:query_all_level_finance_options(方法二)
针对 ETF 期权和股指期权,query_all_level_finance_options按“距离最后行权日远近”筛选月份,只查询未下市合约:
from tqsdk import TqApi, TqAuth ''' 查询标的对应期权按虚值平值实值分类 ''' api = TqApi(auth=TqAuth("快期账户", "账户密码")) quote = api.get_quote("SSE.510300") # 获取下月的上交所看涨300etf期权 in_money_options, at_money_options, out_of_money_options = api.query_all_level_finance_options("SSE.510300", quote.last_price, "CALL", nearbys=1) print(in_money_options) # 实值期权列表 print(at_money_options) # 平值期权列表 print(out_of_money_options) # 虚值期权列表 api.close()示例代码见 tqsdk/demo/option_tutorial/o73.py。接口要点(见 tqsdk/api.py):
- 仅支持以下标的合约:
| 标的代码 | 品种 |
|---|---|
SSE.000300 | 中金所沪深 300 股指期权(IO)标的 |
SSE.000852 | 中金所中证 1000 股指期权(MO)标的 |
SSE.000016 | 中金所上证 50 股指期权(HO)标的 |
SSE.510050 | 上交所华夏上证 50 ETF 期权标的 |
SSE.510300 | 上交所华泰柏瑞沪深 300 ETF 期权标的 |
SZSE.159919 | 深交所嘉实沪深 300 ETF 期权标的 |
SZSE.159915 | 深交所易方达创业板 ETF 期权标的 |
SZSE.159922 | 深交所嘉实中证 500 ETF 期权标的 |
SSE.510500 | 上交所南方中证 500 ETF 期权标的 |
nearbys(int 或 int 列表):将所有未下市期权按最后行权日由近到远排序,0代表当前月/最接近当前月份的未下市期权,1代表下一个到期的期权,依此类推。具体语义为:- ETF 期权:
1代表参数0之后的下月,2代表随后的第一个季月,3代表随后的第二个季月; - 股指期权:
1代表下月,2代表下下月,3代表随后第一个季月,4代表随后第二个季月,5代表随后第三个季月;
- ETF 期权:
- 示例中
nearbys=1即获取上交所沪深 300 ETF 期权中“下月”的看涨期权,并按实值/平值/虚值三档返回列表; - 平值选取逻辑在此接口下有 5 步说明:按到期时间和行权价排序(看涨升序、看跌降序,实值在前虚值在后)→ 行权价去重排序 → 找与
underlying_price差值最小的作为平值行权价(差相等时取行权价较大的,即虚值的那个)→ 多个月份时选取距离行权日期最近的那个(保证平值列表只有一个元素)→ 下标小于平值的为实值、大于平值的为虚值。
o74 - 本地计算 ETF 期权卖方开仓保证金
交易所公布的 ETF 期权义务仓(卖方)开仓保证金有固定公式,下面示例根据行情数据本地推算理论保证金。实际保证金请以期货公司收取的一手保证金为准:
''' 根据输入的ETF期权来查询该期权的交易所规则下的理论卖方保证金,实际情况请以期货公司收取的一手保证金为准 ''' def etf_margin_cal(symbol): quote_etf = api.get_quote(symbol) # 判断期权标的是不是ETF if quote_etf.underlying_symbol in ["SSE.510050", "SSE.510300", "SZSE.159919"]: if quote_etf.option_class == "CALL": # 认购期权虚值=Max(行权价-合约标的前收盘价,0) call_out_value = max(quote_etf.strike_price - quote_etf.underlying_quote.pre_close, 0) # 认购期权义务仓开仓保证金=[合约前结算价+Max(12%×合约标的前收盘价-认购期权虚值,7%×合约标的前收盘价)]×合约单位 call_margin = (quote_etf.pre_settlement + max(0.12 * quote_etf.underlying_quote.pre_close - call_out_value, 0.07 * quote_etf.underlying_quote.pre_close)) * quote_etf.volume_multiple return round(call_margin, 2) elif quote_etf.option_class == "PUT": # 认沽期权虚值=Max(合约标的前收盘价-行权价,0) put_out_value = max(quote_etf.underlying_quote.pre_close - quote_etf.strike_price, 0) # 认沽期权义务仓开仓保证金=Min[合约前结算价+Max(12%×合约标的前收盘价-认沽期权虚值,7%×行权价),行权价]×合约单位。 put_margin = min(quote_etf.pre_settlement + max(0.12 * quote_etf.underlying_quote.pre_close - put_out_value, 0.07 * quote_etf.strike_price), quote_etf.strike_price) * quote_etf.volume_multiple return round(put_margin, 2) else: print("输入的不是ETF期权合约") return None # 创建api api = TqApi(auth=TqAuth("快期账户", "账户密码")) # 深交所300etf期权 symbol = "SZSE.90000833" print(etf_margin_cal(symbol)) api.close()示例代码见 tqsdk/demo/option_tutorial/o74.py。实现要点:
- 通过
quote_etf.underlying_symbol判断标的是否在支持列表中(SSE.510050上证 50 ETF、SSE.510300沪深 300 ETF、SZSE.159919嘉实沪深 300 ETF),否则提示“输入的不是ETF期权合约”并返回None; - 用到的行情字段:
strike_price(行权价)、pre_settlement(合约前结算价)、volume_multiple(合约单位)、underlying_quote.pre_close(标的 ETF 前收盘价,通过 quote 对象的underlying_quote属性直接取得标的行情); - 认购义务仓保证金 =
[合约前结算价 + Max(12%×合约标的前收盘价 − 认购期权虚值, 7%×合约标的前收盘价)] × 合约单位,其中认购期权虚值 =Max(行权价 − 合约标的前收盘价, 0); - 认沽义务仓保证金 =
Min[合约前结算价 + Max(12%×合约标的前收盘价 − 认沽期权虚值, 7%×行权价), 行权价] × 合约单位,其中认沽期权虚值 =Max(合约标的前收盘价 − 行权价, 0); - 计算结果用
round(..., 2)保留两位小数。
小结:期权功能模块速查
| 能力 | 接口/函数 | 参考实现 |
|---|---|---|
| 期权实时行情 | api.get_quote("DCE.m1807-C-2450") | o10.py |
| 多条件筛选期权 | api.query_options(...) | o20.py、tqsdk/api.py#L2889 |
| 按档位查平值/实值/虚值 | api.query_atm_options(...) | o30.py、tqsdk/api.py#L2966 |
| 希腊字母 | OPTION_GREEKS(df, quote, r) | o40.py、tqsdk/ta.py#L2563 |
| 隐含波动率 | OPTION_IMPV(df, quote, r) | o41.py、tqsdk/ta.py#L2674 |
| 波动率曲面 | VOLATILITY_CURVE(df, quotes, underlying, r) | o60.py、tqsdk/ta.py#L2716 |
| 期货-期权平价套利 | api.wait_update()+api.insert_order() | o70.py |
| 合约-行权价映射 | api.get_quote_list(ls) | o71.py |
| 实值/平值/虚值三列表 | api.query_all_level_options(...) | o72.py、tqsdk/api.py#L3183 |
| 按到期月份分类 | api.query_all_level_finance_options(...) | o73.py、tqsdk/api.py#L3267 |
| ETF 期权卖方保证金 | 本地公式计算 | o74.py |
使用时的通用注意事项:
TqApi需传入TqAuth认证,示例中的账户信息请替换为自己的快期账户;- 多 K 线序列(
get_kline_serial传合约列表)在OPTION_GREEKS、OPTION_IMPV中要求期权合约在前、标的合约在后,且quote必须是序列中的期权合约,否则结果全为 nan; - 股指期权、ETF 期权查询档位/分类接口时,多数情况需要指定
exercise_year/exercise_month(ETF/股指期权必填); - 保证金公式计算的是交易所规则下的理论值,实盘请以期货公司实际收取的一手保证金为准。
- 金融科技
【免费下载链接】tqsdk-python
天勤量化开发包, 期货量化, 实时行情/历史数据/实盘交易
相关推荐
VeighNa期权交易终极指南:隐含波动率曲面与希腊值计算实战
VeighNa是基于Python的开源量化交易平台开发框架,为期权交易者提供了专业的隐含波动率曲面构建和希腊值计算功能。无论您是期权交易新手还是经验丰富的量化分
金融科技机器学习天勤量化TqSdk期权交易:从基础概念到实战策略完整指南
天勤量化TqSdk期权交易:从基础概念到实战策略完整指南 天勤量化TqSdk是一款专业的期货量化开发包,提供实时行情、历史数据和实盘交易功能,尤其在期权交易领域
金融科技期权波动率曲面插值终极指南:SABR与Cubic Spline实战对比
期权波动率曲面插值终极指南:SABR与Cubic Spline实战对比 在金融衍生品定价中,波动率曲面(Volatility Surface)是连接不同执行价(
金融科技数据分析
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考