Skip to content

📘 SMA 与 EMA 指标全解析:公式、计算、背离与实战策略

一. SMA与EMA 基础介绍

SMA(Simple Moving Average,简单移动平均线) 指过去 N 根 K 线收盘价的算术平均,代表价格的平滑趋势,适合趋势判断与支撑阻力分析。

EMA(Exponential Moving Average,指数加权移动平均线) 对近期价格赋予更高权重,反应更灵敏,适合捕捉短期动量与转折。

1、什么是 SMA(Simple Moving Average)

定义:SMA 是「简单移动平均线」,指过去 N 根K线的收盘价的算术平均。常用于趋势判断,平滑价格波动。

公式

[SMA = \frac{C_1 + C_2 + ... + C_n}{n}]

其中:

  • [C_n]:表示第 n 根K线的收盘价
  • [n]:周期长度,例如 5、20、60

2、什么是 EMA(Exponential Moving Average)

定义:EMA 是「指数加权移动平均线」,最近的数据权重更高。比 SMA 更敏感、响应更快。

公式(递推公式)

[EMA_{today} = \alpha \times Price_{today} + (1 - \alpha) \times EMA_{yesterday}]

其中:

  • [\alpha](平滑系数)= [\frac{2}{n + 1}]
  • [n] 是周期长度
  • [EMA_{yesterday}] 是上一周期的 EMA 值

3、用一组数据来模拟计算

我们用以下 5 天的收盘价进行模拟计算:

收盘价(Close): [10, 12, 13, 14, 15]
周期 n = 5

4、计算 SMA

[SMA_5 = \frac{10 + 12 + 13 + 14 + 15}{5} = \frac{64}{5} = 12.8]

5、计算 EMA

先算平滑系数 [\alpha]:

[\alpha = \frac{2}{5 + 1} = 0.333...]

假设第一个 EMA 值 = 第一个价格(初始化):

[EMA_1 = 10]

然后递推计算:

[EMA_2 = 0.333 \times 12 + 0.667 \times 10 = 10.67]

[EMA_3 = 0.333 \times 13 + 0.667 \times 10.67 \approx 11.45]

[EMA_4 = 0.333 \times 14 + 0.667 \times 11.45 \approx 12.30]

[EMA_5 = 0.333 \times 15 + 0.667 \times 12.30 \approx 13.20]

最终结果

SMA_5 = 12.8
EMA_5 ≈ 13.20

二、EMA 和 SMA 各自适合的周期与场景

类型推荐周期适用场景特点
SMA中长期(20/50/200)趋势判断、支撑阻力更平滑,适合长期持仓
EMA短中期(5/10/20)短线进出场、快节奏市场更灵敏,适合快进快出

三、SMA 与 EMA 优缺点及适用周期

特性SMAEMA
响应速度
平滑性高,过滤噪音更好低,信号更敏感
假信号概率
实盘鲁棒性高,适合稳健趋势交易低,易受滑点影响
推荐周期中长期(20/50/200)短中期(5/10/20)
适用策略类型趋势跟随、中长持有短线动量捕捉、高频交易

四、金叉/死叉 交易信号

  • 金叉(买入):短期均线上穿长期均线(如 EMA5 > EMA20)
  • 死叉(卖出):短期均线下穿长期均线(如 SMA10 < SMA60)
  • 趋势判断:价格高于均线为上涨趋势,反之为下跌

✅ 趋势判断(价格 vs 均线)

条件解读
价格 > 均线上升趋势 / 支撑区域
价格 < 均线下跌趋势 / 压力区域

五、背离信号

背离是价格走势与技术指标(如均线)方向不一致的现象,通常意味着当前趋势动能减弱,可能预示趋势反转或调整即将到来。

背离主要有以下几种类型:

顶背离(Bearish Divergence)

价格创出新高,但指标未同步创新高,暗示上涨动能减弱,可能出现下跌反转。

底背离(Bullish Divergence)

价格创出新低,但指标未同步创新低,表明下跌动能减弱,可能出现反弹或趋势反转向上。

隐藏背离(Hidden Divergence)

价格高点或低点未创新高/低,但指标出现相反趋势,常用于判断趋势的延续。

这几种背离帮助交易者识别潜在的趋势转折或延续信号。

价格与均线的背离(Price-MA Divergence)

公式

[div = \frac{Price - MA}{MA} \times 100%]

