3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在期权交易与做市商策略中,风险控制的核心在于对希腊字母(Greeks)的管理。Delta 中性可以规避标的资产价格微小变动带来的方向性风险,而 Gamma 中性则能进一步降低标的资产价格大幅波动带来的二次风险。
本文将介绍如何在 JoinQuant(聚宽)量化平台上获取期权行情数据,计算 Delta 与 Gamma 风险暴露,并通过标的资产及期权合约实现动态对冲。
JoinQuant 提供了完整的场内期权基础信息与行情数据支持:
get_all_securities(['options'], date=None) 获取历史或当前上市的所有期权合约信息。get_ticks() 或 get_call_auction() 查询 50ETF 期权(2017年至今)及商品期权(2019年至今)的买卖五档行情。get_bars() 获取指定期权的分钟或日级别历史 Bar。例如:# 获取指定期权合约的前复权/不复权 K 线数据
bars = get_bars('10002882.XSHG', count=5, unit='1d', fields=['date', 'open', 'close', 'high', 'low', 'volume'])
假设组合包含:
以下是一个在 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))
LimitOrderStyle 限制挂单价格,或通过 set_slippage() 设置合理的滑点成本。set_order_cost() 设定),实盘中通常设立风险偏离阈值(如 Delta 偏离超过 $\pm 0.05$)再触发二次对冲。