Momentum:MOM(动量指标)技术指标详解
Momentum:MOM(动量指标)技术指标详解
一、MOM的定义
MOM(Momentum Indicator,动量指标) 是一种基础而强大的技术分析工具,通过衡量当前价格与固定周期前价格之间的差异来量化市场趋势的速度与强度。
核心设计理念
MOM的设计哲学基于一个简单而深刻的观察:价格变化的速度(动量)往往先于价格本身的变化。当一只股票处于健康的上升趋势时,其上涨速度通常能维持在一个相对稳定的水平。反之,当上涨速度开始减缓时,即使价格还在缓慢爬升,也可能是趋势即将转弱的早期预警。
MOM的核心特征
| 特征 | 说明 |
|---|---|
| 理论基础 | 价格上涨速度先于价格见顶;下跌速度先于价格见底 |
| 指标类型 | 动量震荡指标 |
| 数值范围 | 无固定范围,围绕0轴波动 |
| 开发者 | Perry Kaufman(在《Trading Systems and Methods》中推广) |
| 默认参数 | 10或12周期 |
| 核心优势 | 计算简单,信号直观,适合多种市场环境 |
MOM的两种形式:差值与比率
MOM指标在实践中有两种常见的表现形式:
| 形式 | 公式 | 输出范围 | 示例 |
|---|---|---|---|
| 差值形式 | 当前价 - N周期前价格 | 可正可负,无固定上限 | MOM = 108 - 100 = 8 |
| 比率形式 | (当前价 / N周期前价格) × 100 | 通常围绕100波动 | MOM = (108/100)×100 = 108 |
本文以pandas_ta库的实现为准,重点介绍差值形式的MOM。
二、MOM的计算方法
1. 核心计算公式
MOM的最基本计算公式为:
MOMt=Closet−Closet−n \mathrm{MOM}_t = \mathrm{Close}_t − \mathrm{Close}_{t−n} MOMt=Closet−Closet−n
其中:
- Closet\mathrm{Close}_tCloset:当前周期的收盘价
- Closet−n\mathrm{Close}_{t−n}Closet−n:nnn 个周期前的收盘价
- nnn:计算周期(默认值通常为10或12)
2. pandas_ta中的实现
根据pandas_ta的源代码,MOM的计算采用差值法,等价于对收盘价序列进行差分运算:
MOM = close.diff(length)
其中length为计算周期,默认值为1。
3. ROC(变化率)与MOM的关系
MOM与ROC(变化率)是高度相关的两个指标:
| 指标 | 公式 | 含义 |
|---|---|---|
| MOM(差值) | Closet−Closet−n\mathrm{Close}_t - \mathrm{Close}_{t-n}Closet−Closet−n | 绝对价格变化 |
| ROC(比率) | (Closet/Closet−n)×100(\mathrm{Close}_t / \mathrm{Close}_{t-n}) × 100(Closet/Closet−n)×100 | 相对价格变化 |
二者的换算关系为:
ROC=100×MOMCloset−n \mathrm{ROC} = 100 \times \frac{\mathrm{MOM}}{\mathrm{Close}_{t-n}} ROC=100×Closet−nMOM
4. 参数说明
| 参数 | 默认值 | 名称 | 说明 |
|---|---|---|---|
| length | 1或10 | 计算周期 | 决定动量计算的时间窗口大小 |
| talib | True | TA-Lib开关 | 若安装TA-Lib则使用其版本 |
| offset | 0 | 偏移周期 | 结果偏移周期数 |
周期参数选择指南:
| 周期范围 | 适用场景 | 特点 |
|---|---|---|
| 5-7 | 短线/日内交易 | 灵敏度高,信号频繁但噪声较多 |
| 10-12 | 标准配置 | 平衡灵敏度与稳定性,最常用 |
| 14-20 | 波段/中线交易 | 曲线平滑,信号较少但更可靠 |
5. 计算示例
假设某股票使用N=10周期,当前收盘价为110,10个交易日前收盘价为100:
差值法(pandas_ta默认):
MOM=110−100=10 \mathrm{MOM} = 110−100 = 10 MOM=110−100=10
比率法(可选形式):
MOM=110100×100=110 \mathrm{MOM} = \frac{110}{100} \times 100 = 110 MOM=100110×100=110
两种形式中,差值法更直观(正值=上涨),比率法在跨品种比较时更有优势。
三、MOM的使用方法
1. 零轴穿越——最简单的买卖信号
MOM以0轴为多空分界线,零轴穿越是最基础、最直观的交易信号:
| 信号类型 | 触发条件 | 含义 | 操作建议 |
|---|---|---|---|
| 买入信号 | MOM从下方上穿零轴 | 当前价格超过N周期前价格,动量由空转多 | 考虑建立多头仓位 |
| 卖出信号 | MOM从上方下穿零轴 | 当前价格低于N周期前价格,动量由多转空 | 考虑平仓或建立空头 |
信号增强条件:
- 穿越发生时MOM持续运行在零轴同一侧2-3个周期后再进场,减少假信号
- 成交量同步放大确认动量转变
- 在高周期趋势方向一致时使用(如日线上升趋势中,小时图MOM上穿零轴信号更可靠)
2. 趋势强度判断——顺势持仓依据
MOM的正负和数值大小可以反映趋势的强度:
| MOM状态 | 市场含义 | 操作策略 |
|---|---|---|
| MOM > 0 | 当前价格高于N周期前价格,多头动量占优 | 偏多思维,寻找买入机会 |
| MOM < 0 | 当前价格低于N周期前价格,空头动量占优 | 偏空思维,寻找卖出机会 |
| MOM持续上升 | 多头动量正在增强,趋势健康 | 顺势持仓,不宜轻易离场 |
| MOM持续下降 | 空头动量正在增强,趋势健康 | 顺势持仓或观望 |
3. 极值区域——超买超卖判断
由于MOM没有固定上下限,识别超买超卖需要结合历史数据进行判断:
| 判断方法 | 操作 | 说明 |
|---|---|---|
| 历史极值法 | 观察MOM的历史高点/低点,绘制水平线 | 当MOM达到历史高位时警惕超买,达到历史低位时关注超卖 |
| 百分比分级法 | 将历史波动范围等分(如±1、±2、±3级) | 短线行情关注±1级回档,中期趋势关注±2级转折 |
分级法示例:
| MOM分级 | 状态 | 操作 |
|---|---|---|
| ±1级 | 短线回档/反弹信号 | 可能触发短期回调或反弹 |
| ±2级 | 中期趋势转折信号 | 常伴随波段行情结束 |
| ±3级以上 | 极端行情 | 进入强势趋势,不宜过早反向操作 |
重要提示:±1、±2、±3是相对概念,每只股票的超买超卖界限不同,需根据个股历史数据自行设定。
4. 背离信号——最重要的反转预警
MOM与价格走势的背离是最可靠的反转预警信号:
| 背离类型 | 价格表现 | MOM表现 | 信号含义 |
|---|---|---|---|
| 顶背离(看跌) | 价格创出新高 | MOM未能创出新高(形成更低高点) | 上涨动能衰竭,卖出信号 |
| 底背离(看涨) | 价格创出新低 | MOM未能创出新低(形成更高低点) | 下跌动能减弱,买入信号 |
背离交易流程:
- 确认背离:价格与指标至少形成两个高点或低点
- 辅助确认:参考MACD死叉/金叉、RSI超买超卖等指标
- 寻找进场点:等待价格反转迹象(突破趋势线、关键K线形态)
- 设置止损:止损设于近期高低点之外
5. 信号线交叉——MACD式用法
为MOM添加一条移动平均线作为信号线,可以产生类似于MACD的交叉信号:
| 信号类型 | 触发条件 | 操作建议 |
|---|---|---|
| 金叉(买入) | MOM线上穿其移动平均线 | 短期动量开始强于平均动量 |
| 死叉(卖出) | MOM线下穿其移动平均线 | 短期动量开始弱于平均动量 |
常用信号线参数为6日或9日SMA。
6. 双周期策略——长期趋势过滤
使用不同周期的MOM可以构建多时间框架分析系统:
| 周期组合 | 分析方法 | 信号含义 |
|---|---|---|
| 短期MOM(如12日)+ 长期MOM(如25日) | 短期MOM > 长期MOM | 短期动量强于长期动量,上升趋势确认 |
| 短期MOM < 长期MOM | 短期动量弱于长期动量,下降趋势确认 | |
| 短期MOM上穿长期MOM | 金叉信号,买入参考 | |
| 短期MOM下穿长期MOM | 死叉信号,卖出参考 |
7. 与其他指标的配合策略
MOM不应单独使用,建议与其他技术指标配合:
| 配合指标 | 策略逻辑 | 效果 |
|---|---|---|
| 移动平均线(如EMA200) | 用大周期MA判断主趋势方向 | MA之上只做多,MA之下只做空,过滤反向信号 |
| RSI | RSI确认超买超卖状态 | MOM穿越零轴+RSI<70时买入信号更可靠 |
| MACD | 趋势方向双重确认 | 两个指标同时发出信号时可靠性更高 |
| 布林带 | 价格边界确认 | MOM信号与价格触及布林带边界同步时信号更强 |
| 成交量 | 验证动量转变 | MOM穿越伴随放量时可信度更高 |
8. 注意事项与局限性
使用MOM前需了解以下要点:
| 局限性 | 说明 |
|---|---|
| 无固定边界 | MOM没有像RSI那样的固定超买超卖阈值(70/30),判断超买超卖存在主观性 |
| 价格水平影响 | 高价股的MOM波动范围天然大于低价股,不便于跨品种直接比较 |
| 强趋势中可能持续极端 | 在强劲单边趋势中,MOM可能长期处于极值区域,过早反向操作会导致亏损 |
| 震荡市假信号 | 在横盘震荡市场中,MOM可能频繁穿越零轴产生假信号 |
| 不能单独使用 | 建议与其他技术指标配合使用,构建完整交易系统 |
适用场景总结:
| 市场环境 | 适用性 | 说明 |
|---|---|---|
| 趋势行情 | 最佳适用 | MOM在趋势中表现优异,方向明确 |
| 震荡行情 | 慎用 | 可能频繁产生假信号 |
| 高波动市场 | 适用 | 可选用稍长周期过滤噪音 |
| 跨品种比较 | 需标准化 | 直接用MOM绝对值无法比较,建议使用ROC比率形式 |
四、使用pandas_ta计算MOM(附示例代码)
1. pandas_ta中的MOM函数
pandas_ta库内置了MOM指标的完整实现,函数位于momentum模块中。该库还提供与MOM高度相关的ROC(变化率)指标。
2. 函数完整参数
pandas_ta.momentum.mom(close, length=None, talib=None, offset=None, **kwargs)
参数详解:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
close |
pd.Series | 必需 | 收盘价序列 |
length |
int | 1 | MOM计算周期(差分步长) |
talib |
bool | True | 若安装TA-Lib则使用其版本 |
offset |
int | 0 | 结果偏移周期数 |
ROC函数参数(备选,用于比率形式):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
close |
pd.Series | 必需 | 收盘价序列 |
length |
int | 10 | ROC计算周期 |
scalar |
float | 100 | 放大倍数(转换为百分比) |
3. 示例代码
import pandas as pd
import pandas_ta as ta
import numpy as np
import matplotlib.pyplot as plt
# ========== 第一步:准备数据 ==========
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', end='2024-12-31', freq='D')
n = len(dates)
# 生成带趋势和周期波动的价格序列
trend = np.linspace(0, 45, n)
cycle = np.sin(np.linspace(0, 6 * np.pi, n)) * 15
noise = np.random.randn(n) * 3
price_series = 100 + trend + cycle + noise
# 添加趋势变化区间
price_series = price_series.astype(float)
for i in range(300, 450):
price_series[i] = price_series[300] + (i-300) * 0.2 # 强势上涨段
for i in range(450, 600):
price_series[i] = price_series[450] - (i-450) * 0.15 # 强势下跌段
for i in range(600, 750):
price_series[i] = price_series[600] + np.random.randn() * 0.8 # 盘整段
df = pd.DataFrame(index=dates[:n])
df['close'] = price_series[:n]
df['high'] = df['close'] + np.abs(np.random.randn(n)) * 2 + 1
df['low'] = df['close'] - np.abs(np.random.randn(n)) * 2 - 1
df['volume'] = np.random.randint(1000000, 25000000, n)
print("=" * 60)
print("数据预览:")
print(df.head())
print("\n" + "=" * 60 + "\n")
# ========== 第二步:计算MOM(基础用法) ==========
# MOM函数默认length=1(相邻周期比较)
df['MOM_1'] = ta.mom(df['close'])
# 常用周期:10日MOM
df['MOM_10'] = ta.mom(df['close'], length=10)
# 计算ROC(比率形式)作为对比
df['ROC_10'] = ta.roc(df['close'], length=10)
print("MOM计算结果(最近10行):")
print(df[['close', 'MOM_1', 'MOM_10', 'ROC_10']].tail(10))
print("\n" + "=" * 60 + "\n")
# ========== 第三步:手动验证MOM计算 ==========
def manual_mom(close, length=10):
"""手动计算MOM验证pandas_ta结果"""
mom = close - close.shift(length)
return mom
df['MOM_manual'] = manual_mom(df['close'])
# 验证一致性
diff = (df['MOM_10'] - df['MOM_manual']).abs().max()
print(f"pandas_ta与手动计算的最大差异:{diff:.10f}")
print("\n" + "=" * 60 + "\n")
# ========== 第四步:不同周期的MOM对比 ==========
# 短周期 (5)
df['MOM_5'] = ta.mom(df['close'], length=5)
# 标准周期 (10)
df['MOM_10'] = ta.mom(df['close'], length=10)
# 中长线周期 (20)
df['MOM_20'] = ta.mom(df['close'], length=20)
print("不同周期MOM对比(最近5行):")
print(df[['close', 'MOM_5', 'MOM_10', 'MOM_20']].tail())
print("\n" + "=" * 60 + "\n")
# ========== 第五步:计算信号线(MOM的移动平均) ==========
df['MOM_signal_6'] = ta.sma(df['MOM_10'], length=6)
df['MOM_signal_9'] = ta.sma(df['MOM_10'], length=9)
print("MOM与其信号线对比(最近5行):")
print(df[['MOM_10', 'MOM_signal_6', 'MOM_signal_9']].tail())
print("\n" + "=" * 60 + "\n")
# ========== 第六步:零轴穿越信号 ==========
df['mom_above_zero'] = df['MOM_10'] > 0
df['cross_above_zero'] = (df['mom_above_zero'] == True) & (df['mom_above_zero'].shift(1) == False)
df['cross_below_zero'] = (df['mom_above_zero'] == False) & (df['mom_above_zero'].shift(1) == True)
df['zero_signal'] = ''
df.loc[df['cross_above_zero'], 'zero_signal'] = '上穿零轴(买入信号)'
df.loc[df['cross_below_zero'], 'zero_signal'] = '下穿零轴(卖出信号)'
print("零轴穿越信号统计:")
print(f"买入信号(上穿零轴)数量:{df['cross_above_zero'].sum()}")
print(f"卖出信号(下穿零轴)数量:{df['cross_below_zero'].sum()}")
print("\n最近15个穿越信号:")
signals = df[df['zero_signal'] != ''].tail(15)
if not signals.empty:
print(signals[['close', 'MOM_10', 'zero_signal']])
print("\n" + "=" * 60 + "\n")
# ========== 第七步:信号线交叉(金叉/死叉) ==========
df['mom_above_signal'] = df['MOM_10'] > df['MOM_signal_6']
df['golden_cross'] = (df['mom_above_signal'] == True) & (df['mom_above_signal'].shift(1) == False)
df['death_cross'] = (df['mom_above_signal'] == False) & (df['mom_above_signal'].shift(1) == True)
df['cross_signal'] = ''
df.loc[df['golden_cross'], 'cross_signal'] = '金叉(买入信号)'
df.loc[df['death_cross'], 'cross_signal'] = '死叉(卖出信号)'
print("信号线交叉信号统计:")
print(f"金叉数量:{df['golden_cross'].sum()}")
print(f"死叉数量:{df['death_cross'].sum()}")
print("\n" + "=" * 60 + "\n")
# ========== 第八步:背离检测(简化版) ==========
# 计算20日价格变化和MOM变化
df['price_change_20d'] = df['close'].diff(20)
df['mom_change_20d'] = df['MOM_10'].diff(20)
# 检测潜在背离
df['potential_bearish_div'] = (df['price_change_20d'] > 0) & (df['mom_change_20d'] < 0)
df['potential_bullish_div'] = (df['price_change_20d'] < 0) & (df['mom_change_20d'] > 0)
print("潜在背离信号统计(20日尺度):")
print(f"潜在顶背离(价格涨MOM跌)数量:{df['potential_bearish_div'].sum()}")
print(f"潜在底背离(价格跌MOM涨)数量:{df['potential_bullish_div'].sum()}")
print("注:完整背离需结合局部极值点分析,此处为简化方向对比")
print("\n" + "=" * 60 + "\n")
# ========== 第九步:策略回测(零轴穿越策略) ==========
# 策略:MOM上穿零轴买入,下穿零轴卖出
df['position'] = 0
in_position = False
for i in range(1, len(df)):
if not in_position and df['cross_above_zero'].iloc[i]:
df.loc[df.index[i], 'position'] = 1
in_position = True
elif in_position and df['cross_below_zero'].iloc[i]:
df.loc[df.index[i], 'position'] = 0
in_position = False
else:
df.loc[df.index[i], 'position'] = df['position'].iloc[i-1]
# 计算收益
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns']
total_return_buyhold = (1 + df['returns']).prod() - 1
total_return_strategy = (1 + df['strategy_returns']).prod() - 1
win_rate = (df['strategy_returns'] > 0).sum() / (df['strategy_returns'] != 0).sum() if (df['strategy_returns'] != 0).sum() > 0 else 0
print("=" * 60)
print("策略绩效统计(MOM零轴穿越策略回测):")
print(f"买入持有策略总收益率:{total_return_buyhold:.2%}")
print(f"MOM穿越策略总收益率:{total_return_strategy:.2%}")
print(f"策略胜率:{win_rate:.2%}")
print("\n注意:此为简化回测,仅供参考")
print("=" * 60 + "\n")
# ========== 第十步:可视化 ==========
plt.figure(figsize=(14, 12))
# 子图1:价格走势
plt.subplot(2, 1, 1)
plt.plot(df.index[-200:], df['close'][-200:], label='Close Price',
linewidth=1.5, color='black')
plt.title('Price Chart (Last 200 days)', fontsize=14)
plt.ylabel('Price')
plt.legend()
plt.grid(True, alpha=0.3)
# 子图2:MOM指标
plt.subplot(2, 1, 2)
plt.plot(df.index[-200:], df['MOM_10'][-200:], label='MOM (10) - 动量指标',
linewidth=1.5, color='blue')
plt.plot(df.index[-200:], df['MOM_signal_6'][-200:], label='信号线 (SMA6)',
linewidth=1.5, color='orange', linestyle='--')
plt.axhline(y=0, color='red', linestyle='-', linewidth=1.5, label='零轴')
# 填充零轴上下区域
plt.fill_between(df.index[-200:], 0, df['MOM_10'][-200:],
alpha=0.1, color='green', where=(df['MOM_10'][-200:] > 0))
plt.fill_between(df.index[-200:], df['MOM_10'][-200:], 0,
alpha=0.1, color='red', where=(df['MOM_10'][-200:] < 0))
# 标记穿越信号
buy_signals = df[df['cross_above_zero']]
sell_signals = df[df['cross_below_zero']]
plt.scatter(buy_signals.index[-30:], buy_signals['MOM_10'][-30:],
color='green', marker='^', s=80, label='上穿零轴(买入)', alpha=0.8)
plt.scatter(sell_signals.index[-30:], sell_signals['MOM_10'][-30:],
color='red', marker='v', s=80, label='下穿零轴(卖出)', alpha=0.8)
# 标记金叉
golden = df[df['golden_cross']]
death = df[df['death_cross']]
plt.scatter(golden.index[-30:], golden['MOM_10'][-30:],
color='lime', marker='*', s=100, label='金叉', alpha=0.8)
plt.scatter(death.index[-30:], death['MOM_10'][-30:],
color='darkorange', marker='*', s=100, label='死叉', alpha=0.8)
plt.title('MOM(动量指标)- 零轴穿越与信号线交叉', fontsize=14)
plt.xlabel('Date')
plt.ylabel('MOM Value')
plt.legend(loc='upper left')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# ========== 第十一步:数据清洗提示 ==========
nan_count = df['MOM_10'].isna().sum()
print(f"\nMOM初始NaN数量:{nan_count}")
print("原因:MOM需要至少length个周期的数据才能计算差值")
print("处理建议:df_clean = df.iloc[10:].copy()")
print("\n" + "=" * 60)
print("MOM使用提示:")
print("1. MOM以0轴为多空分界线:上穿买入,下穿卖出")
print("2. 不同周期的MOM表现差异大:短周期灵敏但噪声多,长周期平滑但滞后")
print("3. 绝对值大小反映趋势强度,但无固定超买超卖阈值,需结合历史数据判断")
print("4. 背离是最可靠的趋势反转预警信号")
print("5. 建议结合RSI、移动平均线、成交量等指标配合使用")
print("6. 对于跨品种比较,建议使用ROC(比率形式)而非MOM差值")
print("=" * 60)
五、总结
MOM(动量指标)是技术分析中最基础、最直观的动量工具之一,其核心价值与定位如下:
| 维度 | 特点 |
|---|---|
| 核心创新 | 直接衡量价格变化速度,捕捉趋势强弱变化 |
| 核心公式 | MOM=Closet−Closet−n\mathrm{MOM} = \mathrm{Close}_t - \mathrm{Close}_{t-n}MOM=Closet−Closet−n |
| 三大核心信号 | 零轴穿越、信号线金叉死叉、顶底背离 |
| 常用参数 | 10或12周期(标准),5-7周期(短线),14-20周期(中线) |
| 最佳应用场景 | 趋势确认、动量判断、趋势反转预警 |
| 主要局限 | 无固定边界、价格水平影响、震荡市假信号 |
实战使用三原则:
- 零轴定方向:MOM上穿零轴是多头信号,下穿零轴是空头信号。这是MOM最基础、最核心的用法
- 背离是最强反转信号:当价格与MOM出现顶背离或底背离时,往往预示着重要的趋势反转,可靠性高于单纯的零轴穿越
- 多指标配合提高胜率:将MOM与移动平均线(判断主趋势)、RSI(确认超买超卖)、成交量(验证突破)等指标配合使用,显著提高信号可靠性
最后提醒:MOM的价值在于其简单直接的逻辑——它不问价格为什么涨跌,只问价格涨得多快。这一特性使其成为趋势交易的得力助手。然而,简单不等于容易。MOM信号的有效性高度依赖于市场环境:在强劲趋势中它是顺势持仓的可靠工具,在震荡市场中它可能频繁产生假信号。正如交易格言所说:“没有完美的指标,只有完美的配合。”将MOM作为多指标分析体系中的一环,结合价格行为、成交量和其他技术指标综合判断,才能发挥其最大价值。
更多推荐



所有评论(0)