表示价格偏离某条均线的百分比。若为正,说明价格高于均线;为负,表示价格低于均线。


🔢 计算 SMA 和 EMA 背离

收盘价(close)过去 10 天:

[100, 102, 101, 103, 105, 104, 106, 107, 108, 110]

周期 n = 5,计算 EMA5:

平滑系数

[\alpha = \frac{2}{5 + 1} = 0.333]

假设第1天 EMA5 初始化等于第1天收盘价,即 [EMA_1 = 100]。

1. 计算 EMA5 序列

递推计算 EMA5:

天数收盘价 (Price)计算过程EMA5 值
1100初始化100.00
21020.333×102 + 0.667×100 = 34+66.7100.67
31010.333×101 + 0.667×100.67 ≈ 33.67+67.12100.79
41030.333×103 + 0.667×100.79 ≈ 34.33+67.19101.52
51050.333×105 + 0.667×101.52 ≈ 35+67.68102.68
61040.333×104 + 0.667×102.68 ≈ 34.67+68.43103.10
71060.333×106 + 0.667×103.10 ≈ 35.33+68.75104.08
81070.333×107 + 0.667×104.08 ≈ 35.67+69.44105.11
91080.333×108 + 0.667×105.11 ≈ 36+70.07106.07
101100.333×110 + 0.667×106.07 ≈ 36.67+70.71107.38

2. 三种背离案例模拟

  • 顶背离:下跌趋势信号
  • 底背离:上涨趋势信号
  • 隐藏背离:趋势延伸信号

2.1 顶背离(Bearish Divergence)示例

条件

价格创新高,但 EMA5 未创新高或走弱。

观察第 9 天和第 10 天:

  • 价格第9天是 108,第10天涨到 110(新高)
  • EMA5 第9天是 106.07,第10天涨到 107.38(新高,但涨幅较小)

如果我们用更宽松的判断,可以假设 EMA5 第10天实际低于第9天,或涨幅非常有限,表示 EMA 动能减弱。

比如 如果第10天 EMA5 计算出 106.5(比第9天低),则是明显顶背离

背离计算(假设 EMA10天 = 106.5)

价格高点差 = 110 - 108 = +2    (新高)
EMA5高点差 = 106.5 - 106.07 = +0.43    (涨幅极小,可能走弱)

顶背离信号暗示上涨动能减弱,警惕价格可能回调下跌。

2.2 底背离(Bullish Divergence)示例

条件

价格创新低,但 EMA5 未创新低或走强。

看第 2 天和第 3 天数据:

  • 价格第2天是 102,第3天回落到 101(新低)
  • EMA5 第2天是 100.67,第3天是 100.79(上涨)

计算背离

价格低点差 = 101 - 102 = -1         (新低)
EMA5低点差 = 100.79 - 100.67 = + 0.12    (EMA上涨,动能回升)

说明价格在创新低,但 EMA5 在走高,出现底背离,预示下跌动能减弱,可能反弹。

2.3 隐藏背离(Hidden Divergence)示例

隐藏背离(Hidden Divergence)的本质

  • 隐藏背离 = 趋势延续信号
  • 它不是用来判断转折点,而是判断回调后的延续

2.3.1 隐藏看多案例

条件

价格高点未创新高,但 EMA5 高点创新高。

看第 7 天和第 8 天:

  • 价格第7天是 106,第8天是 107(不是新高,可能稍有回调)
  • EMA5 第7天是 104.08,第8天是 105.11(创新高)

判断

价格高点差 = 107 - 106 = +1   (不是明显新高,可以认为是小回调)
EMA5高点差 = 105.11 - 104.08 = +1.03   (EMA创新高)

🔍 解释

是的,107 确实高于 106,是绝对的新高 —— 这是从数字大小来说没错的。但这里说"不是明显新高",背后的意思是:

  • 虽然价格略微创了新高,但幅度只有 +1(从 106 到 107),涨幅非常小;
  • 相比于之前的走势,这种涨幅可能不足以代表"趋势持续向上",反而可能是冲高乏力的信号。

🧠 通俗理解

如果你连续几天价格是:100 → 105 → 106 → 107,涨得越来越慢,即使 107 是新高,但涨幅只有 +1,可能代表"上涨动能变弱"。

这说明虽然价格未创新高,但动能指标(EMA5)走强,趋势可能继续上涨,称为隐藏看多背离

