4. 技术指标计算:移动平均线(MA)、相对强弱指数(RSI)、布林带(Bollinger Bands)、MACD
技术指标,说白了就是给K线图装上「仪表盘」。没有指标,你只能凭感觉看价格涨跌。有了指标,你就能看到趋势的力度、超买超卖的状态、以及波动率的收缩与扩张。
我个人习惯,在实盘策略里不会堆砌太多指标。两三个核心指标组合,往往比七八个指标混在一起更有效。今天咱们就把四个最经典的指标讲透——MA、RSI、布林带、MACD。
核心观点:技术指标不是预测未来的水晶球,而是描述当前市场状态的「温度计」。理解指标背后的数学逻辑,比死记硬背参数更重要。
4.1 移动平均线(MA)—— 趋势的「平滑器」
移动平均线是最基础的指标,没有之一。它的作用就一个:把价格数据中的「噪音」过滤掉,让你看清真正的趋势方向。
我记得刚入行时,有个老交易员跟我说:「别看那些花里胡哨的指标,把两根均线玩明白,就能跑赢80%的人。」当时我不信,后来踩了不少坑才明白——这话有道理。
4.1.1 简单移动平均线(SMA)
SMA就是把过去N天的收盘价加起来,除以N。公式很简单:
SMA = (P₁ + P₂ + ... + Pₙ) / N
举个例子,5日SMA就是最近5天收盘价的平均值。每天滚动计算,就形成了一条平滑的曲线。
4.1.2 指数移动平均线(EMA)
EMA和SMA的区别在于——EMA给近期的价格更高的权重。说白了,EMA对价格变化更「敏感」。
EMA = 今日收盘价 × α + 昨日EMA × (1 - α)
其中 α = 2 / (N + 1)
我个人习惯在策略里用EMA而不是SMA。为什么?因为EMA反应更快,在趋势行情里能更早给出信号。当然,快也意味着假信号可能更多——这是个取舍问题。
实战建议:做短线策略用EMA(12, 26),做中长线用SMA(50, 200)。我在回测中发现,EMA在震荡行情里容易反复打脸,这时候SMA反而更稳。
4.2 相对强弱指数(RSI)—— 动量的「体温计」
RSI衡量的是价格变动的速度和幅度。取值范围0到100,一般认为:
- RSI > 70:超买,可能回调
- RSI < 30:超卖,可能反弹
- RSI在30-70之间:正常波动区间
计算RSI的核心是「平均涨幅」和「平均跌幅」的比值:
RS = 平均涨幅 / 平均跌幅
RSI = 100 - (100 / (1 + RS))
这里有个坑——「平均」用的是指数移动平均,不是简单平均。我曾经在这个细节上吃过亏,回测结果和实盘对不上,查了半天才发现是平均方式搞错了。
避坑指南:RSI的默认周期是14。但不同的币种、不同的时间周期,最优参数可能完全不同。我曾经在BTC的15分钟图上用14周期RSI,信号频繁到没法用。后来改成21周期,效果好了很多。参数一定要根据你的策略和品种去调。
4.3 布林带(Bollinger Bands)—— 波动率的「呼吸带」
布林带由三条线组成:中轨(通常是20日SMA)、上轨(中轨 + 2倍标准差)、下轨(中轨 - 2倍标准差)。
你想想看,当价格触及上轨时,说明价格偏离均值较远,可能「过热」了。触及下轨时,说明价格「过冷」。但这里有个关键点——布林带告诉你的是「价格在什么位置」,而不是「价格一定会反转」。
中轨 = SMA(close, 20)
标准差 = std(close, 20)
上轨 = 中轨 + 2 × 标准差
下轨 = 中轨 - 2 × 标准差
布林带最妙的地方在于——带宽的变化反映了波动率的变化。带宽收窄,说明市场在「蓄力」,往往预示着即将出现大行情。带宽扩张,说明波动率在释放。
我的经验:布林带收窄到极致时,配合成交量放大,往往是一波趋势行情的起点。我在做ETH的30分钟策略时,就用这个逻辑抓过几次不错的突破行情。
4.4 MACD—— 趋势的「加速器」
MACD由三部分组成:快线(DIF)、慢线(DEA)、柱状图(MACD柱)。
计算逻辑其实不复杂:
- 计算快线:EMA(close, 12) - EMA(close, 26)
- 计算慢线:EMA(DIF, 9)
- 柱状图:DIF - DEA
说白了,MACD就是两条均线差值的再处理。快线上穿慢线是金叉,下穿是死叉。柱状图由负转正是多头力量增强,由正转负是空头力量增强。
嗯,这里要注意——MACD在震荡行情里会频繁金叉死叉,信号质量很差。我个人习惯只在趋势行情里用MACD,震荡行情里直接关掉这个指标。
进阶用法:MACD背离是很有价值的信号。价格创新低但MACD的底部在抬高——这叫底背离,往往是反转信号。我在2022年底的BTC周线图上看到过明显的底背离,后来确实走了一波反弹。
4.5 代码实现:用Python计算四个指标
下面是一个完整的实现,用pandas和numpy手写这四个指标。我建议你理解每一行代码的逻辑,而不是直接调ta-lib库——虽然ta-lib方便,但出了问题你都不知道错在哪。
import pandas as pd
import numpy as np
def calculate_ma(df, window=20, ma_type='sma'):
"""计算移动平均线"""
if ma_type == 'sma':
df['MA'] = df['close'].rolling(window=window).mean()
elif ma_type == 'ema':
df['MA'] = df['close'].ewm(span=window, adjust=False).mean()
return df
def calculate_rsi(df, period=14):
"""计算相对强弱指数"""
delta = df['close'].diff()
gain = (delta.where(delta > 0, 0)).ewm(span=period, adjust=False).mean()
loss = (-delta.where(delta < 0, 0)).ewm(span=period, adjust=False).mean()
rs = gain / loss
df['RSI'] = 100 - (100 / (1 + rs))
return df
def calculate_bollinger(df, window=20, num_std=2):
"""计算布林带"""
df['BB_MID'] = df['close'].rolling(window=window).mean()
df['BB_STD'] = df['close'].rolling(window=window).std()
df['BB_UPPER'] = df['BB_MID'] + num_std * df['BB_STD']
df['BB_LOWER'] = df['BB_MID'] - num_std * df['BB_STD']
return df
def calculate_macd(df, fast=12, slow=26, signal=9):
"""计算MACD"""
df['EMA_FAST'] = df['close'].ewm(span=fast, adjust=False).mean()
df['EMA_SLOW'] = df['close'].ewm(span=slow, adjust=False).mean()
df['DIF'] = df['EMA_FAST'] - df['EMA_SLOW']
df['DEA'] = df['DIF'].ewm(span=signal, adjust=False).mean()
df['MACD'] = 2 * (df['DIF'] - df['DEA'])
return df
# 使用示例
# df = pd.read_csv('btc_data.csv')
# df = calculate_ma(df, 20, 'ema')
# df = calculate_rsi(df, 14)
# df = calculate_bollinger(df, 20, 2)
# df = calculate_macd(df, 12, 26, 9)
# print(df.tail())
注意:计算指标时,前N行数据会变成NaN。比如计算20日MA,前19行都是空值。实盘策略里一定要处理好这个边界情况,否则策略会在启动阶段乱开单。我见过有人因为这个bug,策略一启动就全仓买入——那画面太美我不敢看。
4.6 指标组合的实战思路
单个指标都有局限性。我个人常用的组合方式:
| 策略类型 | 指标组合 | 核心逻辑 |
|---|---|---|
| 趋势跟踪 | EMA + MACD | EMA判断方向,MACD确认力度 |
| 震荡反转 | RSI + 布林带 | RSI超买超卖 + 布林带上下轨 |
| 突破交易 | 布林带 + MACD | 布林带收窄后突破 + MACD金叉确认 |
你想想看,如果只用RSI,在强趋势行情里会一直处于超买状态,你不断做空就不断被打脸。但如果加上EMA过滤——只有价格在EMA之上才考虑做多,在EMA之下才考虑做空——效果会好很多。
指标是工具,不是圣杯。真正重要的是你如何理解市场、如何设计策略逻辑。把这些指标吃透了,你就能搭建出属于自己的交易系统。