第四章:技术指标计算

技术指标,说白了就是把价格数据「加工」一下,让它更容易看懂。我刚开始做量化的时候,总觉得指标越多越好,后来发现——嗯,贪多嚼不烂。今天咱们就聊聊最常用的几个:移动平均线、RSI、布林带,以及怎么自己造轮子。

4.1 移动平均线(MA & MACD)

移动平均线是最基础的趋势指标。它把一段时间内的价格平均一下,去掉噪音,让你看清方向。

简单移动平均线(SMA)

公式很简单:把 N 天的收盘价加起来,除以 N。我习惯用 20 日均线做中期趋势参考,60 日均线看大方向。

def sma(data, window):
    """计算简单移动平均线"""
    return data['close'].rolling(window=window).mean()

指数移动平均线(EMA)

EMA 给近期的价格更高权重,反应更快。我在做短线策略时更喜欢用 EMA。

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

我的经验:EMA 虽然反应快,但假信号也多。我一般用 EMA12 和 EMA26 的交叉来做趋势确认,而不是直接下单。

MACD 指标

MACD 是 EMA 的衍生品。它由三部分组成:快线(DIF)、慢线(DEA)、柱状图。

def macd(data, fast=12, slow=26, signal=9):
    """计算MACD指标"""
    data['ema_fast'] = ema(data, fast)
    data['ema_slow'] = ema(data, slow)
    data['dif'] = data['ema_fast'] - data['ema_slow']
    data['dea'] = ema(data[['close', 'dif']], signal)  # 对DIF再做EMA
    data['macd_bar'] = 2 * (data['dif'] - data['dea'])
    return data

避坑指南:我曾经在回测时直接用现成的 talib 库算 MACD,结果发现参数默认值和交易所的不一样。后来我都是自己手写,确保逻辑完全一致。

4.2 相对强弱指标(RSI)

RSI 衡量价格变动的速度和幅度,用来判断超买超卖。说白了就是——涨得太猛了可能要跌,跌得太狠了可能要涨。

def rsi(data, window=14):
    """计算相对强弱指标"""
    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

你想想看,RSI 超过 70 算超买,低于 30 算超卖。但我在实战中发现,强势行情里 RSI 可以在 80 以上待很久,这时候做空很容易被轧空。

注意:RSI 在震荡行情中很好用,但在单边趋势里容易给出反向信号。我一般会配合趋势指标一起用,比如 RSI 超卖 + 价格在 MA60 上方,才考虑做多。

4.3 布林带(Bollinger Bands)

布林带由三条线组成:中轨(MA)、上轨(中轨 + 2倍标准差)、下轨(中轨 - 2倍标准差)。它告诉你价格在什么范围内波动。

def bollinger_bands(data, window=20, num_std=2):
    """计算布林带"""
    data['middle'] = sma(data, window)
    data['std'] = data['close'].rolling(window=window).std()
    data['upper'] = data['middle'] + num_std * data['std']
    data['lower'] = data['middle'] - num_std * data['std']
    return data

布林带最常用的策略是「开口扩张」和「价格触碰上下轨」。我记得有一次做期货,价格连续三次触碰上轨都没突破,我果断做空,赚了一波回调。

核心逻辑:布林带收窄意味着波动率降低,往往预示着大行情要来了。这时候我会减少仓位,等方向明确再进场。

4.4 自定义指标开发

说实话,市面上的指标大家都用,很难有超额收益。真正赚钱的策略,往往用自定义指标。

开发步骤

  1. 定义逻辑:你想捕捉什么市场行为?比如我想抓「放量突破后的回调确认」。
  2. 数学表达:把逻辑变成公式。比如:价格突破前高 + 成交量放大 + RSI 回踩 50 不破。
  3. 代码实现:用 pandas 向量化计算,别用循环。
  4. 回测验证:看看历史表现如何,有没有过拟合。
def custom_indicator(data):
    """自定义指标:放量突破回调确认"""
    # 计算20日最高价
    data['high_20'] = data['high'].rolling(20).max()
    # 突破信号:收盘价突破20日最高价
    data['breakout'] = data['close'] > data['high_20'].shift(1)
    # 成交量放大:当日成交量是20日均量的1.5倍
    data['volume_avg'] = data['volume'].rolling(20).mean()
    data['volume_surge'] = data['volume'] > data['volume_avg'] * 1.5
    # RSI回踩50不破
    data['rsi'] = rsi(data)
    data['rsi_hold'] = (data['rsi'] > 50) & (data['rsi'].shift(1) <= 50)
    # 综合信号
    data['signal'] = data['breakout'] & data['volume_surge'] & data['rsi_hold']
    return data

我的建议:自定义指标不要搞太复杂。我见过有人把十几个条件叠在一起,回测曲线漂亮得不行,一上实盘就崩。记住——越简单越稳定。

知识体系总览

下面这张图帮你理清本章的核心脉络:

技术指标计算 移动平均线 SMA / EMA / MACD RSI 超买超卖判断 布林带 波动率通道 自定义指标 逻辑→数学→代码→回测 核心:趋势 + 动量 + 波动率 + 自定义逻辑

这张图把四个指标的关系串起来了。移动平均线看趋势,RSI 看动量,布林带看波动率,自定义指标则是你的独家武器。我在做策略时,一般会从这四个维度各选一个指标,组合成一个完整的交易系统。

最后说一句:指标只是工具,不是圣杯。我见过有人用最简单的双均线系统赚了大钱,也见过有人堆了十几个指标照样亏。关键是你得理解每个指标在说什么,以及什么时候该听它的,什么时候该忽略它。


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