3、技术指标基础:移动平均线(MA)、指数移动平均线(EMA)、布林带(Bollinger Bands)的原理与计算

各位同学,今天我们来聊聊技术指标里最基础、也最实用的三个工具:移动平均线、指数移动平均线和布林带。说实话,这三个指标我用了快十年,每次回测新策略时,第一件事就是把它们拉出来看看。它们就像交易世界的「三原色」,很多复杂策略都是基于它们组合出来的。

3.1 移动平均线(MA)——最简单的趋势过滤器

移动平均线,英文叫 Moving Average,简称 MA。说白了,就是把过去 N 天的收盘价加总,再除以 N。它的作用就是「平滑」价格数据,让你看清趋势方向,而不是被每天的随机波动晃花眼。

计算公式:

MA(N) = (P₁ + P₂ + ... + Pₙ) / N

其中 P₁ 到 Pₙ 是最近 N 个周期的收盘价。

举个例子,5 日均线就是最近 5 天收盘价的平均值。如果今天收盘价是 100,昨天是 98,前天是 95,大前天是 92,大大前天是 90,那么 MA(5) = (100+98+95+92+90)/5 = 95。

核心要点:MA 对每个数据点一视同仁,没有「厚此薄彼」。这也是它最大的特点——简单、直观、容易理解。

我在项目中遇到过一个问题:用 MA 做趋势跟踪时,参数选 20 还是 60 差别很大。20 日均线反应快,但假信号多;60 日均线平滑,但滞后严重。后来我养成了一个习惯——同时看两条均线,用「金叉死叉」来过滤信号。

3.2 指数移动平均线(EMA)——更灵敏的「升级版」

EMA 全称 Exponential Moving Average。它和 MA 最大的区别在于:给最近的数据更高的权重。你想想看,昨天的价格对今天的影响,肯定比 10 天前的价格更大,对吧?EMA 就是基于这个逻辑设计的。

计算公式:

EMA(t) = α × P(t) + (1 - α) × EMA(t-1)

其中 α = 2 / (N + 1),N 是你选择的周期数。

举个例子,计算 5 日 EMA:

  • α = 2 / (5 + 1) = 0.3333
  • EMA(1) = 第一天的收盘价(初始值)
  • EMA(2) = 0.3333 × P(2) + 0.6667 × EMA(1)
  • 以此类推...

我的经验:EMA 比 MA 更适合做短线交易。我曾经用 EMA(12) 和 EMA(26) 的组合做日内策略,信号比 MA 提前了大约 1-2 根 K 线。但要注意,EMA 在震荡行情里容易「过敏」,频繁触发假信号。

嗯,这里要注意:EMA 的初始值设置会影响前几天的计算结果。我一般会取前 N 天的 MA 作为 EMA 的初始值,这样更平滑一些。

3.3 布林带(Bollinger Bands)——价格波动的「温度计」

布林带是约翰·布林格在 80 年代发明的。它由三条线组成:中轨(通常是 20 日 MA)、上轨(中轨 + 2 倍标准差)、下轨(中轨 - 2 倍标准差)。

计算公式:

中轨 = MA(20)
上轨 = 中轨 + 2 × σ
下轨 = 中轨 - 2 × σ

其中 σ 是过去 20 天收盘价的标准差。

布林带的核心思想是:价格波动具有「均值回归」特性。当价格触及上轨时,说明市场过热,可能回调;触及下轨时,说明市场过冷,可能反弹。

避坑指南:我曾经在 2018 年用布林带做比特币交易,以为价格突破上轨就做空。结果遇到单边上涨行情,布林带「开口」越来越大,价格沿着上轨一路狂奔,我连续止损了 5 次。后来才明白:布林带在趋势行情里会失效,它更适合震荡市。

3.4 三个指标的对比与选择

指标 特点 适用场景 缺点
MA 简单、直观、稳定 长线趋势判断 滞后严重
EMA 灵敏、反应快 短线交易、交叉信号 震荡行情假信号多
布林带 包含波动率信息 震荡市、均值回归策略 趋势行情失效

3.5 Python 代码实现

下面是我常用的计算代码,用 Pandas 实现,简洁高效:

import pandas as pd
import numpy as np

def calculate_ma(data, window=20):
    """计算移动平均线"""
    return data['close'].rolling(window=window).mean()

def calculate_ema(data, window=20):
    """计算指数移动平均线"""
    return data['close'].ewm(span=window, adjust=False).mean()

def calculate_bollinger(data, window=20, num_std=2):
    """计算布林带"""
    ma = data['close'].rolling(window=window).mean()
    std = data['close'].rolling(window=window).std()
    upper = ma + num_std * std
    lower = ma - num_std * std
    return ma, upper, lower

# 使用示例
df = pd.read_csv('price_data.csv')
df['MA20'] = calculate_ma(df, 20)
df['EMA20'] = calculate_ema(df, 20)
df['BB_MID'], df['BB_UPPER'], df['BB_LOWER'] = calculate_bollinger(df, 20, 2)

小技巧:计算 EMA 时,adjust=False 这个参数很重要。它表示使用「无限期」的 EMA 计算方式,更符合金融领域的标准做法。我刚开始用 Pandas 时没注意这个参数,结果算出来的 EMA 和 TradingView 对不上,排查了半天才发现问题。

3.6 知识体系结构图

下面这张图展示了三个指标之间的关系和应用场景:

技术指标基础:MA、EMA、布林带 移动平均线 (MA) 指数移动平均线 (EMA) 布林带 (BB) 简单平均,权重相等 指数加权,近期优先 包含波动率信息 应用场景 长线趋势判断 支撑/阻力位识别 短线交易信号 金叉死叉策略 均值回归策略 波动率突破信号 三者结合使用:MA 看方向,EMA 抓时机,布林带定边界

我个人习惯把这三个指标组合使用:用 MA 判断大方向,用 EMA 捕捉入场时机,用布林带设定止损止盈位置。当然,没有万能指标,关键还是理解它们的原理和局限性。


公众号:蓝海资料掘金营,微信deep3321