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 捕捉入场时机,用布林带设定止损止盈位置。当然,没有万能指标,关键还是理解它们的原理和局限性。
公众号:蓝海资料掘金营,微信deep3321