Skip to content

斜率动量指标详解

一、什么是斜率动量指标?

斜率动量指标(Slope Momentum)是一种量化投资中常用的趋势强度指标,通过线性回归分析价格走势的"斜率"来评估资产的动量。相比简单的价格涨跌幅,斜率指标能更科学地捕捉趋势的方向速度稳定性

核心思想

将资产价格走势看作一条"趋势线",通过以下两个维度评估:

  • 斜率(Slope):反映价格上涨或下跌的速度(趋势方向和强度)
  • 拟合优度(R²):反映价格走势与趋势线的贴合程度(趋势稳定性)

最终的斜率动量得分 = 年化收益率 × ,既考虑了收益率,又考虑了趋势的确定性。

二、计算步骤详解

第一步:数据准备

python
# 获取指定周期的收盘价数据
close_prices = df['close'].values[-momentum_period:]

说明:提取最近 N 天(momentum_period)的收盘价数据,确保按时间顺序排列(最旧→最新)。

第二步:对数转换

python
y = np.log(close_prices)
x = np.arange(len(y))

为什么使用对数?

  • 对数收益率具有时间可加性:连续多天的对数收益率可以直接相加
  • 对数转换能更好地处理复利效应,让价格变化更符合正态分布
  • 例如:价格从 100 → 110 → 121,对数收益率分别为 9.53% 和 9.53%,直接相加得到总收益

坐标系构建

  • x:时间序列,[0, 1, 2, ..., N-1]
  • y:对数价格,[ln(P₀), ln(P₁), ..., ln(Pₙ₋₁)]

第三步:线性回归拟合

有两种回归方式:

3.1 等权回归

python
slope, intercept = np.polyfit(x, y, 1)

所有数据点的权重相同,平等对待历史和近期数据。

3.2 加权回归

python
weights = np.linspace(1, 2, len(y))
slope, intercept = np.polyfit(x, y, 1, w=weights)

权重设计:从 1 线性增长到 2

  • 最旧的数据权重 = 1.0
  • 最新的数据权重 = 2.0
  • 中间数据权重线性插值

加权的意义

  • 更重视近期趋势,认为最新数据更能代表当前动量
  • 减少远期噪音对趋势判断的影响
  • 适合快速变化的市场环境

回归结果

  • slope(斜率):每单位时间(天)的对数收益率
  • intercept(截距):趋势线的起始点

第四步:计算年化收益率

python
annualized_returns = math.exp(slope * 250) - 1

计算逻辑

  1. slope 是每天的对数收益率
  2. slope * 250 是一年(250个交易日)的对数收益率
  3. exp(slope * 250) - 1 将对数收益率转换为实际收益率

举例

  • 如果 slope = 0.002(每天0.2%的对数增长)
  • 年化收益率 = exp(0.002 × 250) - 1 = exp(0.5) - 1 ≈ 64.87%

第五步:计算R²(拟合优度)

python
y_pred = slope * x + intercept

# 残差平方和
ss_residual = np.sum((y - y_pred) ** 2)

# 总平方和
ss_total = np.sum((y - np.mean(y)) ** 2)

# R²
r_squared = 1 - (ss_residual / ss_total)

R² 的含义

  • 范围:0 ~ 1
  • R² = 1:所有数据点完美落在趋势线上(完美趋势)
  • R² = 0.8:80%的价格变化能被趋势解释(强趋势)
  • R² = 0.3:仅30%能被解释(弱趋势或震荡)

加权R²:如果使用加权回归,R²计算也要加权,确保评估标准一致。

第六步:综合评分

python
slope_momentum = annualized_returns * r_squared

最终得分 = 年化收益率 × R²

举例对比

资产年化收益率斜率动量得分特征
A50%0.90.45稳定上涨 ✅
B80%0.40.32高收益但波动大
C20%0.950.19稳定但增速慢

结论:资产A得分最高,因为它既有不错的收益率,又有很高的趋势稳定性。

三、加权斜率的两个版本:V1 与 V2

平台目前对"加权斜率"(含分时版)提供两个可选版本:下拉框里不带后缀的加权斜率 / 加权斜率(分时版)(沿用早期实现,下文称 V1)和带后缀的加权斜率-V2 / 加权斜率(分时版)-V2(修正版)。两者的年化收益率计算完全一致,差异仅在 R² 的计算方式上,但这个差异会直接影响最终得分的正负号,因此有必要单独说明。

3.1 V1 的问题:回归权重与 R² 权重不一致

回顾第三步的加权线性回归:从 1 到 2 线性增长的权重序列 weights,理论上应该在整条计算链路(回归拟合、残差平方和、总平方和、均值)中保持同一套权重口径,才能让 R² 真实反映"加权回归"的拟合优度。

V1 的历史实现中,加权最小二乘回归实际使用的有效权重是线性权重的平方weights²),但计算 R² 时的残差平方和、总平方和却直接使用了未平方的线性权重,并且用来计算离差的均值 mean(y) 还是普通算术平均,并未按权重加权:

python
# V1:回归用 weights²,但 R² 用未平方的 weights,且均值不加权
slope, intercept = weighted_polyfit(x, y, w=weights**2)   # 回归:有效权重 = weights²

y_pred = slope * x + intercept
mean_y = np.mean(y)                                        # 均值:未加权(问题点)
ss_residual = np.sum(weights * (y - y_pred) ** 2)          # R²:权重 = weights(问题点)
ss_total    = np.sum(weights * (y - mean_y) ** 2)          # R²:权重 = weights(问题点)
r_squared = 1 - ss_residual / ss_total

