第四章 技术指标实战:移动平均线、RSI、布林带与MACD

各位同学,欢迎来到技术指标实战这一章。说实话,我刚入行那会儿,面对满屏的指标也是一头雾水。什么金叉死叉、超买超卖,看着都像玄学。但做了这么多年交易,我慢慢发现——指标不是用来预测未来的,而是用来描述当前市场状态的。这个认知转变,让我少亏了很多钱。

今天咱们就把四个最经典的指标讲透:移动平均线、RSI、布林带、MACD。我会结合自己的实战经验,告诉你每个指标到底怎么用,以及——更重要的是——什么时候别用

技术指标实战体系 移动平均线 MA / EMA 核心用法 趋势方向判断 金叉/死叉信号 动态支撑/阻力 相对强弱指数 RSI 核心用法 超买/超卖判断 背离信号 动量衰竭识别 布林带 Bollinger Bands 核心用法 波动率通道 上下轨突破 带宽收缩/扩张 MACD 指数平滑异同 核心用法 趋势强度与方向 信号线交叉 柱状图背离 核心原则:指标是工具,不是预言 组合使用 > 单一依赖 | 确认信号 > 预测信号

4.1 移动平均线:趋势的骨架

移动平均线,说白了就是把过去N根K线的价格拉个平均值,然后连成一条线。它帮你滤掉短期的噪音,看清真正的趋势方向。

我个人习惯把均线分成两类:

  • 简单移动平均线(SMA):所有数据权重一样。计算简单,但反应慢半拍。
  • 指数移动平均线(EMA):越近的数据权重越大。反应快,但容易假信号。

实战经验:我在做EUR/USD的日内策略时,通常用EMA12和EMA26的组合。EMA12代表短期趋势,EMA26代表中期趋势。当EMA12上穿EMA26,就是所谓的「金叉」,做多信号;下穿就是「死叉」,做空信号。

但注意——震荡行情里金叉死叉频繁出现,这时候信它就输了。我吃过这个亏,后来加了一条过滤:金叉出现时,价格必须在EMA26上方至少3根K线,才算有效。

来看一段Python代码,计算EMA并生成交易信号:

import pandas as pd
import numpy as np

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

def generate_ma_signals(data, fast=12, slow=26):
    """生成均线交叉信号"""
    data['ema_fast'] = calculate_ema(data, fast)
    data['ema_slow'] = calculate_ema(data, slow)
    
    # 计算交叉信号
    data['signal'] = 0
    data.loc[data['ema_fast'] > data['ema_slow'], 'signal'] = 1
    data['position'] = data['signal'].diff()
    
    # 过滤:只在趋势确认时交易
    data['trend_confirmed'] = data['close'] > data['ema_slow']
    data['final_signal'] = 0
    data.loc[(data['position'] == 1) & (data['trend_confirmed']), 'final_signal'] = 1
    data.loc[(data['position'] == -1) & (~data['trend_confirmed']), 'final_signal'] = -1
    
    return data

小技巧:EMA的参数不是固定的。波动大的品种(比如GBP/JPY),我习惯把周期调短一点,比如EMA8和EMA21。波动小的(比如USD/CHF),用EMA20和EMA50更合适。

4.2 相对强弱指数(RSI):动量的温度计

RSI衡量的是价格变动的速度和幅度。取值范围0到100,一般认为70以上超买,30以下超卖

但这里有个坑——很多人以为RSI到70就该做空,到30就该做多。你想想看,如果真这么简单,交易员早都发财了。

避坑指南:我曾经在2019年做USD/JPY,RSI连续3天在80以上,我不断做空,结果被连续止损。后来才明白——强趋势行情里,RSI可以在超买区待很久。这时候做空就是接飞刀。

正确的做法是:RSI超买/超卖只在震荡行情里有效。趋势行情里,RSI的背离信号更有价值。

RSI背离,说白了就是价格创新高,但RSI没创新高。这说明上涨动能衰竭,反转概率大。反过来也一样。

def calculate_rsi(data, period=14):
    """计算RSI指标"""
    delta = data['close'].diff()
    gain = delta.where(delta > 0, 0)
    loss = -delta.where(delta < 0, 0)
    
    avg_gain = gain.rolling(window=period).mean()
    avg_loss = loss.rolling(window=period).mean()
    
    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

