🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 平台如何实现期权 Delta-Gamma 动态中性对冲策略?(附 Python 代码)

joinquant | 发布时间: 2026/8/1
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 期权策略开发:Delta-Gamma 中性对冲实现

Question: 如何在 joinquant 中获取期权数据并实现 Delta 和 Gamma 的动态对冲?

解决方案

joinquant 平台期权 Delta-Gamma 动态中性对冲策略实现指南

在期权交易与做市商策略中,风险控制的核心在于对希腊字母(Greeks)的管理。Delta 中性可以规避标的资产价格微小变动带来的方向性风险,而 Gamma 中性则能进一步降低标的资产价格大幅波动带来的二次风险。

本文将介绍如何在 JoinQuant(聚宽)量化平台上获取期权行情数据,计算 Delta 与 Gamma 风险暴露,并通过标的资产及期权合约实现动态对冲。


一、期权数据获取 API 说明

JoinQuant 提供了完整的场内期权基础信息与行情数据支持:

  1. 标的信息获取:调用 get_all_securities(['options'], date=None) 获取历史或当前上市的所有期权合约信息。
  2. Tick 与集合竞价数据:调用 get_ticks()get_call_auction() 查询 50ETF 期权(2017年至今)及商品期权(2019年至今)的买卖五档行情。
  3. K 线数据获取:使用 get_bars() 获取指定期权的分钟或日级别历史 Bar。例如:
    # 获取指定期权合约的前复权/不复权 K 线数据
    bars = get_bars('10002882.XSHG', count=5, unit='1d', fields=['date', 'open', 'close', 'high', 'low', 'volume'])
    

二、Delta 与 Gamma 动态对冲逻辑

假设组合包含:

  • 标的资产(如 50ETF)数量为 $S$
  • 主期权合约 $C_1$(对冲 Delta 和 Gamma 的目标持仓)
  • 辅助期权合约 $C_2$(用于消除 Gamma 风险)

对冲公式:

  1. Gamma 中性:选择期权 $C_2$,使其 Gamma 值满足 $\Gamma_{portfolio} + N_2 \cdot \Gamma_2 = 0$,解出期权 $C_2$ 的对冲手数 $N_2$。
  2. Delta 中性:在 Gamma 中性后,计算整体组合的新 Delta,通过买卖标的股票/ETF $N_s$ 使得 $\Delta_{portfolio} + N_2 \cdot \Delta_2 + N_s = 0$。

三、JoinQuant 策略代码实现

以下是一个在 JoinQuant 平台上构建 Delta-Gamma 动态中性对冲策略的示例框架:

import numpy as np
from scipy.stats import norm
import jqdata

# Black-Scholes 希腊字母计算函数
def bs_greeks(S, K, T, r, sigma, option_type='call'):
    d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)
    if option_type == 'call':
        delta = norm.cdf(d1)
    else:
        delta = norm.cdf(d1) - 1
    gamma = norm.pdf(d1) / (S * sigma * np.sqrt(T))
    return delta, gamma

def initialize(context):
    # 开启动态复权模式
    set_option('use_real_price', True)
    # 设置基准
    set_benchmark('510050.XSHG')
    
    # 设定标的与期权代码全局变量
    g.underlying = '510050.XSHG'
    g.opt_target = '10002882.XSHG'  # 需对冲的期权持仓
    g.opt_hedge = '10002883.XSHG'   # 用于对冲 Gamma 的期权
    
    # 每日定时运行对冲函数
    run_daily(rebalance_portfolio, time='14:30')

def rebalance_portfolio(context):
    current_dt = context.current_dt
    # 获取标的当前价格
    current_data = get_current_data()
    price_s = current_data[g.underlying].last_price
    
    # 假定无风险利率 r=0.03, 波动率 sigma=0.2, 剩余期限 T=0.1
    r, sigma, T = 0.03, 0.2, 0.1
    
    # 计算目标期权与对冲期权的 Delta 和 Gamma (以实际执行价为准)
    delta_target, gamma_target = bs_greeks(price_s, 2.8, T, r, sigma, 'call')
    delta_hedge, gamma_hedge = bs_greeks(price_s, 2.85, T, r, sigma, 'call')
    
    # 假设我们持有 100 张目标期权多头 (每张合约乘数为 10000)
    target_pos = 100 * 10000
    total_gamma = target_pos * gamma_target
    total_delta = target_pos * delta_target
    
    # 1. 计算对冲 Gamma 所需的对冲期权数量 N_hedge
    n_hedge = - total_gamma / gamma_hedge
    
    # 2. 计算 Gamma 中性后组合的总 Delta
    net_delta = total_delta + n_hedge * delta_hedge
    
    # 3. 计算对冲 Delta 所需的标的 ETF 股数
    n_stock = - net_delta
    
    # 4. 执行调仓下单
    log.info("Gamma对冲期权份数: %f, Delta对冲ETF股数: %f" % (n_hedge / 10000, n_stock))
    # order_target(g.opt_hedge, int(n_hedge / 10000))
    # order_target(g.underlying, int(n_stock))

四、注意事项与优化建议

  1. 流动性与滑点控制:期权买卖五档价差可能较大,下单时建议使用 LimitOrderStyle 限制挂单价格,或通过 set_slippage() 设置合理的滑点成本。
  2. 动态调整阈值:高频的希腊字母对冲会产生较高的交易佣金(可通过 set_order_cost() 设定),实盘中通常设立风险偏离阈值(如 Delta 偏离超过 $\pm 0.05$)再触发二次对冲。