后果:回归线是在"weights² 加权"的意义下拟合出的最优解,但 R² 却是在另一套(weights + 未加权均值)标准下计算的拟合优度,两者不是同一套评价体系。在某些价格走势下,这种口径错位会导致 ss_residual > ss_total,使 R² 出现负值

由于最终得分 = 年化收益率 × R²,一旦 R² 变成负数:

  • 本来处于稳定上涨(年化收益率为正)的资产,反而被打出负分,在排名中被错误地排到后面
  • 少数下跌趋势的资产反而可能因为这种符号错位被打出正分

这就是设计文档中所说的"动量符号翻转"问题——不是数值大小的偏差,而是评分方向性的错误,对轮动策略的选股排序有实质影响。

3.2 V2 的修正:统一权重口径

V2 把回归拟合、残差平方和、总平方和、均值这四处计算全部统一为同一套权重weights²),包括把均值也改为加权均值:

python
# V2:回归、均值、R² 全部统一使用 weights² 作为权重
w = weights ** 2
slope, intercept = weighted_polyfit(x, y, w=w)

y_pred = slope * x + intercept
mean_y = np.sum(w * y) / np.sum(w)                          # 均值:改为加权均值
ss_residual = np.sum(w * (y - y_pred) ** 2)                 # R²:权重与回归一致
ss_total    = np.sum(w * (y - mean_y) ** 2)                 # R²:权重与回归一致
r_squared = 1 - ss_residual / ss_total

统一口径后,R² 是在与回归拟合完全相同的加权标准下计算的拟合优度,不会再出现因权重错位导致的负值和评分符号翻转问题,最终得分更可靠地反映"趋势方向 × 趋势稳定性"。

3.3 如何选择

  • 新建策略:下拉框中"加权斜率""加权斜率(分时版)"对应 V1(历史实现,为兼容存量策略保留);"加权斜率-V2""加权斜率(分时版)-V2"对应上述修正版。建议新建策略优先选择 V2
  • 已有策略:已保存策略的动量计算方式、历史回测/实盘表现均不受影响,V1、V2 是两个独立的类型选项,不存在自动升级或覆盖。
  • 两者可同时回测对比:由于计算逻辑存在差异,同一 ETF 池、同一周期下 V1 与 V2 的净值曲线、收益指标通常会不同,属于预期内的差异,可通过回测直观比较两者表现。

四、等权 vs 加权回归的选择

等权回归

优点

  • 全面考虑整个周期的趋势
  • 不容易被短期波动误导
  • 适合识别中长期趋势

适用场景

  • 市场相对平稳
  • 周期较长(如60天、120天)
  • 追求稳健的趋势判断

加权回归

优点

  • 对市场变化反应更灵敏
  • 能快速捕捉趋势转折
  • 更符合"动量延续"的短期特性

适用场景

  • 市场快速变化
  • 周期较短(如20天、30天)
  • 需要快速响应趋势变化

实战建议

  • 短周期(≤30天):建议使用加权回归
  • 长周期(≥60天):等权回归更稳健
  • 可同时计算两种,构建多维度评分体系

五、在ETF轮动策略中的应用价值

4.1 核心作用:资产排序与筛选

ETF轮动策略的关键是定期选出最强势的资产持有。斜率动量指标提供了科学的排序依据:

python
# 计算所有ETF的斜率动量
etf_scores = []
for etf in etf_pool:
    score = calculate_slope_momentum(etf.data, period=60)
    etf_scores.append({'etf': etf.name, 'score': score})

# 按得分排序,选出Top N
top_etfs = sorted(etf_scores, key=lambda x: x['score'], reverse=True)[:N]

4.2 三大优势

优势1:同时考虑收益与稳定性

传统涨跌幅只看收益率,可能选到"虚高"的资产:

指标简单涨跌幅斜率动量
ETF-A:稳定上涨+30%0.27(30% × 0.9)
ETF-B:暴涨后回调+40%0.16(40% × 0.4)
选择结果❌ 选B✅ 选A

结论:斜率动量能过滤掉不稳定的"虚假强势"。

优势2:平滑噪音,识别真实趋势

线性回归本质上是一种去噪拟合,能过滤短期波动:

价格波动: 100 → 105 → 103 → 108 → 106 → 112
简单涨跌: +12%(但中间反复震荡)
斜率拟合: 识别出稳定的+2%/天趋势(R²高)

优势3:多周期组合,提升稳健性

可以结合不同周期构建评分体系:

python
# 短期(捕捉近期动量)
score_20d = calculate_slope_momentum(df, 20, use_weighted_regression=True)

# 中期(确认趋势延续)
score_60d = calculate_slope_momentum(df, 60, use_weighted_regression=False)

# 长期(避免追高)
score_120d = calculate_slope_momentum(df, 120, use_weighted_regression=False)

# 综合评分
final_score = 0.5 * score_20d + 0.3 * score_60d + 0.2 * score_120d

六、总结

斜率动量指标的核心价值

  1. 科学量化趋势:用数学模型替代主观判断
  2. 兼顾收益与稳定:R²加权避免追逐虚假动量
  3. 灵活适配场景:通过参数调整适应不同市场环境
  4. 易于实现与回测:计算简单,历史数据充足

在ETF轮动中的独特优势

  • ✅ 客观排序,消除情绪干扰
  • ✅ 趋势过滤,提高胜率
  • ✅ 多周期组合,提升稳健性
  • ✅ 适应性强,牛熊皆可用

蜀ICP备20013273号-1 | 返回主站