第1章:技术指标计算——移动平均线、RSI、布林带与MACD

各位同学,欢迎来到《AI交易策略开发与风险控制实战》的第一章。

今天咱们聊点实在的——技术指标。说实话,很多新手一上来就堆十几个指标,结果策略跑起来跟抽风似的。我个人习惯是:先吃透四个核心指标,再谈组合。这就像学功夫,先扎好马步,再练招式。

这章我们重点讲四个:移动平均线(SMA/EMA)、相对强弱指标(RSI)、布林带(Bollinger Bands)、MACD。它们几乎覆盖了趋势、动量、波动性三大维度。你想想看,一个策略如果能把这几个维度都照顾到,稳定性会好很多。

核心观点:技术指标不是越多越好,关键是理解每个指标在“描述什么市场状态”。

技术指标 四大核心 移动平均线 SMA / EMA 趋势方向 + 支撑阻力 RSI 相对强弱指标 超买超卖 + 动量 布林带 Bollinger Bands 波动率 + 价格通道 MACD 指数平滑异同平均 趋势强度 + 信号线 四大指标覆盖趋势、动量、波动性三大维度

1.1 移动平均线:SMA 与 EMA

移动平均线,说白了就是给价格“抹平”一下,去掉那些杂音。我刚开始做量化时,总喜欢用很短的周期,结果被假突破坑了好几次。后来才明白——周期越长,信号越稳,但反应也越慢

SMA(简单移动平均线):就是把最近N天的收盘价加起来除以N。简单粗暴,但有个缺点——它对所有数据一视同仁,哪怕昨天的价格和30天前的价格权重一样。

EMA(指数移动平均线):这个就聪明多了,越近的数据权重越大。我个人习惯用EMA做短线交易,因为它反应快。

我的经验:做日内交易用EMA12/EMA26组合,做趋势跟踪用SMA50/SMA200。别混着用,容易乱。

# Python 实现 SMA 和 EMA
import pandas as pd
import numpy as np

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

def calculate_ema(data, window=20, smoothing=2):
    """计算指数移动平均线"""
    # smoothing 通常取 2,即 EMA = 2/(N+1)
    alpha = smoothing / (window + 1)
    return data['close'].ewm(alpha=alpha, adjust=False).mean()

# 示例用法
# df['SMA_20'] = calculate_sma(df, 20)
# df['EMA_12'] = calculate_ema(df, 12)

避坑指南:我曾经在回测时用了未来数据——用当天的收盘价计算当天的均线,结果策略看起来完美,实盘却亏成狗。记住:计算指标时只能用历史数据,别偷看未来。

1.2 相对强弱指标(RSI)

RSI 这玩意儿,说白了就是衡量“最近涨得猛不猛”。取值范围0到100,通常认为超过70是超买,低于30是超卖。

但这里有个坑——在强趋势行情里,RSI会长时间停留在超买或超卖区。如果你看到RSI>70就做空,可能会被趋势碾碎。我吃过这个亏,后来加了个条件:只有RSI从超买区掉头向下时才做空。

def calculate_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 < 30 做多,RSI > 70 做空
# 但建议加一个“背离”条件,信号更可靠

关键点:RSI 的背离信号比单纯超买超卖更可靠。价格创新低但RSI没创新低——这叫底背离,往往是反转信号。

1.3 布林带(Bollinger Bands)

布林带由三条线组成:中轨(通常是SMA20)、上轨(中轨+2倍标准差)、下轨(中轨-2倍标准差)。它告诉我们——价格现在处于什么波动水平

你想想看,当布林带收窄时,说明市场在“憋大招”,很快要出方向了。当价格突破上轨,不一定就是做空信号——在强趋势里,价格可以沿着上轨一直跑。

def calculate_bollinger(data, window=20, num_std=2):
    """计算布林带"""
    data['SMA'] = data['close'].rolling(window=window).mean()
    data['STD'] = data['close'].rolling(window=window).std()
    
    data['Upper'] = data['SMA'] + num_std * data['STD']
    data['Lower'] = data['SMA'] - num_std * data['STD']
    
    return data[['SMA', 'Upper', 'Lower']]

# 布林带宽度 = (上轨 - 下轨) / 中轨
# 宽度收窄到历史低位时,注意变盘

我的习惯:布林带配合RSI一起用。当价格触及下轨且RSI<30时,做多胜率会高很多。反之亦然。

1.4 MACD 指标

MACD 全称是指数平滑异同移动平均线,名字挺唬人,其实原理不复杂。它由三部分组成:

  • DIF线:快线(EMA12)减去慢线(EMA26)
  • DEA线:DIF线的9日EMA
  • 柱状图:DIF减去DEA,反映两者差距

MACD 最常用的信号是“金叉死叉”——DIF上穿DEA是金叉,做多;下穿是死叉,做空。但说实话,单纯的金叉死叉在震荡市里会被反复打脸

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['DIF'] = data['EMA_fast'] - data['EMA_slow']
    data['DEA'] = data['DIF'].ewm(span=signal, adjust=False).mean()
    data['MACD_bar'] = 2 * (data['DIF'] - data['DEA'])
    
    return data[['DIF', 'DEA', 'MACD_bar']]

# 注意:柱状图乘以2是为了让图形更清晰,实际值不重要

避坑指南:我曾经在回测时发现MACD金叉策略收益不错,但实盘一跑就崩。后来发现——MACD在趋势行情里好用,在震荡行情里就是灾难。建议加一个趋势过滤器,比如价格在SMA200上方时只做多。

1.5 四个指标的协同使用

单个指标都有缺陷,但组合起来威力就大了。我个人常用的一个简单策略框架:

指标 做多条件 做空条件
移动平均线 价格在SMA200上方 价格在SMA200下方
RSI RSI < 30 且掉头向上 RSI > 70 且掉头向下
布林带 价格触及下轨 价格触及上轨
MACD DIF上穿DEA(金叉) DIF下穿DEA(死叉)

嗯,这里要注意——所有条件同时满足的情况很少。我一般要求至少三个条件共振才开仓。虽然信号少了,但胜率明显提升。

总结一下:技术指标是工具,不是圣杯。理解每个指标在描述什么市场状态,比盲目堆砌重要得多。下一章我们会把这些指标串起来,构建一个完整的交易策略。


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