3、技术指标计算:移动平均线、RSI、MACD的计算与信号生成逻辑

技术指标这东西,说白了就是给价格数据做「数学加工」。我刚开始做量化时,总觉得指标越多越好,后来被市场狠狠教育过——指标不在多,在于你懂它怎么算、怎么用。今天咱们就聊三个最经典的:移动平均线、RSI、MACD。

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

移动平均线,就是把过去N天的收盘价加起来除以N。听起来简单吧?但它的变种可不少。

3.1.1 简单移动平均线(SMA)

公式长这样:

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

其中P是收盘价,N是周期。我个人习惯用20日SMA做中期趋势判断。嗯,这里要注意:SMA对每个数据点一视同仁,所以它反应会慢半拍。

3.1.2 指数移动平均线(EMA)

EMA就不一样了,它给近期的价格更高权重。公式稍微复杂点:

EMA_today = (Price_today × α) + (EMA_yesterday × (1 - α))
α = 2 / (N + 1)

举个例子,N=10时,α=2/11≈0.1818。也就是说,今天的价格占18%的权重,昨天的EMA占82%。

核心区别:SMA平滑但滞后,EMA灵敏但容易假信号。我一般用EMA做短线,SMA做长线。

3.1.3 信号生成逻辑

移动平均线的信号逻辑其实就两种:

  • 金叉:短期MA上穿长期MA → 买入信号
  • 死叉:短期MA下穿长期MA → 卖出信号

我曾经在实盘里只用MA金叉死叉做策略,结果震荡市里被来回打脸。后来加了过滤条件——只在大趋势明确时用,效果好了很多。

3.2 RSI——超买超卖的「体温计」

RSI(相对强弱指标)衡量的是价格变动的速度和幅度。说白了,就是看最近一段时间里,涨的天数多还是跌的天数多。

3.2.1 计算公式

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

标准周期是14天。计算步骤:

  1. 计算每天的价格变动(涨了多少或跌了多少)
  2. 分别计算14天内上涨幅度的平均值和下跌幅度的平均值
  3. 用上面的公式算出RSI

小技巧:RSI的初始值通常用简单平均,后续用平滑平均。我习惯用Wilder的原始算法,它更接近「动量」的本质。

3.2.2 信号生成逻辑

RSI的经典用法:

  • RSI > 70:超买,可能回调 → 卖出信号
  • RSI < 30:超卖,可能反弹 → 买入信号
  • 背离:价格创新高但RSI没创新高 → 趋势可能反转

我记得有一次做股指期货,RSI到了80以上还在涨,我按捺不住做空了。结果呢?连续三天被拉爆。后来我明白了——强趋势里RSI可以长时间在超买区,不能单靠这个指标做反向交易。

3.3 MACD——趋势与动量的结合体

MACD(指数平滑异同移动平均线)是我个人最喜欢的指标。它把趋势和动量结合在了一起。

3.3.1 三个组成部分

组件 计算方式 默认参数
DIF线 快线EMA - 慢线EMA 12日EMA - 26日EMA
DEA线 DIF的EMA 9日EMA
MACD柱 (DIF - DEA) × 2

你想想看,DIF线代表短期和长期趋势的差值,DEA线是它的平滑版本,MACD柱就是两者的差距。这个设计很巧妙。

3.3.2 信号生成逻辑

MACD有三种经典信号:

  1. 金叉/死叉:DIF上穿/下穿DEA
  2. 零轴穿越:DIF上穿/下穿零轴(代表趋势转变)
  3. 背离:价格与MACD方向不一致

避坑指南:我曾经在震荡市里用MACD金叉做多,结果连续三次被假信号坑。后来加了个条件——MACD柱由负转正且连续放大两日,才确认信号有效。

3.4 实战代码示例

下面是我常用的Python实现,用pandas和numpy:

import pandas as pd
import numpy as np

def calculate_ma(df, period=20, ma_type='sma'):
    """计算移动平均线"""
    if ma_type == 'sma':
        return df['close'].rolling(window=period).mean()
    elif ma_type == 'ema':
        return df['close'].ewm(span=period, adjust=False).mean()

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

def calculate_macd(df, fast=12, slow=26, signal=9):
    """计算MACD"""
    ema_fast = df['close'].ewm(span=fast, adjust=False).mean()
    ema_slow = df['close'].ewm(span=slow, adjust=False).mean()
    dif = ema_fast - ema_slow
    dea = dif.ewm(span=signal, adjust=False).mean()
    macd_bar = (dif - dea) * 2
    return dif, dea, macd_bar

个人建议:实盘时别直接用默认参数。不同品种、不同周期,参数要调。我习惯先用历史数据回测,找到最优参数组合再上实盘。

3.5 信号生成的核心逻辑

这三个指标可以单独用,也可以组合用。我常用的组合策略:

  • 趋势确认:MA多头排列(短期在长期之上)
  • 入场时机:MACD金叉 + RSI从超卖区回升
  • 出场条件:MACD死叉 或 RSI进入超买区

为什么会这样组合?因为单一指标容易出假信号,多个指标共振时胜率会高很多。但要注意,指标太多也会导致信号稀少,错过行情。

3.6 本章知识体系

下面这张图展示了三个指标的关系和信号生成逻辑:

技术指标计算与信号生成逻辑 移动平均线 (MA) SMA:等权平均 EMA:指数加权 信号:金叉/死叉 趋势方向判断 相对强弱指标 (RSI) RS = 涨幅均值/跌幅均值 RSI = 100 - 100/(1+RS) 信号:超买/超卖/背离 动量与反转判断 MACD DIF = EMA12 - EMA26 DEA = EMA9(DIF) 信号:金叉/零轴/背离 趋势+动量综合 信号生成逻辑 单一信号:MA金叉/死叉 | RSI超买超卖 | MACD金叉死叉 组合信号:趋势确认(MA) + 入场时机(MACD+RSI) + 出场条件 核心原则:多指标共振提高胜率,但避免过度优化 三个指标各有侧重,组合使用效果更佳

嗯,以上就是三个核心技术指标的计算和信号生成逻辑。我个人觉得,理解指标背后的数学原理比记住公式更重要。你只有知道它怎么算的,才知道它什么时候会失效。

最后说一句:技术指标是工具,不是圣杯。我见过太多人沉迷于优化参数、寻找「完美指标」,结果忽略了最根本的东西——风险管理和资金管理。记住,再好的信号系统,没有风控也是白搭。


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