ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AutoHedge:期权Delta和Gamma动态对冲引擎的设计与实战

AutoHedge:期权Delta和Gamma动态对冲引擎的设计与实战 1. 项目背景为什么我会动手做 AutoHedge做衍生品交易的人尤其是天天和期权打交道的老手应该都有过这种体验持仓里十几个不同的期权合约下方还拖着一堆现货或期货头寸明明整体风险敞口算过没问题但盘面稍微一波动组合的 Greek 值瞬间就乱了。更难受的是手工对冲永远在“追行情”——刚按 Delta 缺口下了单标的又拉了一截买卖价差来回吃几次对冲成本惨不忍睹。AutoHedge 最初就是为解决这个问题冒出来的想法。我的核心诉求很简单让机器替我做日内或隔夜的 delta/gamma 动态对冲它不听情绪不怕手慢也不会在关键点位犹豫我只需要提前定好对冲触发阈值、最大敞口上限、交易成本预算剩下的交给程序自动跑。项目从起念头到第一版能跑通模拟盘前后花了差不多两个月中间踩了不少坑也走了不少弯路。如果你也在做期权做市、卖出波动率策略、各种 delta 中性组合或者手上有一些需要频繁调仓的多资产头寸这篇文章应该对你有帮助。我会把 AutoHedge 从框架设计、核心参数、实操环节到踩坑排查完完整整拆出来讲不只是讲思路而是把所有能落地的细节都摊开。2. AutoHedge 整体设计与思路拆解2.1 核心需求收敛这个工具到底要自动化什么开始写代码之前先别急着搭框架务必要把“自动化”的边界想清楚。如果不做这一步很容易做出一个大而全但没人敢真拿去挂实盘的怪物。我先列了自己真实交易中高频出现、又特别浪费精力的几个操作盘中盯 Delta组合 Delta 偏离中性区间后需手动买卖标的或近月期货来回矫正敞口。开盘前调仓due 到隔夜跳空每天开盘的 Greek 缺口常常要重新校准一次。波动率突变时的 Gamma 保护某个突发事件导致隐含波动率IV快速拉升期权端的 Gamma 敞口瞬间放大需要立刻调整对冲工具的头寸规模。收盘前后的风险归零很多机构下午 3 点后会把组合的 Delta 清干净避免隔夜方向性风险。把这些问题汇总以后我明确了 AutoHedge 第一版的功能边界不负责选标的、不定期权策略、不替代交易员对方向的观点。它只做三件事——实时监控组合敞口、按预设规则计算对冲目标、自动执行对冲下单。这个定位很关键。因为一旦你把“策略信号生成”也塞给 AutoHedge那它就不是一个对冲工具而是一个全自动交易系统风控逻辑、异常处理、滑点控制全都会跟着复杂好几倍。我见过太多项目就是死在这种过度设计上。2.2 方案选型和架构思考确定需求后我对比了几条实现路径第一种直接买商业订单管理系统或者用券商自带的风控模块。很多衍生品交易终端本身就带 Delta 监控也有不少支持设置阈值后自动发单。但问题是大平台的多头寸组合监控往往只覆盖自家体系内的产品跨资产的组合、外部导入的历史持仓支持很弱而且添加自定义对冲逻辑的修改成本极高动不动就要整套系统升级。第二种用专业的量化交易平台比如某量化终端或开源回测框架用其内置接口自己写策略脚本。这条路适合单纯做回测验证但要在生产环境中实时对接行情、执行订单、做持仓内部撮合还需要额外的运维能力对个人开发者来说成本偏高。第三种自己写一套轻量级对冲引擎行情源和交易接口都通过标准 API 对接组件尽量解耦。这是 AutoHedge 最终采用的路线。架构上的取舍原则有三条行情推送必须用增量更新增量快照 事件流不能用轮询否则一到快速行情机器就卡死。交易执行必须实现“请求—确认—回报”三态状态机任何中间环节断了都能恢复不能出现单一边缘情况下订单状态不明的情况。核心对冲逻辑与执行细节要解耦也就是说对冲引擎只负责算“我要交易多少数量”不关心这笔单是拆 10 笔还是一笔下完、限价单还是市价单。2.3 模块划分AutoHedge 的五个组成部分AutoHedge 整体分成数据层、持仓层、计算层、执行层、风控层五块。每块只干自己的事通过内存消息队列互相通信。数据层负责订阅所有标的的行情、期权合约的逐笔和快照数据以及期货和现货的盘口。持仓层维护一套独立于交易所的本地持仓账本既记录名义持仓也记录每次调仓后的成本这个内部账本用来计算实时盈亏和真实敞口。计算层是核心它根据市场数据不断重算组合整体的 Greek再与阈值比较得出对冲操作建议。执行层负责把建议转成真实订单处理部分成交、撤单、重挂。风控层独立于其他模块任何异常都在这里终结——成交偏差过大、掉线重连、报价延迟超阈值、订单超时都会触发熔断并通知我。这套拆法是我从一波漫漫长路的教训里总结出来的。最初版本把计算和风控混在一起后来发现一旦行情数据出现异常延迟计算层会把错误数据直接当成正常输入而此时风控也在同一条进程里没法单独拦截结果有一次在回测里就直接跳出了一个特别离谱的大单。拆开以后风控层可以盯着其他所有模块的“输入—输出”信息流做校验发现问题前一脚就踩刹车。3. 核心参数与对冲逻辑的“为什么”3.1 为什么选 Delta、Gamma 做为主控指标很多人在做对冲组合时喜欢看一堆指标叠加但实际跑下来你会发现大部分情况下真正会导致你亏损的风险就那几个希腊字母。Delta 反映价格方向性变化对组合净值的影响Gamma 反映 Delta 自身的变化速度。如果组合 Delta 接近零价格小幅波动对净值的影响基本被对冲掉了如果 Gamma 负向暴露大标的稍一波动Delta 就会快速跑偏反而可能需要更高的对冲频率来弥补。AutoHedge 默认把 Delta 和 Gamma 作为一级控制指标Vega波动率变化敏感度和 Theta时间流逝敏感度只在组合结构变化较大时才作为辅助监控项。原因很简单我想要一个能自动对真实资金产生保护的系统不是要一个看着很精密的金融实验。绝大多数对冲需求用 Delta Gamma 就足够解决问题参数少逻辑透出问题也好排查。具体到实现上AutoHedge 并不是简单地对全体头寸算一个总 Delta而是先把所有期权按“标的合约 到期月份”分组再在组内做并行计算。这样既能在标的层面做跨期汇总也能单独看清楚近月和远月的 Gamma 分布差异不至于因为近月高 Gamma 被远月低 Gamma 冲淡而发生“账面上对冲好了实则近月 Gamma 井喷”的问题。3.2 对冲触发阈值与再平衡频率怎么定这里是最容易想当然了的地方。阈值设置太紧手续费和滑点成本会吃掉收益太松组合风险敞口又得不到有效控制。AutoHedge 采用的方案是“动态带宽”机制阈值不是固定不变而是根据当前市场的波动程度自动伸缩。基础公式是Delta 容忍区间 组合 Gamma × 预期价格区间 × 调整系数 约大于一笔对冲单的最小可交易量也就是说当波动率低时预期价格区间小容忍带宽收窄波动率高时容忍带宽放宽。这个设计的目的是让系统在安静行情下更精准在剧烈波动中不过度反应。调整系数我一般取在 0.3 到 0.8 之间回测时按不同合约分别调。再平衡频率方面AutoHedge 不按照固定时间间隔硬对冲而是采用“事件驱动 定时巡检”双模式。事件驱动模式下只要某个标的组的 Delta 突破当前容忍带并且当前可交易量达到最小单位要求就生成对冲信号定时巡检则每 5 分钟或 15 分钟对全天持仓做一次整体快照防止某个标的组长时间没有行情更新导致遗漏。这两种模式互补的好处是事件驱动保证了瞬时冲击快速响应定时巡检保证了漏单情况兜底。3.3 对冲工具的选择现货、期货还是期权AutoHedge 支持三种对冲工具但默认顺序是期货优先、现货次之、期权最后。首选期货是因为期货盘口深度通常比期权好成交对价格冲击小保证金使用效率也高并且没有到期日管理问题。只有在某些标的期货流动性太差或者期货合约基差波动太大导致对冲效果失真时才会自动切换到现货。第三种用期权来对冲期权逻辑上虽然可以构造出更精细的组合但对冲成本高、持仓管理复杂AutoHedge 第一版中我看重的是实用性只在特殊风控需求下才动用这个选项。执行对冲单时AutoHedge 还会做个重要计算目标下单量不是简单地“当前 Delta 缺口”而是会加上一个“前瞻项”——根据当前 Gamma 与未来一小段时间的预期波动估算出从下单到成交这段时间里 Delta 可能走多远再在目标量上做个修正。这个前瞻项的本质类似一点“在延迟中预判”你的执行延迟越大前瞻修正就越大执行速度越快越接近裸 Delta 缺口。经过回测加了这项后模拟盘的对冲成本平均能下降 10% 到 18%虽然看起来不多但放在高频动态对冲里就是实打实年化收益。4. 实操过程与关键环节实现4.1 数据层落地细节行情数据是整套系统的基础如果这里出的数据不干净后面计算全白搭。我在 AutoHedge 里用的是双路数据通道正常行情主链路走交易所的普通行情推送另外拉一条备用链路做延迟校准。延迟校准的原理比较直观两个通道同时接收一个相同标的的行情通过计算两个通道到达时间差和盘口快照序号差可以判断主力行情链路有没有出现明显堆积。比如当主链路最后一条行情快照序号比备用链路落后超过 200 毫秒且持续 2 秒以上我就认为主链路拥堵系统自动切换数据源。这个毫秒级的细节在普通行情交易里也许不重要但在动态对冲里标的快速拉升时慢半秒入场和快半秒入场执行成本能差出好大一截。数据层另一件小事很容易被忽略行情快照里盘口的价和量一定是同时更新的但有些数据供应商会把价格推送和数量更新拆成两条消息发如果直接用最新收到的一条去覆盖旧字段盘口会出现“价格变了但量还是旧量”的错位问题。我的做法是为每个标的单独维护一个内部盘口对象任何字段到达只更新对应字段不整体覆盖然后由计算层定时从内部盘口快照里提取当前最优买卖价和数量。4.2 持仓账本与内部定价AutoHedge 的持仓账本在每次成交回报到达后更新。除了常规的手数、开仓均价、浮动盈亏我还会记录一个非常重要的字段——“上一次有效对冲价格”。这个字段的作用是在算Delta前把持仓的入场价格和当前市场价格做差判断该笔持仓是以新股还是老股形态存在。如果是系统性加仓该笔头寸会直接参与 Delta 汇总如果是前期对冲残留的单子则会被单独标记避免它反复被当做新主仓位参与对冲计算造成系统“自对冲”反复摩擦。有些朋友可能习惯直接用交易所的持仓盈亏接口来算但那只能给你毛盈亏无法判断哪些仓位应该算进对冲目标池。AutoHedge 自己的账本能做到这个区分这是我后来复盘整个项目时觉得最值得的投资。4.3 计算层希腊值聚合与对冲信号生成计算层每收到一次行情更新都会触发一次对受影响标的组内所有持仓的希腊值重算。这里有两个性能优化点第一期权定价模型并不需要对每个合约都跑全量计算。AutoHedge 维护了一个“定价模型缓存”同一标的、同一剩余期限的合约共用同一个隐含波动率曲线参数。只有当某个合约的盘口价格与理论定价模型偏差超过某个阈值时才触发该合约的独立重新计算否则直接采用缓存值近似。第二对不同月份合约采用不同的定价精度。近月合约时间价值衰减快Gamma 变化敏感我用全量迭代定价远月合约价格相对稳定直接用批量近似算法。这样算下来计算层对 CPU 的消耗比初版全量计算降低了约 70%而计算误差在可控范围内。信号生成逻辑按如下顺序执行对每个标的组计算当前总 Delta、总 Gamma计算容忍带上下边界判断当前 Delta 是否越界若越界计算理论对冲目标量加上前瞻修正生成对冲信号附上预估滑点和冲击成本预算将信号发送给风控层校验再转执行层。4.4 执行层订单状态机与成交滑点控制执行层监控订单状态时自研了一套简洁的三态状态机新建态、委托态、完成态。每个对冲信号会拆成一个或多个子订单每个子订单独立状态流转。子订单一旦触发“超时未完全成交”风控层会先阻止后续新信号进入执行通道避免订单堆积再根据当前盘口价格决定是撤单重挂、缩小数量继续挂、还是切换对手方向。开单逻辑里我特意做了“限价单优先超出容忍价位立刻转市价单”的处理。原因是纯限价单容易吃不到行情尤其快速行情下挂单没保证纯市价单又容易被第一档吃穿导致成交价跑偏。AutoHedge 在生成对冲信号时会附带一个“最大可接受成交偏差”一般设为当时盘口买卖价差的一半如果限价单在设定时间内没有成交系统自动检查现价是否仍在“可接受成交区间”内若在就继续用新限价价重挂若已超出区间才允许转市价单。我把这点单独拎出来说是因为很多人做自动交易时只关注信号准不准完全忽略订单在网络传输过程中实时价格和报价档位的变化对成交质量的影响。这个细节如果不处理好“成交回来一看好大的滑点”几乎必然发生。4.5 风控层熔断与异常恢复风控层是 AutoHedge 里最无趣但最不可缺的一块。我的熔断条件有六条连续成交偏差超过预设阈值累计达到 3 次熔断 15 分钟期间只监控不交易单笔对冲成交的时间开销超过常规范围的 3 倍熔断 5 分钟并记录日志详细数据行情链路切换超过 3 次熔断 30 分钟并强制人工确认本策略日累计对冲亏损超过当日最大容忍亏损值直接熔断到第二天开盘持仓账本出现无法解释的持仓数量缺口比如几笔成交回报丢失立即停止所有下单引擎系统时间偏差超过 500 毫秒先同步时间再继续。这些条件不是写死的每一条都有一个开关和一个可调参数方便在模拟盘阶段不断试。但触发后必须人工确认才能复位的逻辑我建议永远不要关掉。全自动交易系统最怕的不是出错而是出错之后还在自动运行那就像一辆没刹车的车在下坡路狂奔一定会出大事。5. 回测与模拟盘那些事5.1 回测口径怎么定才不容易骗到自己回测中的手续费、滑点和资金占用利息很多人在初期工程阶段会混淆“毛回测”和“净回测”。我建议从一开始就直接用净回测口径手续费按真实交易所标准滑点按当时买卖价差的至少一半来估算资金占用成本按账户实际融资利率折算此外再加一个冲击成本模拟。实际做下来AutoHedge 的净回测结果比毛回测要差不少尤其高频次的对冲策略每次对冲如果多 0.5 个 tick 滑点一个月累计下来可能吃掉好几个百分点的收益。如果你在做这类策略回测时只看“毛利”或者“理论价格息差”那基本等于给自己画饼。另一个容易忽略的回测口径是“策略容量”。AutoHedge 在回测里会同时输出每个标的组在每个时点的订单需求量与当时市场成交量的比值。超过某一比例比如 5%就标记为“流动性不足时段”。这些时段在真实盘中往往都会伴随滑点剧增因此在最终评估时我会将这部分样本直接剔除或做保守减值。很多人做回测结果非常漂亮一上实盘就崩多半就是没做这个处理。5.2 参数优化与过拟合防范做这类项目一定会遇到“参数整定”的诱惑把回测跑上几百次每次都换一组阈值挑出最漂亮的一组参数直接上实盘。我必须诚实说这种做法非常危险。AutoHedge 里的关键参数比如容忍带宽系数、前瞻修正系数、订单超时时间在优化时如果只看回测净值曲线极易出现过拟合。我的做法是分样本训练和验证。取最近两年的历史数据前 18 个月做参数筛选后 6 个月做样本外验证。只有在样本外仍然稳健的参数组合才会进入下一轮模拟盘测试。这个方法不算新颖但确实能避免大量“自欺欺人”的回测结果。此外我在 AutoHedge 里加了一个“参数漂移侦测”功能在模拟盘运行时每隔一段时间记录当前盘口的实际波动率和系统预设波动率的偏差如果偏差持续扩大说明参数可能已经不适应市场变化系统会提示我把参数往当前波动水平靠拢。5.3 模拟盘阶段我的验收标准AutoHedge 在真实成交之前我先跑了约 4 周纯模拟盘。验收标准我现在整理成一套自检清单其他人也可以参考模拟盘日净值回撤不超过 2%且最大回撤出现在正常市况下而非异常行情中每日对成交次数约等于理论信号数量且订单撤单率不超过 20%平均成交滑点控制在半跳以内行情断线或延迟时系统在 30 秒内完成降级不出现失控开仓或漏单风控熔断触发后人工复位不卡壳操作流程清晰。如果这些标准里任何一项没有达成我都坚持继续调、继续回测而不是匆匆上实盘。系统可靠性是这类项目真正比拼的硬实力策略逻辑再漂亮执行环节一抖照样亏钱。6. 常见问题与排查技巧实录6.1 行情延迟导致的对冲滞后这个问题是最早发现的。在快速行情中如果主行情链路出现 100 毫秒以上的延迟AutoHedge 的对冲信号会明显滞后成交价往往落后于实时价格。排查时我先检查网络延迟和行情订阅配置后来发现真正的问题在于数据层的缓存机制当行情消息量过大时之前某段价格的更新被暂时堆积到了队列尾部等我取到数据时盘口价格已经变了。解决方案有两个层面。第一给行情通道加优先级队列价格更新的优先级高于盘口量更新和成交回报确保关键信息能先处理。第二在计算层加一个“行情新鲜度”校验——如果当前盘口快照的时间戳与系统当前时间相差超过 300 毫秒就跳过本轮计算。这样虽然偶尔会少算一个小节但至少不会基于过期数据做出错误对冲决策。6.2 订单状态不同步导致重复下单有段时间 AutoHedge 在模拟盘频繁出现“同一标的同一方向的重复对冲单”。查日志发现当一笔订单的回报延迟到达时执行层已经把当前仓位的 Delta 缺口重新计算了一遍并生成了第二个信号两笔订单互相叠加导致总头寸偏离预期。这个问题的根源是订单状态机里少了“订单飞行时间”这个概念。后来我在每个标的组的信号生成流程里增加了一个“禁止重叠”标记当某标的组已有在途的对冲单时新信号必须等待那个在途单完成结算后才能生成。这一条简单有效地解决了重复下单问题。6.3 合约到期切换导致持仓缺口期权有到期日临近到期时流动性会迅速衰减按正常流程下单容易产生巨大偏差。AutoHedge 期初没有处理这点结果在一次模拟盘里某个标的的 7 月份期权在到期前一两天流动性骤降系统仍按常规信号量下单最终成交价远偏离可成交区间。后来我加入了一条“到期日保护”规则对剩余期限少于 3 天的期权合约系统会自动收紧信号权重优先建议用户提前将这部分仓位移仓或平仓而不是继续作为对冲主仓位运行。另外对所有期权合约的“最小可交易量”做了精细化定义——当盘口深度无法支持最小下单量时信号直接降级宁可不交易也不能乱交易。6.4 常见问题速查表现象可能原因排查方向解决办法对冲信号明显偏晚行情链路延迟高用备用链路比对快照序号增加数据新鲜度校验切换备用通道同合约重复下单在途订单未标记查看执行层状态机日志增加“在途单禁止重叠”逻辑成交滑点异常大限价单未兑现转市价单时机过晚检查订单超时设置与盘口深度缩短超时时间收紧转市价单触发条件到期合约流动性不足未对短期限合约做特殊处理检查到期日保护规则是否启用加入到期日保护提前移仓熔断触发后频繁重启风控阈值设置不合理回看触发日志分析间隔适当放大阈值但保留人工确认环节6.5 另一个容易被忽视的细节时间同步自动交易系统极度依赖时间同步尤其涉及订单时间戳计算和延迟判断时。如果本地机器和交易所服务器时间偏差过大所有基于时间戳的行情新鲜度校验、订单超时判断都会出错。AutoHedge 每隔一段时间会用 NTP 对时并监控本机时间偏移量一旦超过一定阈值就暂停交易避免在用错误的时间轴处理交易逻辑。7. AutoHedge 还能往哪些方向延展我自己在跑通这套引擎之后紧接着琢磨了两个扩展方向虽然不是核心功能但值得提一下。第一个方向是把对冲工具范围扩大。目前默认工具是期货但某些场景下用期权组合可以对冲更细致。比如要保护某个卖出的跨式组合用多个不同行权价和到期月份的期权构建Delta中性组合能做到波动率维度上的精细剪切。AutoHedge 的逻辑框架已经支持多品种、多工具组合的希腊值聚合只是执行层还需要加一套更复杂的订单优先级和撮合策略。第二个方向是结合盘口微观结构做执行优化而不只是等待最优买卖价。比如可以在执行前先评估当前订单簿的深度分布把目标量拆成不同价格档位分别挂单而不是一股脑只在一个价位上打。这种拆单策略能有效降低冲击成本尤其在成交量不大的标的里非常有效。如果你自己也在做类似的对冲工具项目我的建议是先从单个交易策略跑通最简功能闭环不要一开始就想着全品种、全策略、全自动。AutoHedge 从最初只监控一个标的的 Delta 到后来能处理多标的组并行对冲中间每一步都验证清楚再做下一步。稳妥比花哨重要得多。写在最后的体会做 AutoHedge 这个项目给我最大的感受是一个自动化工具能不能真挣到钱、控住风险百分之四十取决于策略逻辑百分之六十取决于执行和风控细节。你可以在理论上把希腊值算得很准但一次行情延迟、一笔订单状态没同步就可能把前期所有优势抹平。也许对个人交易者来说未必需要做到我这种五层模块、双路数据的工程规模但把Delta/Gamma监控、执行状态机、异常熔断这三个最小集做扎实已经能给交易带来非常不一样的体验。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进