def detect_rsi_divergence(data, rsi_col='rsi'):
    """检测RSI顶背离"""
    # 简化版:价格创新高但RSI没创新高
    price_high = data['high'].rolling(5).max()
    rsi_high = data[rsi_col].rolling(5).max()
    
    divergence = (data['high'] == price_high) & (data[rsi_col] < rsi_high.shift(1))
    return divergence

4.3 布林带:波动率的可视化

布林带由三条线组成:中轨(通常是20日均线)、上轨(中轨+2倍标准差)、下轨(中轨-2倍标准差)。

它的核心思想是:价格大多数时间会在上下轨之间波动。当价格突破上轨或下轨,说明波动率在放大,可能开启新的趋势。

我个人最喜欢的是布林带的「带宽收缩」形态。当上下轨收得很窄时,说明市场在蓄力,很快会有大行情。这个信号在2015年瑞郎黑天鹅事件前出现过,可惜我当时没重视。

实战用法

  • 带宽扩张:价格突破上轨且带宽在扩大,做多;突破下轨且带宽扩大,做空。
  • 带宽收缩:等待突破方向,不提前押注。
  • 中轨回测:价格回踩中轨不破,是加仓机会。
def calculate_bollinger(data, period=20, std_dev=2):
    """计算布林带"""
    data['middle'] = data['close'].rolling(window=period).mean()
    data['std'] = data['close'].rolling(window=period).std()
    data['upper'] = data['middle'] + std_dev * data['std']
    data['lower'] = data['middle'] - std_dev * data['std']
    
    # 带宽指标
    data['bandwidth'] = (data['upper'] - data['lower']) / data['middle']
    # 带宽收缩信号(带宽小于历史20%分位)
    threshold = data['bandwidth'].rolling(100).quantile(0.2)
    data['squeeze'] = data['bandwidth'] < threshold
    
    return data

注意:布林带的参数不是死的。我见过有人用1.5倍标准差做短线,3倍标准差做长线。关键是要回测,找到适合你交易周期的参数。

4.4 MACD:趋势与动量的合体

MACD = 快线(EMA12) - 慢线(EMA26),再加上一条信号线(DEA9),以及柱状图(MACD - 信号线)。

嗯,听起来复杂,但用起来其实就三件事:

  1. 快慢线交叉:和均线交叉一个道理,金叉做多,死叉做空。
  2. 柱状图变化:柱状图由负转正,动量由空转多;由正转负,动量由多转空。
  3. 背离:价格和MACD走势不一致,往往是趋势反转的前兆。

我记得有一次做AUD/USD,价格在底部盘整,MACD柱状图却开始收窄,出现了底背离。我当时果断做多,后面涨了200多点。背离信号在MACD上比RSI更可靠,因为MACD包含了趋势信息。

def calculate_macd(data, fast=12, slow=26, signal=9):
    """计算MACD指标"""
    data['ema_fast'] = data['close'].ewm(span=fast, adjust=False).mean()
    data['ema_slow'] = data['close'].ewm(span=slow, adjust=False).mean()
    data['macd'] = data['ema_fast'] - data['ema_slow']
    data['signal_line'] = data['macd'].ewm(span=signal, adjust=False).mean()
    data['histogram'] = data['macd'] - data['signal_line']
    
    # 交叉信号
    data['cross'] = 0
    data.loc[data['macd'] > data['signal_line'], 'cross'] = 1
    data['cross_signal'] = data['cross'].diff()
    
    return data

4.5 组合策略:让指标互相验证

单一指标容易出假信号。我建议至少用两个不同维度的指标互相验证。比如:

组合方式 适用场景 信号确认逻辑
MA + RSI 趋势中的回调交易 价格回踩MA且RSI未超卖 → 做多
布林带 + MACD 突破交易 价格突破布林带上轨 + MACD金叉 → 做多
RSI + MACD背离 反转交易 两者同时出现背离 → 反转概率极高

重要提醒:指标组合不是越多越好。我见过有人把5个指标叠在一起,结果信号互相矛盾,根本没法交易。我的原则是——最多用3个指标,每个指标只取一个核心信号

好了,技术指标这块就讲到这里。记住一句话:指标是工具,不是圣杯。它们帮你描述市场状态,但最终决策还是要靠你的交易系统和风险管理。下一章我们会讲如何把这些指标组装成一个完整的交易策略,到时候再细聊。


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