期权基本使用

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",不填返回全部
expiredFalse 只返回未到期,默认全部
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 总览 查看所有章节。