上次分享一个我最近在 PandaAI QuantFlow 里做的期货策略实验:用动量与波动率构建复合因子,先做回测验证,再连接仿真交易观察执行效果。
这次来分享一下思路提供各位参考。这个策略表面上看是“动量因子组合”,但它并不是那种简单追涨杀跌的直线型趋势系统。
它更接近一种:在中短周期价格偏移中寻找相对有质量的回归机会,并通过波动率、流动性和趋势质量做过滤。
所以它的交易特性,实际更偏向一种受约束的均值回归风格,而不是裸奔式趋势追逐。
一、研究出发点
做期货因子时,我有一个很现实的观察:
单独使用价格动量,经常会遇到两个问题。
第一,动量本身容易被高波动噪声污染。
很多时候你看到的是“涨了很多”,但本质只是短期振荡被放大,继续追反而容易吃回撤。
第二,期货市场的不同品种节奏差异很大。
有的品种趋势延续性强,有的品种更容易日内脉冲后回落。如果只看一个周期,很容易被局部结构骗进去。
所以我的思路不是做单一动量,而是做一个复合因子:
- 用多周期动量捕捉价格偏移
- 用波动率结构过滤掉“太吵”的机会
- 用流动性避免信号落在难成交的地方
- 用趋势质量判断这段价格运动到底有没有“质量”
最后把这些内容压缩成一个统一评分,用于排序、选仓和回测。
二、核心因子设计
这次使用的核心类是:
class FuturesMomentumVolCompositeFactor(Factor):
整体结构可以分成五层。
1)多周期动量
我没有只看一个窗口,而是同时看了 5、10、20、60 个周期的收益变化:
- 5 周期:更敏感,捕捉短期偏移
- 10/20 周期:中间层,用来平衡噪声和延续性
- 60 周期:更慢,用于提供更稳定的背景方向
然后分别做截面标准化,再加权合成:
- 5 周期:0.25
- 10 周期:0.30
- 20 周期:0.30
- 60 周期:0.15
这一步的目的不是“迷信多周期”,而是避免策略变成单一频率的脆弱机器。市场是个会拧人的装置,单一周期太容易被它耍。
2)波动率与波动结构
波动率部分我不是简单地“喜欢高波动”或者“讨厌高波动”,而是分开看了三个维度:
- vol_20:当前中期波动率水平
- vol_10 - vol_60:短期波动率相对长期波动率的变化
- 日内振幅均值:高低点区间波动的活跃程度
具体理解是:
- 波动率水平越低越好,说明信号更干净
- 短期波动突然高于长期波动,往往意味着噪声增大,不一定是好机会
- 日内振幅过大,通常也意味着不稳定
所以这部分因子本质上在做一件事:
不要只看方向,还要看这个方向是不是在一个相对可控的波动环境里发生。
3)流动性过滤
期货回测最怕一种假象:
图上看起来收益很好,实际下单会滑点打脸
所以我加入了两类活跃度指标:
- 成交量相对20日均量
- 成交额相对20日均额
再把两者合成 liquidity 分数。
这样做的目的很直接:
优先考虑更容易成交、市场参与度更高的信号。
4)趋势质量
这里我用了一个简化版的“Sharpe-like”结构:
- 20日平均收益 / 20日波动率
这不是严格意义上的夏普比率,但它足够表达一件重要的事:
这段价格运动,到底是“有节奏地走”,还是“乱蹦出来的结果”。
如果一段上涨是靠极大波动硬顶出来的,那质量通常不高。
如果一段偏移在相对稳定的波动中形成,那它更值得信任。
5)统一复合、平滑与截断
最终复合权重如下:
- 动量:0.40
- 波动率:0.30
- 趋势质量:0.15
- 流动性:0.15
之后又做了三步处理:
TS_ZSCORE(composite, 20)做时间序列标准化- 把极端值裁剪到
[-5, 5] - 再
SCALE()缩放到[-1, 1]
这一步很关键。
因为原始因子如果不做约束,很容易被极端样本劫持,最后策略不是在交易逻辑,而是在交易离群点。离群点偶尔像天使,更多时候像喝多了的猴子。
三、为什么它看起来像动量,实质却偏均值回归
很多人看到“多周期动量”这四个字,会默认这是个趋势跟随策略。
但从这个组合的约束方式来看,它更接近:
寻找价格偏移后、在较低噪声与较高质量环境中的回归型机会。
原因有三点:
第一,它不是无脑追最强方向,而是用波动率和振幅对“过热信号”做了抑制。
第二,它对流动性和趋势质量有过滤,避免很多情绪型脉冲。
第三,复合后再做时间序列标准化与截断,实际上把过度激进的趋势暴露削弱了。
所以这个因子的交易风格更像:
- 利用动量识别偏移
- 利用波动率判断偏移是否失真
- 在更理性的结构中等待均衡回归或更稳健延续
这就是为什么我把它定义为:
动量驱动、波动约束、风格偏均值回归的期货复合因子。
四、调试与调整过程
从研究逻辑到工程落地:AI 助手参与的调试与修复过程
这次策略从因子研究走到平台回测、再连接仿真交易,并不是一次性顺滑跑通的。
在这个过程中,AI 助手主要承担了工程排障、编译修复和执行链路校验的角色,让我可以把更多精力放在因子逻辑本身,而不是反复陷在接口和运行环境的细节里。
整个过程大致经历了三个阶段。
1)先确认研究逻辑,再处理平台适配
最开始,我先把策略核心聚焦在“动量 + 波动率 + 流动性 + 趋势质量”的复合框架上,确保研究逻辑是完整的。
在接入平台时,再逐步检查哪些字段适合当前期货场景,哪些接口在当前环境下不支持。
例如,早期曾考虑加入 turnover 作为补充维度,但在当前期货因子封装环境中,这一字段既不是必要项,接口兼容性也不理想。
因此后续在 AI 助手的协助下,直接把这部分从当前版本中剥离,避免无效依赖影响整体运行。
这一步其实很重要。
量化开发里常见的问题不是“想法错了”,而是研究逻辑还没问题,工程接入先把人绊倒了。
这次从研究到跑通,中间也踩了几个典型坑。
五、回测结果
从当前回测结果来看,这个策略已经具备了初步可研究价值。
根据回测界面的统计,主要表现如下:
- 总收益:41.82%
- 年化收益:43.47%
- 基准收益:12.75%
- 信息比率:0.6836
- Alpha:0.3915
- Beta:0.0352
- Sortino(索提诺比率):1.0033
- 收益波动率:37.54%
- 最大回撤:-17.96%
- 下行风险:30.18%
从这些指标来看,有几点值得单独说。
1)收益相对基准有明显超额
策略收益明显高于基准,说明这个复合因子不是纯粹“贴市场beta”的产物。
同时 Beta 只有 0.0352,说明组合对基准暴露很低,更多是依靠自身选取逻辑在创造收益。
这个特征在期货因子里是有意思的。
因为它意味着策略不是简单顺着市场涨跌漂流,而是有一定独立性。
2)Alpha为正,说明结构有效
Alpha 0.3915 是一个相当直观的信号:
在控制市场暴露后,这个组合仍然保留了可观的超额收益能力。
当然,这不能神化。
一个阶段的 Alpha 为正,不代表真理降临,只代表这套结构在这段样本里没胡说八道。
3)回撤仍然存在,但可接受
最大回撤 -17.96%,不能说很小,但在期货策略里也不算失控。
至少它说明这个策略还没有走向那种“收益曲线看着很美,实则一碰就碎”的状态。
不过这也提示下一步很明确:
- 仓位控制还可以继续细化
- 极端波动阶段的风险约束可以更强
- 单品种和单时段暴露需要继续压缩
六、从回测到仿真:为什么这一步很重要
很多策略死在一个地方:
回测里会赚钱,仿真里不会做人。
这次我把策略接到了仿真流程里,目的不是为了“证明它已经能实盘”,而是为了观察三件事:
- 因子在实时数据流中是否稳定生成
- 仓位与订单管理是否按逻辑执行
- 回测里的收益结构,在仿真环境中会不会明显变形
这一步非常关键。
因为回测更像实验室,仿真更像把你放到街上。实验室里的白鼠很优雅,到了街上可能会被摩托车创飞。
从目前界面和日志来看,策略已经能完成:
- 因子计算
- 风险参数处理
- 目标仓位推导
- 回测结果展示
- 仿真账户连接观察
这意味着它已经不只是一个“纸上因子”,而是进入了研究—验证—执行链路。
七、结语
这次“期货回测连接仿真交易”的实验,对我来说最重要的,不是拿到一个漂亮数字,而是把整个研究流程打通了:
从因子设计,到平台编译,到回测验证,再到仿真连接。
这个过程让我更确认一件事:
做量化,真正有价值的不是一段神秘代码,而是你能不能把一个想法变成一条完整、可检验、可迭代的研究链路。
当前这个策略还远没有到最终版。
但它至少证明了一件事:
动量 × 波动率 × 流动性 × 趋势质量 这条路,在期货场景里是值得继续往下挖的。