第四章:技术指标计算
技术指标,说白了就是把价格数据「加工」一下,让它更容易看懂。我刚开始做量化的时候,总觉得指标越多越好,后来发现——嗯,贪多嚼不烂。今天咱们就聊聊最常用的几个:移动平均线、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 自定义指标开发
说实话,市面上的指标大家都用,很难有超额收益。真正赚钱的策略,往往用自定义指标。
开发步骤
- 定义逻辑:你想捕捉什么市场行为?比如我想抓「放量突破后的回调确认」。
- 数学表达:把逻辑变成公式。比如:价格突破前高 + 成交量放大 + RSI 回踩 50 不破。
- 代码实现:用 pandas 向量化计算,别用循环。
- 回测验证:看看历史表现如何,有没有过拟合。
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
我的建议:自定义指标不要搞太复杂。我见过有人把十几个条件叠在一起,回测曲线漂亮得不行,一上实盘就崩。记住——越简单越稳定。
知识体系总览
下面这张图帮你理清本章的核心脉络:
这张图把四个指标的关系串起来了。移动平均线看趋势,RSI 看动量,布林带看波动率,自定义指标则是你的独家武器。我在做策略时,一般会从这四个维度各选一个指标,组合成一个完整的交易系统。
最后说一句:指标只是工具,不是圣杯。我见过有人用最简单的双均线系统赚了大钱,也见过有人堆了十几个指标照样亏。关键是你得理解每个指标在说什么,以及什么时候该听它的,什么时候该忽略它。
公众号:蓝海资料掘金营,微信deep3321