期货回测连接仿真交易:一个动量 × 波动率复合因子的研究记录
  野生咖啡师 10天前 81 0

上次分享一个我最近在 PandaAI QuantFlow 里做的期货策略实验:用动量与波动率构建复合因子,先做回测验证,再连接仿真交易观察执行效果。

这次来分享一下思路提供各位参考。这个策略表面上看是“动量因子组合”,但它并不是那种简单追涨杀跌的直线型趋势系统。
它更接近一种:在中短周期价格偏移中寻找相对有质量的回归机会,并通过波动率、流动性和趋势质量做过滤
所以它的交易特性,实际更偏向一种受约束的均值回归风格,而不是裸奔式趋势追逐。


一、研究出发点

做期货因子时,我有一个很现实的观察:

单独使用价格动量,经常会遇到两个问题。

第一,动量本身容易被高波动噪声污染
很多时候你看到的是“涨了很多”,但本质只是短期振荡被放大,继续追反而容易吃回撤。

第二,期货市场的不同品种节奏差异很大
有的品种趋势延续性强,有的品种更容易日内脉冲后回落。如果只看一个周期,很容易被局部结构骗进去。

所以我的思路不是做单一动量,而是做一个复合因子:

  • 多周期动量捕捉价格偏移
  • 波动率结构过滤掉“太吵”的机会
  • 流动性避免信号落在难成交的地方
  • 趋势质量判断这段价格运动到底有没有“质量”

最后把这些内容压缩成一个统一评分,用于排序、选仓和回测。


二、核心因子设计

这次使用的核心类是:

class FuturesMomentumVolCompositeFactor(Factor):

截屏20260307 下午2.48.12.png
整体结构可以分成五层。

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

之后又做了三步处理:

  1. TS_ZSCORE(composite, 20) 做时间序列标准化
  2. 把极端值裁剪到 [-5, 5]
  3. SCALE() 缩放到 [-1, 1]

这一步很关键。
因为原始因子如果不做约束,很容易被极端样本劫持,最后策略不是在交易逻辑,而是在交易离群点。离群点偶尔像天使,更多时候像喝多了的猴子。


三、为什么它看起来像动量,实质却偏均值回归

很多人看到“多周期动量”这四个字,会默认这是个趋势跟随策略。
但从这个组合的约束方式来看,它更接近:

寻找价格偏移后、在较低噪声与较高质量环境中的回归型机会。

原因有三点:

第一,它不是无脑追最强方向,而是用波动率和振幅对“过热信号”做了抑制。
第二,它对流动性和趋势质量有过滤,避免很多情绪型脉冲。
第三,复合后再做时间序列标准化与截断,实际上把过度激进的趋势暴露削弱了。

所以这个因子的交易风格更像:

  • 利用动量识别偏移
  • 利用波动率判断偏移是否失真
  • 在更理性的结构中等待均衡回归或更稳健延续

这就是为什么我把它定义为:
动量驱动、波动约束、风格偏均值回归的期货复合因子。


四、调试与调整过程

从研究逻辑到工程落地:AI 助手参与的调试与修复过程

这次策略从因子研究走到平台回测、再连接仿真交易,并不是一次性顺滑跑通的。
在这个过程中,AI 助手主要承担了工程排障、编译修复和执行链路校验的角色,让我可以把更多精力放在因子逻辑本身,而不是反复陷在接口和运行环境的细节里。

整个过程大致经历了三个阶段。

1)先确认研究逻辑,再处理平台适配

最开始,我先把策略核心聚焦在“动量 + 波动率 + 流动性 + 趋势质量”的复合框架上,确保研究逻辑是完整的。
在接入平台时,再逐步检查哪些字段适合当前期货场景,哪些接口在当前环境下不支持。

例如,早期曾考虑加入 turnover 作为补充维度,但在当前期货因子封装环境中,这一字段既不是必要项,接口兼容性也不理想。
因此后续在 AI 助手的协助下,直接把这部分从当前版本中剥离,避免无效依赖影响整体运行。

这一步其实很重要。
量化开发里常见的问题不是“想法错了”,而是研究逻辑还没问题,工程接入先把人绊倒了。
这次从研究到跑通,中间也踩了几个典型坑。


五、回测结果

从当前回测结果来看,这个策略已经具备了初步可研究价值。
截屏20260307 下午2.28.15.png
根据回测界面的统计,主要表现如下:

  • 总收益: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%,不能说很小,但在期货策略里也不算失控。
至少它说明这个策略还没有走向那种“收益曲线看着很美,实则一碰就碎”的状态。

不过这也提示下一步很明确:

  • 仓位控制还可以继续细化
  • 极端波动阶段的风险约束可以更强
  • 单品种和单时段暴露需要继续压缩

六、从回测到仿真:为什么这一步很重要

很多策略死在一个地方:
回测里会赚钱,仿真里不会做人。
截屏20260307 下午2.15.41.png
这次我把策略接到了仿真流程里,目的不是为了“证明它已经能实盘”,而是为了观察三件事:

  1. 因子在实时数据流中是否稳定生成
  2. 仓位与订单管理是否按逻辑执行
  3. 回测里的收益结构,在仿真环境中会不会明显变形

这一步非常关键。
因为回测更像实验室,仿真更像把你放到街上。实验室里的白鼠很优雅,到了街上可能会被摩托车创飞。

从目前界面和日志来看,策略已经能完成:

  • 因子计算
  • 风险参数处理
  • 目标仓位推导
  • 回测结果展示
  • 仿真账户连接观察

这意味着它已经不只是一个“纸上因子”,而是进入了研究—验证—执行链路


七、结语

这次“期货回测连接仿真交易”的实验,对我来说最重要的,不是拿到一个漂亮数字,而是把整个研究流程打通了:

从因子设计,到平台编译,到回测验证,再到仿真连接。

这个过程让我更确认一件事:
做量化,真正有价值的不是一段神秘代码,而是你能不能把一个想法变成一条完整、可检验、可迭代的研究链路。

当前这个策略还远没有到最终版。
但它至少证明了一件事:
动量 × 波动率 × 流动性 × 趋势质量 这条路,在期货场景里是值得继续往下挖的。

最后一次编辑于 10天前 2

暂无评论

推荐阅读