3. 动量指标计算

在双动量ETF轮动模型中,动量指标是整个策略的“发动机”——选谁、换谁、何时空仓,全部依赖动量数值的排序与阈值判断。本节聚焦两个核心指标的计算:绝对动量(判断单个资产自身是否处于上涨趋势)与相对动量(在候选池中横向比较谁更强)。两者计算口径必须统一,否则排名结果会失真。

一、绝对动量:12个月收益率

绝对动量回答的是“这个ETF过去一年赚钱了吗”。最常用的定义是12个月价格收益率,即当前价格相对12个月前价格的涨跌幅。但直接取“今天价格 ÷ 252个交易日前价格 − 1”会引入两个问题:一是月末效应导致起止日不对齐,二是分红除权造成价格跳空。因此工程上通常采用月末收盘价、后复权序列计算。

设后复权收盘价序列为 \(P_t\),则第 \(t\) 月的12个月绝对动量为:

MOM_12M(t) = P_t / P_{t-12} - 1

其中:
  P_t      = 第 t 个月最后一个交易日的后复权收盘价
  P_{t-12} = 12 个月前的月末后复权收盘价
  数据频率 = 月频(由日频聚合而来)

举例说明:假设某沪深300ETF在2023年12月末的后复权净值为4.215,2022年12月末为3.680,则12个月绝对动量为 4.215 / 3.680 − 1 ≈ 14.54%。若该值大于0,说明绝对动量为正,资产处于上涨趋势;小于0则视为下跌趋势,在双动量框架中通常触发“切换到防御资产或现金”的规则。

为什么用后复权而不是前复权?前复权会随着新数据不断调整历史价格,导致同一历史时点的动量值每次重算都变化,回测不可复现;后复权保持历史价格不变,只向前延伸,适合做时序计算。若数据源只提供不复权价格,则必须用分红送转因子自行复权,否则一次大比例分红就会让动量凭空“跳水”。

二、相对动量:截面排名

相对动量回答的是“在候选池里,谁比谁更强”。它不关心绝对涨跌,只关心横向排序。常见做法是对每个调仓时点,计算池内所有ETF的12个月收益率,然后按从高到低排名,取前N名(如Top 2或Top 3)作为持有候选。

相对动量的输出有两种形式:排名序号(1、2、3…)和百分位得分(0~1)。排名直观,百分位便于跨不同规模候选池比较。计算时需注意:排名必须在同一时点、同一候选池内完成,不能拿不同月份的结果混排;候选池发生变更(如新增ETF)时,应在新池内重新排名,而不是沿用旧排名。

相对动量排名(截面):
  对每个调仓日 t:
    1. 计算池内每只ETF的 MOM_12M
    2. 按 MOM_12M 降序排列
    3. rank = 1, 2, 3, ... (1为最强)
    4. 取 rank ≤ N 的ETF进入候选

百分位得分 = 1 - (rank - 1) / (池内数量 - 1)

示例:某月候选池有5只ETF,12个月收益率分别为A:18%、B:9%、C:−3%、D:25%、E:12%。降序排名为D(1)、A(2)、E(3)、B(4)、C(5)。若取Top 2,则D和A入选。注意C虽然排名最后,但其绝对动量为负,若策略同时要求绝对动量过滤,C即使排名靠前也会被剔除——这正是双动量“先绝对、后相对”的过滤逻辑。

三、数据频率、复权与缺失值处理

数据频率:动量计算建议统一到月频调仓。日频数据先聚合为月末值,避免用月中某一天的价格造成起止日错位。若策略要求周频调仓,则用周频聚合,但12个月窗口应改为52周,保持窗口长度一致。

复权处理:所有价格序列必须使用同一复权口径(推荐后复权)。ETF分红、拆分、合并都会造成价格不连续,未复权数据会严重扭曲动量。若使用净值而非交易价格,需确认净值是否已含分红再投资。

缺失值处理:常见缺失包括新上市ETF历史不足12个月、停牌、数据源断点。处理原则是:历史不足12个月的ETF不参与当期排名(或标记为不可计算),不能用短窗口收益率冒充12个月动量;停牌期间用前值填充仅限短期,长期停牌应剔除;数据断点应回溯数据源修复,而非简单插值。缺失值若被错误填0,会被误判为“零动量”,从而在排名中占据不合理位置。

常见错误:用前复权数据计算历史动量,导致每次更新数据后历史排名变化,回测结果无法复现;以及把不同月份计算的排名直接拼接,造成“跨期比较”的伪信号。
双动量指标计算流程:从原始数据到排名信号 原始日频数据 收盘价 / 净值 分红送转因子 后复权处理 价格连续化 历史值不随新数据变 月频聚合 取每月最后交易日 形成月末序列 缺失值检查 不足12个月→不参与 停牌/断点→修复或剔除 绝对动量(时序) MOM = P_t / P_(t-12) − 1 判断:>0 上涨趋势,<0 下跌趋势 作用:趋势过滤,决定是否空仓/防御 相对动量(截面) 同一时点池内按MOM降序排名 取 Top N 或百分位得分 作用:横向择优,决定买哪只 最终信号:绝对动量过滤 + 相对动量排名 → 持仓列表

四、计算口径一致性检查

实际实现时,建议在代码中固定以下参数并写入配置:窗口长度(12个月)、聚合频率(月末)、复权方式(后复权)、排名方向(降序)、Top N数量、绝对动量阈值(0)。每次调仓前先做一次口径自检:所有ETF的起止日期是否对齐、复权因子是否已应用、缺失值是否已按规则处理。只有口径统一,绝对动量的“正负”和相对动量的“排名”才具有可比性,双动量模型的过滤与择优逻辑才能稳定运行。