第四节:技术指标计算——MA、EMA、布林带、RSI、MACD

技术指标这东西,说白了就是给价格数据“化妆”。

原始K线图看起来乱糟糟的,指标能帮我们提炼出趋势、强弱、超买超卖这些关键信息。我个人习惯,做CTA策略时,指标不是越多越好,而是要把每个指标的特性吃透。

4.1 移动平均线(MA)——最朴素的趋势跟踪器

MA是所有指标里最基础的。它就是把过去N天的收盘价加起来,除以N。

公式很简单:

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

举个例子,5日均线,就是最近5天收盘价的平均值。

我在项目中遇到过一个常见误区:很多人觉得MA参数越大越平滑,就越好。其实不是。参数越大,滞后越严重。你想想看,等60日均线拐头,行情可能已经走了一半。

我的建议:做日内短线用5、10、20;做波段用20、60;做趋势跟踪用120、250。别死板,得看品种波动特性。

4.2 指数移动平均(EMA)——给近期数据更多权重

EMA和MA最大的区别是什么?MA对所有数据一视同仁,EMA却“偏心”。它给最近的价格更高的权重。

公式长这样:

EMA(t) = α × P(t) + (1 - α) × EMA(t-1)
其中 α = 2 / (N + 1)

嗯,这里要注意:EMA的计算是递归的。第一个EMA值通常用MA来初始化。

我曾经在回测一个趋势策略时,发现用MA和EMA结果差很多。EMA反应更快,但假信号也多。说白了,EMA适合震荡行情后的突破确认,MA适合趋势行情中的持仓跟踪。

特性 MA EMA
计算方式 简单平均 加权平均
滞后性 较大 较小
平滑度 较平滑 较敏感
适用场景 趋势跟踪 短线交易

4.3 布林带(Bollinger Bands)——价格的“安全通道”

布林带由三条线组成:中轨(MA)、上轨(中轨+2倍标准差)、下轨(中轨-2倍标准差)。

核心思想:价格大部分时间会在上下轨之间运行。突破上轨,说明超买;跌破下轨,说明超卖。

中轨 = MA(20)
上轨 = 中轨 + 2 × σ
下轨 = 中轨 - 2 × σ
其中 σ 是过去20天收盘价的标准差

我记得有一次做螺纹钢策略,布林带收窄到极致,然后突然开口。这就是典型的“布林带收缩后的爆发”。很多CTA策略就是靠这个抓趋势启动的。

避坑指南:布林带参数(20,2)是默认值,但不是万能值。波动大的品种,比如原油,可以调大倍数到2.5或3。波动小的品种,比如国债,可以调小到1.5。我曾经因为没调参数,在原油上吃了大亏。

4.4 RSI(相对强弱指标)——判断超买超卖

RSI衡量的是过去N天内价格上涨幅度占总波动幅度的比例。取值范围0-100。

公式:

RSI = 100 - [100 / (1 + RS)]
RS = 平均上涨幅度 / 平均下跌幅度

通常,RSI > 70 视为超买,RSI < 30 视为超卖。

但这里有个坑:在强趋势行情中,RSI会长时间停留在超买或超卖区。你如果看到RSI>70就做空,可能会被趋势碾压。

我个人习惯:在震荡行情中用RSI做反转,在趋势行情中用RSI做确认。比如,RSI从超卖区回升到50以上,说明多头开始发力。

4.5 MACD(指数平滑异同移动平均线)——趋势与动量的结合

MACD由三部分组成:DIF线、DEA线、柱状图。

  • DIF线:快线EMA(12) - 慢线EMA(26)
  • DEA线:DIF的EMA(9)
  • 柱状图:DIF - DEA

核心用法:

  1. 金叉/死叉:DIF上穿DEA为金叉(买入信号),下穿为死叉(卖出信号)
  2. 零轴:DIF在零轴上方,多头市场;下方,空头市场
  3. 背离:价格创新高,但MACD没创新高,顶背离(看跌)

我曾经用MACD背离做股指期货,效果出奇的好。但要注意,背离在单边行情中容易失效。你想想看,如果价格一直涨,MACD一直钝化,背离信号会反复出现,反复打脸。

核心总结:MA看趋势方向,EMA看短期变化,布林带看波动区间,RSI看强弱状态,MACD看趋势动能。五个指标组合使用,效果远好于单一指标。

4.6 知识体系结构图

下面这张图,帮你理清这五个指标的关系:

技术指标知识体系 MA 趋势方向 EMA 短期变化 布林带 波动区间 RSI 强弱状态 MACD 趋势动能 MA、EMA、布林带、RSI 是基础指标 MACD 是它们的综合应用

4.7 代码实现示例

下面用Python实现这五个指标。代码不长,但很实用。

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 = calculate_ma(data, window)
    std = data['close'].rolling(window=window).std()
    upper = ma + num_std * std
    lower = ma - num_std * std
    return ma, upper, lower

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

def calculate_macd(data, fast=12, slow=26, signal=9):
    """计算MACD"""
    ema_fast = calculate_ema(data, fast)
    ema_slow = calculate_ema(data, slow)
    dif = ema_fast - ema_slow
    dea = dif.ewm(span=signal, adjust=False).mean()
    histogram = dif - dea
    return dif, dea, histogram
小提示:实际使用时,记得处理NaN值。前N天数据不够,指标算不出来。我一般会dropna()或者用bfill()填充。

好了,这五个指标就讲完了。记住,指标是工具,不是圣杯。真正赚钱的策略,靠的是对市场的理解,而不是指标的花哨程度。


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