3. 技术指标基础:移动平均线、指数移动平均与布林带
做量化择时,说白了就是跟价格数据打交道。而技术指标,就是我们解读这些数据的「翻译官」。今天咱们聊聊三个最基础、也最实用的指标:MA、EMA 和布林带。
我个人习惯,在搭建任何择时系统之前,都会先把这几个指标吃透。为什么?因为它们构成了绝大多数策略的「地基」。地基不稳,楼盖得再高也白搭。
3.1 移动平均线(MA)
移动平均线,也叫简单移动平均。它的计算方式很直白:取过去 N 个周期的收盘价,算个平均值。
公式长这样:
MA(N) = (P₁ + P₂ + ... + Pₙ) / N
其中 P 是收盘价,N 是周期数。
举个例子:
假设某股票最近 5 天的收盘价是:10, 11, 12, 13, 14。那么 5 日 MA 就是:
MA(5) = (10 + 11 + 12 + 13 + 14) / 5 = 12
嗯,就这么简单。
核心要点:MA 的本质是「平滑」价格波动。它滤掉了短期的噪音,让你看清趋势的方向。
我在项目中遇到过一个问题:用 MA 做信号,总是滞后。你想想看,价格都涨上去了,MA 才慢慢跟上。这就是 MA 的天然缺陷——它对所有数据一视同仁,不管是最新的价格还是 10 天前的价格,权重都一样。
实战技巧:我个人习惯用 5 日、20 日、60 日三条 MA。5 日看短期,20 日看中期,60 日看长期。三条线多头排列(短期在上、长期在下)时,趋势向上;空头排列时,趋势向下。
3.2 指数移动平均(EMA)
EMA 的出现,就是为了解决 MA 的滞后问题。它给最近的价格更高的权重,让指标对价格变化更敏感。
计算公式稍微复杂一点:
EMA(今日) = (今日收盘价 × 平滑系数) + (昨日 EMA × (1 - 平滑系数))
其中平滑系数 = 2 / (N + 1)
举个例子:
还是上面那组数据,计算 5 日 EMA:
- 平滑系数 = 2 / (5 + 1) = 0.333
- 第一天没有昨日 EMA,所以用收盘价代替:EMA₁ = 10
- 第二天:EMA₂ = 11 × 0.333 + 10 × 0.667 = 10.333
- 第三天:EMA₃ = 12 × 0.333 + 10.333 × 0.667 = 10.889
- 以此类推...
你看,EMA 对最近的价格变化反应更快。这就是它的优势。
注意:EMA 虽然反应快,但也更容易被「假突破」欺骗。我曾经在震荡市中用 EMA 做信号,结果频繁被来回打脸。后来我加了一个「确认机制」——等价格突破 EMA 后,再等一根 K 线确认,才进场。
说白了,MA 和 EMA 没有绝对的好坏。MA 稳定,适合趋势明显的行情;EMA 灵敏,适合波动较大的品种。我一般会在趋势策略中用 MA,在短线策略中用 EMA。
3.3 布林带(Bollinger Bands)
布林带是约翰·布林格发明的。它由三条线组成:中轨(MA)、上轨和下轨。
计算公式:
中轨 = MA(N)
上轨 = 中轨 + K × 标准差
下轨 = 中轨 - K × 标准差
其中 N 通常取 20,K 通常取 2。
举个例子:
假设某股票 20 日 MA 是 100,标准差是 5,K=2:
- 中轨 = 100
- 上轨 = 100 + 2 × 5 = 110
- 下轨 = 100 - 2 × 5 = 90
布林带的核心理念是:价格有 95% 的概率落在上下轨之间。当价格触及上轨,说明超买;触及下轨,说明超卖。
关键认知:布林带不是「绝对」的买卖信号。它告诉你的是「当前价格处于什么位置」。真正有用的,是结合趋势来判断。
我记得有一次做回测,发现布林带在单边行情中经常「失效」——价格沿着上轨一直涨,你卖早了;或者沿着下轨一直跌,你抄底抄在半山腰。为什么会这样?因为布林带在趋势行情中会「开口」,上下轨被撑开,价格反而更容易「出轨」。
避坑指南:我曾经犯过一个错误——看到价格突破上轨就做空,结果被趋势行情狠狠教训了。后来我总结:布林带更适合震荡行情,在趋势行情中要配合其他指标使用。
3.4 三个指标的对比
| 指标 | 核心作用 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| MA | 识别趋势方向 | 稳定、不易被欺骗 | 滞后严重 | 趋势跟踪策略 |
| EMA | 捕捉短期变化 | 反应灵敏 | 容易产生假信号 | 短线交易、高频策略 |
| 布林带 | 判断价格位置 | 直观显示超买超卖 | 趋势行情中易失效 | 震荡行情、均值回归策略 |
3.5 知识体系总览
下面这张图,帮你理清这三个指标的关系:
3.6 代码实现
下面是用 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, k=2):
"""计算布林带"""
ma = calculate_ma(data, window)
std = data['close'].rolling(window=window).std()
upper_band = ma + k * std
lower_band = ma - k * std
return ma, upper_band, lower_band
# 使用示例
# df = pd.read_csv('stock_data.csv')
# df['MA20'] = calculate_ma(df, 20)
# df['EMA20'] = calculate_ema(df, 20)
# df['MA20'], df['Upper'], df['Lower'] = calculate_bollinger(df, 20, 2)
小建议:实际使用时,我一般会先计算 MA,再基于 MA 计算布林带。这样三个指标共用同一个「中轴」,逻辑更清晰。
嗯,以上就是三个基础指标的完整讲解。记住:指标是工具,不是圣杯。真正决定策略成败的,是你对市场的理解和对风险的把控。
公众号:蓝海资料掘金营,微信deep3321