2.3.2 隐藏看空案例(类似)

价格低点未创新低,但 EMA 低点创新低,暗示下跌趋势延续。


3. 计算背离百分比示例

以第 10 天顶背离为例(假设 EMA10 天 = 106.5):

价格 vs EMA10 背离计算公式

[div = \frac{Price - EMA}{EMA} \times 100%]

具体数值代入

[div = \frac{110 - 106.5}{106.5} \times 100% = \frac{3.5}{106.5} \times 100% \approx 3.29%]

解释

价格(110)相较于 EMA10(106.5)高出约 3.29%。这意味着价格已经远远跑赢了均线,短期涨势强劲。

背离含义和风险

  • 如果价格创出新高(110),但 EMA10 没有相应创新高(仍是 106.5 或更低),说明价格涨速远超均线反映的趋势动能。
  • 这种"价格与均线背离"通常意味着价格短期上涨过快,可能进入超买区。
  • 背离越大,代表价格偏离趋势基础越严重,潜在的调整或反转风险也越大。
  • 特别是在顶背离场景中,如果均线未创新高且背离明显,往往是市场上涨动力不足、可能出现价格回调或下跌的重要信号。

背离百分比 总结

背离百分比含义操作建议
小于1%价格与均线走势同步继续持有或观望
1%~3%价格开始偏离均线注意风险,观察信号
大于3%价格远超均线,背离明显谨慎减仓,防范反转

提示:背离只是风险预警信号,结合成交量、其他指标和形态判断,才能提高准确性。


背离信号 总结

背离类型价格表现EMA表现含义
顶背离价格创新高EMA不创新高或走弱上涨动能减弱,风险
底背离价格创新低EMA不创新低或走强下跌动能减弱,反弹
隐藏背离价格未创新高/低EMA创新高或创新低趋势延续信号

六、信号陷阱与应对策略

在趋势策略中,EMA / SMA(指数 / 简单移动平均线)交叉信号广泛用于判断买卖点,但它们也常出现"信号陷阱",尤其在震荡市或极端行情下,容易导致误判开仓和平仓,甚至连续亏损。下面我们详细解析这些陷阱类型,并提供对应的解决方案:

1. ❌ 震荡市频繁金叉死叉("抖动陷阱")

表现:价格在短周期内上下波动,导致均线频繁交叉,但趋势并未真正形成。

问题:连续开仓和平仓,积小亏为大亏。

示意图

价格: ─╮╰─╮╰─╮╰──(震荡)
SMA10:╭──╯╭──╯╭──(频繁交叉 SMA30)

解决方案

  • 增加趋势确认条件,如 ADX > 20 或 MACD 柱线放大。
  • 设置时间过滤器(信号出现后等待N根K线确认)避免立即入场。
  • 引入波动率过滤器(如 ATR / Bollinger Band)。

2. ❌ 假金叉 / 死叉陷阱("伪信号陷阱")

表现:金叉信号出现,但没有价格放量或上涨持续性,结果价格很快反转下跌。

常见于:重要均线附近(如SMA200)、支撑阻力位、消息面扰动。

解决方案

  • 配合 成交量放大作为辅助信号(如金叉时 volume > 平均量 * 1.2)。
  • 结合 K线结构,如金叉当日为大阳线、吞没形态。
  • 对信号滞后,设置 入场缓冲带,如收盘价高于交叉点一定幅度。

3. ❌ 延迟陷阱("落后信号陷阱")

表现:价格已上涨很大一段后才出现金叉信号,此时入场已经是尾部,回调风险高。

尤其是:SMA信号较慢,EMA稍快但仍有滞后。

解决方案

  • 结合价格与均线**乖离(divergence)**过滤过迟信号,如 EMA10 与 EMA50 距离超阈值时不入场。
  • 引入提前指标如 RSI / Momentum 先行判断,金叉仅作确认。
  • 尝试短期 EMA(如 EMA5/EMA13)配合更快判断。

4. ❌ 死叉时割肉陷阱("止盈提前陷阱")

表现:死叉刚出现就平仓,但价格并未真正下跌,反而继续上涨,导致踏空利润。

原因:死叉并不总意味着趋势结束。

