期权基本使用
TqSdk 对期权有完整的原生支持——不需要额外装库,用同一套 API 就能获取期权行情、查询期权链、计算 Greeks 和隐含波动率。本章介绍期权开发最常用的几个功能。
期权合约代码格式
TqSdk 中期权代码格式为 交易所.品种月份-C/P-行权价:
DCE.m2501-C-3000 # 大商所 豆粕 2501 看涨期权 行权价 3000
SHFE.au2412-P-560 # 上期所 黄金 2412 看跌期权 行权价 560
CFFEX.IO2412-C-3600 # 中金所 沪深300股指期权 看涨 行权价 3600
DCE.jd2507-C-4300 # 大商所 鸡蛋 看涨期权 行权价 4300
-C-表示看涨(CALL),-P-表示看跌(PUT)。- 和期货合约代码一样,以
.分隔交易所和合约。
获取期权行情
和期货完全一样,用 get_quote():
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
quote_opt = api.get_quote("DCE.m2501-C-3000")
print(quote_opt.last_price, quote_opt.strike_price, quote_opt.option_class)
期权 Quote 对象除了普通行情字段外,还有期权专属字段:
| 字段 | 含义 |
|---|---|
strike_price | 行权价 |
option_class | "CALL" 或 "PUT" |
underlying_symbol | 标的合约代码 |
expire_datetime | 到期时间(Unix 秒) |
query_options:查询期权链
根据标的合约查询所有期权:
# 查询豆粕 2501 的所有未到期看涨期权
calls = api.query_options("DCE.m2501", option_class="CALL", expired=False)
print(calls) # 返回 list[str],如 ["DCE.m2501-C-2800", "DCE.m2501-C-2900", ...]
# 查询指定行权价
ls = api.query_options("DCE.m2501", strike_price=3000)
# 查询指定到期月份
ls = api.query_options("DCE.m2501", exercise_year=2025, exercise_month=1)
| 参数 | 含义 |
|---|---|
symbol | 标的合约代码 |
option_class | "CALL" / "PUT",不填返回全部 |
expired | False 只返回未到期,默认全部 |
strike_price | 筛选指定行权价 |
exercise_year / exercise_month | 筛选到期年月 |
query_atm_options:查询平值/虚值/实值期权
更实用的查询——根据当前标的价格,自动定位平值(ATM)、虚值(OTM)、实值(ITM)期权:
quote = api.get_quote("DCE.m2501")
# 平值看涨期权
atm = api.query_atm_options("DCE.m2501", quote.last_price, 0, "CALL")
# 实值1档 + 平值 + 虚值1档
options = api.query_atm_options("DCE.m2501", quote.last_price, [1, 0, -1], "CALL")
# 返回 [实值1档, 平值, 虚值1档],没有匹配则为 None
第三个参数 offset 的含义:
0= 平值(ATM)- 正数 = 实值档数(ITM)
- 负数 = 虚值档数(OTM)
last_price可能是 NaN,使用前先用math.isnan()检查。
计算希腊字母(Greeks)
用 tqsdk.ta.OPTION_GREEKS 计算 Delta / Gamma / Theta / Vega / Rho:
from tqsdk import TqApi, TqAuth
from tqsdk.ta import OPTION_GREEKS
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
quote_opt = api.get_quote("DCE.m2501-C-3000")
# 获取期权和标的的多合约 K 线(期权在前,标的在后)
klines = api.get_kline_serial(["DCE.m2501-C-3000", "DCE.m2501"], 86400, 30)
greeks = OPTION_GREEKS(klines, quote_opt, 0.025) # r=无风险利率
print("Delta:", greeks["delta"].iloc[-1])
print("Gamma:", greeks["gamma"].iloc[-1])
print("Theta:", greeks["theta"].iloc[-1])
print("Vega:", greeks["vega"].iloc[-1])
多合约 K 线要点:期权 Greeks 计算需要期权价格和标的价格,用
get_kline_serial([期权, 标的], ...)获取对齐数据。期权数据在close(主合约),标的在close1(副合约)。
计算隐含波动率
用 tqsdk.ta.OPTION_IMPV 计算隐含波动率(IV):
from tqsdk.ta import OPTION_IMPV
klines = api.get_kline_serial(["DCE.m2501-C-3000", "DCE.m2501"], 86400, 30)
impv = OPTION_IMPV(klines, quote_opt, 0.025) # r=无风险利率
print("隐含波动率:", impv["impv"].iloc[-1])
还可以用 OPTION_VALUE 计算内在价值和时间价值:
from tqsdk.ta import OPTION_VALUE
values = OPTION_VALUE(klines, quote_opt)
print("内在价值:", values["intrins"].iloc[-1])
print("时间价值:", values["time"].iloc[-1])
期权下单交易
期权下单和期货完全一样,用 insert_order:
# 买入开仓 1 手看涨期权
order = api.insert_order(symbol="DCE.m2501-C-3000", direction="BUY",
offset="OPEN", volume=1, limit_price=80.0)
# 平仓
order = api.insert_order(symbol="DCE.m2501-C-3000", direction="SELL",
offset="CLOSE", volume=1, limit_price=120.0)
期权的
volume单位是「手」,每手对应的合约张数与标的期货一致(由合约乘数决定)。
期权策略示例
一个简单的牛市价差——买入低行权价 CALL、卖出高行权价 CALL:
from tqsdk import TqApi, TqAuth, TargetPosTask
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
quote = api.get_quote("DCE.m2501")
# 查询平值和虚值1档看涨期权
options = api.query_atm_options("DCE.m2501", quote.last_price, [0, -1], "CALL")
# options[0] = 平值(买入),options[1] = 虚值1档(卖出)
if options[0] and options[1]:
target_low = TargetPosTask(api, options[0])
target_high = TargetPosTask(api, options[1])
target_low.set_target_volume(1) # 买入低行权价
target_high.set_target_volume(-1) # 卖出高行权价
小结
- 期权代码格式:
交易所.品种月份-C/P-行权价。 query_options查全量期权链,query_atm_options按档位查平值/虚值/实值。- 用多合约 K 线 +
OPTION_GREEKS/OPTION_IMPV计算 Greeks 和 IV。 - 期权下单和期货一样用
insert_order,逻辑完全通用。
本手册到此结束。回到 天勤 TqSdk 总览 查看所有章节。