做期货量化这些年,我最大的感悟之一就是:策略的亏损往往不是方向看错,而是仓位没管住。 尤其在高波动行情里,明明信号体系判断都正常,价格一个急拉急砸,止损被打掉,资金曲线直接给你画一根大阴线。后来我把“波动率过滤”和“高波动减仓”这套逻辑加进策略框架里,才真正把回撤摁住。
这篇文章就围绕“期货量化策略中的波动率过滤_高波动减仓思路”这个主题,把我自己在实盘里验证过、踩过坑之后沉淀下来的完整思路拆开讲。内容包括:波动率指标怎么算、过滤阈值怎么定、减仓规则怎么设计、回测里有哪些容易骗自己的陷阱、以及实盘中必须盯住的坑。 适合已经有基础策略框架、但正在被回撤和连续亏损折磨的量化交易者参考。
1. 波动率过滤的核心思路:先搞清楚为什么要管住手
1.1 高波动环境下的真实痛点
我在刚开始做期货策略那阵子,用的都是比较经典的均线突破或通道突破类逻辑。策略在普通行情下表现不错,年化收益能看,最大回撤也能控制在合理范围内。但一到宏观数据公布、突发消息刺激、或者某个品种供需基本面出现剧烈变化的时候,价格波动会迅速放大,K线实体变长,影线乱插,均线信号频繁金叉死叉。
这时候策略会面临一个尴尬的处境:
- 趋势跟踪策略认为“波动大=行情大”,于是加大仓位进场,结果行情只是剧烈震荡,来回打脸。
- 短线策略认为“波动大=机会多”,于是频繁开仓,结果手续费加滑点把利润全吃光。
- 持仓中的策略因为波动率飙升导致止损位被瞬间击穿,滑点还特别大,实际亏损远超预期。
这几类问题的根源其实只有一个:策略的仓位管理和当前市场波动状态不匹配。 你在低波动环境里用1倍仓位没问题,但同样的信号在高波动环境里,价格单位时间内走过的幅度完全不同,风险敞口也完全不同。
1.2 波动率过滤的解决路径
波动率过滤的思路并不复杂,核心就一句话:把“波动率状态”作为策略的信号过滤器或仓位调节器。
具体来说有两种典型的用法:
- 过滤信号:当波动率超过阈值时,暂停开新仓,只处理已有持仓的减仓或止损。这个思路适合趋势策略,因为高波动往往伴随噪音,假突破比例很高。
- 调节仓位:当波动率升高时,按比例降低仓位;当波动率回归正常时,恢复标准仓位。这个思路适合所有类型的策略,本质上是给仓位加了一个“风险预算”控制。
我自己的实盘经验是:两者结合效果最好。 先用波动率阈值过滤新开仓信号,再用波动率的相对高低动态调整已有持仓的加减仓比例。这样既能避免在高噪音环境里频繁进场,也能避免单笔极端行情把账户打穿。
注意:波动率过滤不是万能的,它本质上牺牲了高波动阶段的潜在暴利机会。比如一波真正的大趋势启动时,波动率必然放大,如果你完全过滤掉高波动信号,就会完美错过主升浪。所以“过滤”和“减仓”的尺度需要反复权衡,这也是后面要重点展开的部分。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 波动率的计算与度量:选对指标比调参更重要
2.1 ATR(平均真实波幅):最常用的波动率指标
在期货量化里,最常用的波动率指标是ATR(Average True Range,平均真实波幅),由Welles Wilder提出。它衡量的是单位时间内价格的真实波动范围,对跳空缺口也比较敏感。
真实波幅TR的计算方式:
- TR = max(最高价 - 最低价, |最高价 - 前收盘|, |最低价 - 前收盘|)
也就是取“当日最高最低价差”“当日最高到昨收的价差”“当日最低到昨收的价差”这三个值中的最大值。这样处理是为了避免跳空导致波动率被低估。
ATR就是对TR取N周期平均,常见参数是14或20。我自己的习惯是在日线级别用20,在小时级别用14,因为不同周期下噪音的衰减速度不一样。
ATR最直接的好处是可以给出一个“绝对波动幅度”的值。比如螺纹钢当前价格4000,ATR(20)=80,意味着平均每个交易日价格波动约80个点,大概2%。如果哪天ATR突然扩大到150,说明当前波动状态已经明显好于往常。
2.2 历史波动率(标准差)方法
除了ATR,另一种常用的是历史波动率,即对收益率序列取标准差,再折算成年化值:
- HV = 收益率序列的标准差 × √252
这个指标在期权定价里很常见,但在期货趋势策略的波动率过滤中,我个人认为不如ATR直观。原因有二:
- 历史波动率用的是收益率数据,它描述的是“相对波动”,而ATR描述的是“绝对波幅”。做止损和仓位管理时,绝对波幅更接近真实的止损距离和风险敞口。
- 历史波动率对极端值的反应比较平滑,虽然它更稳定,但在需要快速应对剧烈行情时反应偏慢。
不过历史波动率有个优势是可以用百分位来判断当前波动率处于历史什么水平。比如计算过去250个交易日的历史波动率分布,当前HV处于95%分位以上,说明市场进入极端高波动状态,这时候触发减仓逻辑就很有说服力。
2.3 波动率区间的动态估计
有时候单一指标的绝对值不够用,因为不同品种的波动特征差异巨大。比如原油和玉米的ATR数值完全不是一个量级。所以我自己在实盘里会更倾向于用“波动率相对位置”来做判断,而不是直接用ATR的绝对数值。
具体做法:
- 滚动计算过去N根K线的ATR序列。
- 计算当前ATR在这个滚动序列中的百分位排名。
- 设定阈值,比如当前ATR处于80%分位以上视为高波动,低于30%分位视为低波动。
举个例子,某品种过去100个交易日的ATR序列里,最低值是60,最高值是220,当前ATR是185。如果按百分位算它大概处于90%分位以上,那就可以判定为高波动状态,触发过滤或减仓。
这种方式的好处是:不同品种、不同周期之间可以直接复用同一套参数。 因为最终判断的都是“相对状态”,而不是绝对数值。
实操提示:百分位窗口太短会导致阈值频繁跳动,我测试下来,日线级别用120到250天的窗口比较稳定,小时级别用60到120根K线比较合适。窗口太短,比如20根,ATR百分位容易剧烈变化,导致过滤信号频闪,反而增加操作频率。
3. 高波动减仓信号的设计与实现:从想法到可执行规则
3.1 阈值怎么定:不要迷信固定数值
波动率过滤阈值的设计,我见过很多新手直接把ATR的倍数当阈值,比如“ATR超过近20日均值的1.5倍就减仓”。这个思路可行,但有一个隐患:它默认了ATR的分布是稳定的,实际很多品种的ATR分布是偏态的,尤其在趋势行情中ATR会持续维持在高位。
我建议的做法是“分位数阈值 + 缓冲区间”,具体拆分如下:
- 用滚动窗口计算ATR的百分位,比如过去120根K线。
- 设定高波动阈值,比如85%分位,触发减仓。
- 设定恢复阈值,比如60%分位,允许加回仓位。这里故意留出缓冲区间,避免仓位在阈值附近反复跳动。
为什么恢复阈值要低于触发阈值?因为ATR在剧烈波动后往往不会立刻回落到正常水平,而是在高位维持一段时间。如果触发和恢复用同一个阈值,一旦ATR在阈值附近反复穿越,仓位管理逻辑就会频繁开仓减仓,不仅增加手续费,还会让信号逻辑完全混乱。
3.2 减仓规则怎么写:分档减仓比一次性砍仓更稳健
“高波动减仓”听起来简单,但具体减多少、分几步减、什么时候减,需要结合策略类型和品种特性来设计。
我常用的分档减仓规则模板如下:
- 当ATR百分位 ≥ 85%且 < 95%:仓位降至标准仓位的60%。
- 当ATR百分位 ≥ 95%:仓位降至标准仓位的30%。
- 当ATR百分位回落到60%以下:仓位恢复至标准仓位的100%。
这里有几个关键细节:
- 减仓是“逐步”的,不是“一步到位”。因为高波动状态出现后,你无法确定它到底是行情启动的前兆还是纯粹的情绪宣泄。如果一次性砍到0,万一后面真是大趋势,你就只能看着别人赚钱。
- 减仓的逻辑是“风险预算控制”而非“方向判断”。也就是说,你并不是预测行情要跌,而是意识到当前每手合约承担的风险过大,主动缩小敞口。
- 当仓位降低后,止损距离也可以适当放宽,因为波动率放大时,市场噪音幅度也在放大,用原来的止损距离很容易被扫掉。
3.3 恢复机制:什么时候把仓位加回来
这个问题很多人会忽略,但恰恰是决定策略最终收益的关键。我见过不少策略在减仓后就没下文了,结果行情进入低波动震荡期,仓位一直维持低位,资金利用率极低。
恢复机制的设计要考虑三个问题:
- 用哪个指标作为恢复信号? 我推荐看ATR百分位回到低位区间,而不是看价格走势。因为波动率回落说明市场情绪已经稳定,这时候恢复正常仓位,后续即使出现趋势行情,也有充足的仓位去参与。
- 恢复是分步还是一步到位? 我自己的选择是分两步:先恢复到70%,观察确认波动率没有再放大后,再恢复到100%。这个确认周期我一般用3到5根K线。
- 恢复后是否要重新评估止损? 一定要。因为波动率环境变了,原来的止损距离需要按当前ATR重新计算,否则会出现“仓位恢复了但止损还是按高波动时期设置”的错配。
注意:恢复机制中最大的坑是“过早恢复”。波动率从高位回落到中位时,并不意味着市场一定会变安静,很多行情会在高波动和中波动之间反复切换。所以我宁可恢复得慢一点,也不要在波动率尚未稳定时过早加仓。
4. 回测中的关键设置与陷阱:数据不会骗你,但你会骗自己
4.1 回测框架里必须包含“波动率状态”
很多人在回测波动率过滤策略时,会在K线数据上直接计算ATR,然后按规则回溯“如果当时触发减仓会怎样”。这种做法方向对,但有一个常见漏洞:减仓后的成交价格和实际滑点没被合理建模。
高波动环境下,买卖价差会拉大,滑点也会显著高于正常水平。如果你在回测时仍然用固定的滑点假设,比如每手一跳,那么高波动减仓带来的保护效果会被严重高估,因为高波动时的实际减仓成本远高于低波动时。
我的做法是:在回测引擎里根据ATR水平动态调整滑点假设。比如ATR百分位高于85%时,滑点按正常水平的2到3倍计算。虽然这个倍数是拍脑袋定的,但至少比固定滑点更接近真实情况。
4.2 参数敏感性与过拟合:波动率过滤器也不是越多越好
波动率过滤器听起来是“加了保护”,但它同样会增加策略的复杂度。每增加一个参数,就多一个过拟合的机会。
常见的过度优化表现有:
- 把阈值调到刚好避开历史最大回撤的那个数值区间,但换个时间段效果就崩了。
- 同时叠加了ATR百分位、HV百分位、布林带带宽等多个波动率指标,导致信号层层嵌套,最终策略对任何单一指标都不敏感,纯粹变成曲线拟合。
- 在某个特定品种上精心调参后效果很好,但换到相关品种(比如螺纹钢换到热卷)就完全失效。
我自己的参数稳健性检验方法是:
- 把高波动阈值从75%扫到95%,步长5%,看策略绩效对参数的敏感性。如果收益曲线和回撤曲线随阈值平滑变化,说明参数依赖性不强;如果某个阈值附近绩效突变,就要警惕过拟合。
- 把策略放到同板块其他品种上验证。比如螺纹钢的参数,直接放到热卷、铁矿石上跑,如果绩效没有显著恶化,说明逻辑本身具备普适性。
经验之谈:波动率过滤器应该保持“极简”。一个ATR百分位就够用了,不需要叠加其他波动率指标。指标越多,参数空间越大,策略的脆弱性越高。记住,过滤器的目标是降低极端环境下的风险暴露,不是追求更完美的净值曲线。
4.3 回测时段的覆盖:必须包含高波动周期
回测数据的时间跨度,很多人习惯用近两年的数据,因为“市场环境更接近当下”。但波动率过滤策略的价值恰恰体现在极端高波动环境下,如果回测区间里没有经历过这类行情,策略的“保护作用”就完全没被验证到。
至少保证回测区间包含以下几类行情:
- 一段明显的单边上涨或下跌趋势,波动率持续高位。
- 一段宽幅震荡行情,波动率中等偏高。
- 一段低波动横盘行情,波动率明显收窄。
比如国内商品期货,2015到2016年的供给侧改革行情、2020年疫情后的宽幅波动、2021年的煤炭行情,都是很好的历史样本。如果回测区间刚好避开了这类时段,策略看起来再稳也要打个问号。
5. 常见问题与实盘心得:这些坑我都替你踩过了
5.1 高波动减仓时滑点失控怎么办
高波动减仓在执行时会遇到一个现实问题:减仓指令发出的时候,市场可能正在剧烈波动,价格跳空快速,限价单可能成交不了,市价单可能要付出很大的滑点。
我的处理方式是:
- 把减仓分成几笔小单执行,而不是一次性砸出去,降低对市场的冲击。
- 尽量在K线收盘前评估是否触发减仓,并在下一根K线开盘后执行,避免在K线中途价格剧烈跳动时盲目操作。
- 提前在策略里预设“熔断式减仓”规则:如果盘中ATR瞬间突破极高阈值,比如99%分位,就直接按市价减仓一半,不再等收盘确认。这种极端情况牺牲一点滑点,换取的是确定性。
5.2 波动率过滤导致交易频率骤降怎么办
这是很多策略加入波动率过滤器后遇到的第一个“不良反应”。原来一天开仓三五次,加了过滤后可能一周才开一两次仓,资金利用率明显下降。
解决思路有两个:
- 把过滤器的目标从“过滤信号”改为“调节仓位”。也就是说,高波动时不是完全不开仓,而是用较小的仓位参与,保证策略对行情的敏感度还在。
- 在多个品种上同时运行策略。因为不同品种的高波动期往往是错开的,A品种高波动过滤时,B品种可能正处于正常波动状态,多品种组合可以有效平滑交易频率的下降。
5.3 为什么我的波动率过滤在实盘里不如回测有效
这个问题我遇到过不止一次,排查方向通常有三个:
- 用了未来数据:比如计算ATR百分位时,用了包含当根K线收盘价在内的完整数据,但在实盘当时这根K线还没走完,导致回测里的信号偏乐观。解决方法是回测时严格用shift(1)滞后一期的ATR数据。
- 成交量或持仓量数据滞后:有些波动率算法里会叠加成交量或持仓量因子,但实盘里这些数据的更新频率和准确度不够,导致信号触发不准确。
- 手续费和滑点假设太乐观:前面提过,高波动时滑点会放大,如果回测没建模,实盘结果必然变差。
5.4 个人实操心得:过滤器要配合“交易计划”而非替代它
最后分享一点关于波动率过滤器的定位思考。在我自己管理期货量化账户的过程中,波动率过滤器和减仓规则的定位,始终是“风险预算管理工具”,而不是“行情预测神器”。它不会告诉你接下来涨还是跌,它只会在市场情绪极端化的时候,帮你的账户自动约束风险敞口。
这种思路落到交易计划里,就跟“仓位按风险预算分配”“单笔止损不超过总资金1%”这类资金管理原则是一体的。比如我之前在某个账户上把单笔风险控制在0.5%以内,配合波动率减仓规则后,即使某天遇到极端行情导致连续触及多笔止损,单日回撤也不会超过账户净值的2%——这在没有波动率过滤时是做不到的。
