资讯动态

基于Backtrader的备兑策略动态化改造:趋势、Delta与波动率联动调仓

发布时间:2026/10/16 19:24:25 来源:尧图企业网站定制
做备兑策略的朋友应该都有过这种体会一开始按教科书选了个行权价觉得稳了结果市场风格一变策略表现立刻拉胯。我在自己的模拟组合里踩过同样的坑——固定卖平值看涨期权标的一路上行权利金是收了几个月但最后到期被行权持仓被call走收益上限硬生生被削掉一大截行情转弱之后又舍不得调行权价结果权利金没覆盖多少下跌还占着保证金。后来我认真做了一件事把备兑策略的决策逻辑从固定行权价固定周期改成依据趋势、波动率、持仓Delta等状态动态调整并且在Backtrader框架里做了一整套可回测的实现。这套东西跑下来光看收益曲线相比固定参数版本整体平滑不少最大回撤也明显收窄。这篇就用实战过程讲清楚几个事备兑策略为什么经不起市况变化、判断市况该看哪些维度、Backtrader里怎么把期权备兑策略落地成代码以及实测中容易踩的坑。1. 为什么固定参数的备兑策略跑不赢躺平1.1 备兑策略的收益结构拆解先回到备兑Covered Call最基本的定义持有标的资产多头的同时卖出相同数量对应的看涨期权。本质上是拿上行收益换时间价值收益。你收到的权利金来自买方为未来标的上涨支付的权利而你承担的义务是如果到期标的价格高于行权价你要么按行权价交出持仓要么提前平仓期权承担价差损失。这个策略的损益曲线可以拆成三段标的价格低于行权价期权作废你赚全部权利金同时承受标的下跌的损失标的价格在行权价附近小涨小跌时权利金成为主要利润来源标的价格大幅高于行权价期权买方行权你的持仓被按行权价卖走最大收益锁定在权利金行权价与建仓价的价差。所以备兑策略天生就是一个温和的、偏向震荡和慢牛的策略。它最大的敌人不是下跌——下跌时权利金能垫一部分缓冲它最大的敌人是快速上涨之后你不调整行权价导致整个组合被锁定在较低的收益上限。1.2 固定行权价在牛熊市中的两种失效固定参数备兑比如永远卖出Delta约0.3的当月虚值期权在市况变化时会有两种典型失效第一种趋势性下跌市中期权权利金持续变薄。卖出期权的Delta和Gamma都在变化下跌过程中隐含波动率通常也在抬升权利金短期看着不少但标的方向性亏损远大于权利金缓冲。你如果不加趋势过滤等于赤手空拳接下整段下跌。第二种快速上涨市中卖出的看涨期权从虚值变成实值持仓Delta被大幅削低。表面看账户没亏但你错过了大量上行收益。更麻烦的是一旦到期被行权你需要重新买入标的建仓此时价格已经远高于上次建仓点相当于强制做了个高买低卖。有人会说那我一直卖平值权利金最高不就行了也不是。平值期权被行权的概率高频繁被行权会让交易成本和税负吃掉收益而且2020年到2022年这类行情里平值备兑的回撤一点不比持有指数小。问题不在该卖哪个行权价而在你有没有根据市况切换。2. 判断市况变化的三个维度趋势、波动率、Greek敏感性说到适应市况第一反应可能是加一堆技术指标比如MACD、RSI但这容易过拟合。我自己的做法是从三个维度入手趋势方向、波动率环境、持仓Greek状态。每个维度解决一个具体问题。2.1 均线斜率与趋势过滤器趋势过滤的作用是回答一个问题现在该不该卖出看涨期权或者说该保持多大的净多头暴露。我用的是长期均线斜率而非简单的价格与均线位置关系因为后者在震荡市里假信号太多。具体实现取标的收盘价的60日均线计算其过去10个交易日的斜率并将斜率除以同期ATR平均真实波幅做标准化。这样能去掉不同标的绝对价格、波动率水平不同的影响。斜率高于阈值比如0.1表示趋势向上且力度足够保持卖出看涨期权但可以偏向更虚值留出上行空间斜率低于负阈值停止卖出看涨期权甚至完全平掉已有卖方仓位斜率在中间区域维持中性行权价或者重回备兑。这套过滤逻辑在Backtrader里很简单一个指标循环就够。关键是斜率标准化这一步很多人忽略导致不同标的之间参数不通用。2.2 历史波动率分位与隐含波动率观察备兑策略赚的是波动率溢价所以波动率环境直接决定这条生意还值不值得做。实操上我会维护两个数据一是标的历史波动率HV在过去一年中的百分位比如HV当前处于80%分位说明近期波动已经很剧烈二是隐含波动率IV的观察如果手头没有完整的IV曲线数据可以拿候选期权的平均隐含波动率替代。为什么这对备兑很重要因为备兑想赚钱本质上是希望卖得贵。隐含波动率越高同等行权价的期权权利金越厚。当IV处于历史高分位时卖出期权的性价比极高哪怕预期波动温和也能拿到肥厚的权利金当IV处于低分位时权利金收入微薄而一旦市场意外波动卖方很容易陷入被动。所以我会把IV分位当作一个仓位系数IV高分位时可以适度把备兑仓位开满IV低分位时把备兑仓位降半并优先选择更虚值的合约。2.3 Delta、Theta、Vega如何影响备兑收益第三个维度是持仓本身的Greek状态。很多人盯账户盈亏但备兑策略需要盯的是组合Delta。卖出看涨期权后组合Delta大致等于1减去卖出期权的Delta比如卖出Delta 0.3的期权组合Delta约0.7。这意味着标的每涨1%组合预期涨0.7%。不同行权价、不同到期时间下这个数值变化很大。更进一步Vega暴露也需要关注。备兑组合整体Vega是负的卖出期权带来负Vega隐含波动率上行时组合吃亏下行时占便宜。所以在IV快速抬升的阶段持有卖出期权需要额外警惕如果趋势过滤器已经转弱这时候及时平掉卖方仓位比死扛更务实。3. Backtrader策略骨架数据准备与期权模拟3.1 期权合约数据的处理思路回测里处理期权数据有两种做法一种是用真实的期权合约日线序列包括开盘价、收盘价、持仓量另一种是用定价模型生成模拟价格比如拿标的日线数据用Black-Scholes公式反推期权理论价。我强烈建议如果你是在设计策略逻辑阶段优先用真实期权合约序列或者基于实际IV曲线生成的模拟序列不要直接用BS理论价因为BS价格没有反映买卖价差、流动性、以及IV的期限结构变化。回测结果会过度乐观。我自己采用的是标的数据期权合约表的结构标的ETF日线用于计算趋势过滤器、波动率指标、判定信号期权合约表每个交易日对应的候选合约列表包含行权价、到期日、Delta、权利金或者IV、成交量、持仓量。这里有个容易踩的坑期权合约序列需要做复权处理。标的分红除息会导致期权行权价调整合约代码不变但行权价会变。如果不做复权回测中会看到价格莫名其妙跳空。3.2 策略骨架搭建与回测主流程Backtrader里的策略骨架大概是这样的import backtrader as bt import numpy as np class AdaptiveCoveredCall(bt.Strategy): params dict( trend_period60, slope_lookback10, atr_period14, delta_target0.30, delta_min0.15, delta_max0.45, iv_percentile_high0.8, iv_percentile_low0.2, ) def __init__(self): self.ma bt.indicators.SMA(self.data.close, periodself.p.trend_period) self.atr bt.indicators.ATR(self.data, periodself.p.atr_period) # 斜率标准化 self.slope (self.ma - self.ma(-self.p.slope_lookback)) / self.p.slope_lookback / self.atr def next(self): # 每个交易日检查趋势状态、波动率状态、当前持仓Delta trend_state self._get_trend_state() iv_state self._get_iv_state() self._adjust_position(trend_state, iv_state)这只是最外层的骨架。真正麻烦的是在next()里维护一个当前是否有未平仓期权的状态机。因为Backtrader原生不识别期权合约你需要自己管理开平仓标记比如用一个dict记录当前卖出的期权合约代码、开仓日期、权利金、到期日。我的做法是把期权视为一种独立的数据源但不放进Backtrader的主数据流而是单独构造一个期权合约查询接口。这样回测主循环只需要处理标的行情在需要调仓的日子去查询合约列表然后记录虚拟成交。回测结束后的绩效统计再统一汇总。def _get_trend_state(self): if self.slope[0] 0.1: return bull elif self.slope[0] -0.1: return bear return neutral4. 关键逻辑行权价选择与调仓规则的动态化4.1 动态行权价Delta目标区间固定备兑和动态备兑最大的差异就在这里每次调仓时不是机械地选一个固定行权价而是根据当前市况计算目标Delta。具体方法候选合约表里每个合约都有Delta值我设定一个目标Delta区间比如delta_min0.15、delta_max0.45然后选择区间内最接近目标Delta的那个合约。市况偏多时目标Delta可以设在0.25左右市况偏空时目标Delta设在0.40左右这样给组合留了更多下行缓冲。这个逻辑本质上是动态调节放弃多少上行收益去换取多少保护。Delta越低卖出期权越虚值权利金越少上行空间留得越大Delta越高权利金越多但被行权概率增大下行缓冲效果更弱。市场状态决定取舍方向。4.2 调仓触发条件滚仓与止损确定了目标Delta之后什么时候调整我用了三个触发条件到期前3个交易日如果期权没有被提前行权场内ETF期权很少提前行权平掉旧仓、换开下月仓持仓期间如果当前期权的Delta漂移超出预设容忍区间比如目标Delta 0.3实际Delta漂到0.5以上或者0.15以下触发提前滚仓趋势过滤器从多翻空时立即平掉卖方仓位不再等待到期。这里面Delta漂移触发滚仓是控制风险的核心。Delta漂移意味着行权价相对现价已经从虚值变成平值甚至实值此时权利金大幅变贵继续持有的风险收益比已经不划算。提前平掉再换一个更虚值的合约等于把上行空间重新打开代价是支付一次价差成本。4.3 仓位管理与保证金考量很多人忽视一个致命问题备兑策略看似不需要额外保证金但实际交易中卖出期权会冻结持仓市值的一部分作为保证金不同券商比例不同通常在期权面值的20%到40%之间。回测时如果不模拟保证金约束策略可能在极端情况下触发券商强平。我建议在回测里加入一个简单的保证金模型每次开仓后计算已用保证金要求总保证金占用不超过账户净值的50%。保证金占用 行权价 × 合约乘数 × 张数 × 保证金比例这样在行情剧烈波动、卖出期权Delta快速上升时保证金占用增加策略会主动降低开仓规模或选择更虚值的合约。这一步做与不做回测结果差异非常大尤其在极端行情年份。5. 回测对比固定备兑 vs 动态备兑的数据验证5.1 回测场景与参数设置为了验证动态备兑是否真的有效我设计了一个对照实验回测区间覆盖一段包括震荡、上涨、下跌不同市况的时间段比如某指数ETF近三年日线基准固定备兑策略永远卖当月虚值一档看涨期权到期滚仓动态备兑使用前述的趋势过滤、IV分位系数、Delta目标区间动态调整初始资金100万每次只用50%仓位开备兑剩余50%作为保证金缓冲。两份策略使用相同的期权合约表、相同的滑点假设每张期权开平仓各滑1跳和相同手续费。这样对照才公平。5.2 结果对比表与关键指标解读回测下来的数据大致如下数字为示意性结果不同标的有差异指标固定备兑动态备兑年化收益率9.2%11.6%最大回撤-16.8%-11.3%年化波动率12.5%10.7%夏普比率0.620.94盈利月份占比63%74%平均每月权利金收入0.84%0.77%动态备兑的年化收益率高2.4个百分点最大回撤少了5.5个百分点夏普比率明显改善。最值得注意的是平均每月权利金收入反而比固定备兑略低说明收益改善的主要来源不是多收了权利金而是躲掉了大段不利行情、保留了更多上行空间。这一点对理解备兑策略非常重要动态调整的核心价值不在于让你每次都抓住最好的卖出时机而在于避免在最差的环境下硬扛。6. 实测中的坑与注意事项6.1 期权价格序列的复权问题这是回测中最容易犯的错也是最大的隐藏坑。某只ETF在分红除息日对应期权合约会进行行权价调整但如果你的数据源没有做复权期权价格在除息日会跳变可能多出一大段莫名其妙的收益或亏损。我在第一次回测时就遇到过某ETF每年分红一次固定备兑策略的年化收益率凭空多了1.5个百分点查了好几天才定位到是分红除息日的价格跳变。后来我干脆在数据预处理阶段对期权序列手动复权标的价格统一使用前复权期权权利金统一乘以前后价格比例系数。6.2 流动性过滤与滑点假设真实市场里同一月份、同一行权价的期权不同到期月份之间流动性差异很大。当月合约流动性最好次月次之远端合约可能一整天都没有成交。回测里如果不加流动性过滤策略可能会频繁交易一些几乎无法成交的远端合约造成严重滑点。我会设置最低成交量阈值比如每日成交量低于500张的合约直接排除同时每次开仓额外增加一跳到两跳的滑点估算。做完这两步策略的收益率会下降不少但可信度大幅提升。6.3 回测过拟合的信号动态备兑涉及的参数确实偏多均线周期、斜率阈值、IV分位阈值、Delta目标区间、滚仓容忍度。这么多参数一起优化很容易陷入过拟合。我的做法是除了趋势过滤的基础参数外其他参数尽量采用行业内常用的合理数值不对历史最佳值做过多的网格搜索。判断过拟合有一个很简便的方法——调整参数幅度不超过20%观察结果是否剧烈变化。如果某个参数从0.30改成0.32收益率就掉一半大概率是过拟合这组参数不够稳健。6.4 心态与执行层面的经验最后聊一点代码之外的体会。动态备兑策略在实际执行时最大的敌人不是回测失败而是不停手。市场从多转空策略逻辑上要求你平掉卖出看涨期权但你可能会想再拿几天说不定又能收一笔权利金。这多出来的几天往往就是回撤扩大的几天。我后来给自己定了一条铁律趋势过滤器转空无条件先平仓。收回的权利金是实实在在的落袋而重新入场永远有机会保住本金才是备兑策略的长期生存法则。这条纪律看起来简单可真正执行起来需要对自己诚实。另外动态备兑不是万能钥匙。在长期窄幅震荡市里它的表现可能不如简单的固定备兑因为频繁调仓会多消耗交易成本。如果判断市场进入极低波动区间老老实实拿着当月固定行权价备兑反而更适合。市况适应策略的重点在于适应而不在于一直折腾。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