解决方案

  • 死叉后 设置延迟平仓机制,例如3根K线确认价格下跌后再退出。
  • 或采用趋势判断类止盈机制,如价格跌破EMA30 + RSI<50 才平仓。
  • 使用自定义 ROI 曲线或动态止盈而非一刀切死叉退出。

✅ 总结与应对建议表格

陷阱类型典型表现原因分析应对策略
震荡交叉频繁快速多次开平仓市场无趋势加趋势确认(ADX/MACD)、等待确认、多因子过滤
假金叉 / 死叉信号后反向走缺乏放量 / 势能成交量判断、K线形态验证、价格确认
延迟信号入场太晚均线滞后结合快线乖离、价格突破确认、快周期EMA
死叉误平仓止盈点过早趋势仍在延续死叉后延迟退出、动态止盈、趋势过滤

七、策略示例(Freqtrade)

申明:本策略旨在学习交流,实际操作请严格风险控制,造成的损失由本人承担。

策略逻辑

  • MA 金叉死叉信号(短期均线和长期均线交叉)
  • 连续3个背离信号(价格与短期MA的背离连续出现3次触发)
python
from freqtrade.strategy import IStrategy
import talib

class MAStrategy(IStrategy):
    timeframe = '15m'
    stoploss = -0.10
    minimal_roi = {"0": 0.05}

    # 背离检测窗口长度
    divergence_window = 1

    def populate_indicators(self, dataframe, metadata):
        # 计算短期和长期SMA
        dataframe['sem_10'] = talib.SMA(dataframe['close'], timeperiod=10)
        dataframe['sma_50'] = talib.SMA(dataframe['close'], timeperiod=50)

        # 价格与短期均线的背离百分比
        dataframe['divergence'] = (dataframe['close'] - dataframe['sem_10']) / dataframe['sem_10'] * 100

        return dataframe

    def _check_divergence(self, dataframe, idx):
        """
        判断在 idx 位置,是否出现了连续3根背离信号,
        这里简单定义:背离绝对值大于阈值 1%,连续3根
        """
        if idx < self.divergence_window - 1:
            return False
        recent_divs = dataframe['divergence'].iloc[idx - (self.divergence_window - 1): idx + 1]
        # 绝对值均大于 1%
        if all(abs(d) > 1.0 for d in recent_divs):
            return True
        return False

    def populate_entry_trend(self, dataframe, metadata):
        dataframe['enter_long'] = 0

        for i in range(len(dataframe)):
            # 金叉买入条件:短期均线从下穿越长期均线
            if i == 0:
                continue
            prev_short = dataframe.at[i - 1, 'sem_10']
            prev_long = dataframe.at[i - 1, 'sma_50']
            curr_short = dataframe.at[i, 'sem_10']
            curr_long = dataframe.at[i, 'sma_50']

            golden_cross = prev_short < prev_long and curr_short > curr_long

            # 连续3个背离信号
            divergence_signal = self._check_divergence(dataframe, i)

            if golden_cross and divergence_signal:
                dataframe.at[i, 'enter_long'] = 1

        return dataframe

    def populate_exit_trend(self, dataframe, metadata):
        dataframe['exit_long'] = 0

        for i in range(len(dataframe)):
            if i == 0:
                continue
            prev_short = dataframe.at[i - 1, 'sem_10']
            prev_long = dataframe.at[i - 1, 'sma_50']
            curr_short = dataframe.at[i, 'sem_10']
            curr_long = dataframe.at[i, 'sma_50']

            # 死叉卖出条件:短期均线从上穿越长期均线
            death_cross = prev_short > prev_long and curr_short < curr_long

            if death_cross:
                dataframe.at[i, 'exit_long'] = 1

        return dataframe

策略运行命令请查看Freqtrade篇


回测结果 MAStrategy

  • 交易次数:11
  • 平均收益率:1.47%
  • 总收益:53.76 USDT(5.38%)
  • 平均持仓时间:9 小时 10 分钟
  • 胜 / 平 / 负:7 / 0 / 4
  • 胜率:63.6%
  • 最大回撤:22.30 USDT(2.12%)

八、结语与实用建议

  • SMA 与 EMA 是最基础且重要的趋势指标,但必须结合市场结构和其他指标使用,避免机械操作。
  • 背离指标是领先预警信号,合理设定阈值并结合多因素确认,能有效降低假信号风险。
  • 建议多周期、多品种回测验证策略参数,结合趋势过滤与量能确认提升实盘稳定性。