第四节:技术指标计算——MA、EMA、布林带、RSI、MACD
技术指标这东西,说白了就是给价格数据“化妆”。
原始K线图看起来乱糟糟的,指标能帮我们提炼出趋势、强弱、超买超卖这些关键信息。我个人习惯,做CTA策略时,指标不是越多越好,而是要把每个指标的特性吃透。
4.1 移动平均线(MA)——最朴素的趋势跟踪器
MA是所有指标里最基础的。它就是把过去N天的收盘价加起来,除以N。
公式很简单:
MA(N) = (P₁ + P₂ + ... + Pₙ) / N
举个例子,5日均线,就是最近5天收盘价的平均值。
我在项目中遇到过一个常见误区:很多人觉得MA参数越大越平滑,就越好。其实不是。参数越大,滞后越严重。你想想看,等60日均线拐头,行情可能已经走了一半。
4.2 指数移动平均(EMA)——给近期数据更多权重
EMA和MA最大的区别是什么?MA对所有数据一视同仁,EMA却“偏心”。它给最近的价格更高的权重。
公式长这样:
EMA(t) = α × P(t) + (1 - α) × EMA(t-1)
其中 α = 2 / (N + 1)
嗯,这里要注意:EMA的计算是递归的。第一个EMA值通常用MA来初始化。
我曾经在回测一个趋势策略时,发现用MA和EMA结果差很多。EMA反应更快,但假信号也多。说白了,EMA适合震荡行情后的突破确认,MA适合趋势行情中的持仓跟踪。
| 特性 | MA | EMA |
|---|---|---|
| 计算方式 | 简单平均 | 加权平均 |
| 滞后性 | 较大 | 较小 |
| 平滑度 | 较平滑 | 较敏感 |
| 适用场景 | 趋势跟踪 | 短线交易 |
4.3 布林带(Bollinger Bands)——价格的“安全通道”
布林带由三条线组成:中轨(MA)、上轨(中轨+2倍标准差)、下轨(中轨-2倍标准差)。
核心思想:价格大部分时间会在上下轨之间运行。突破上轨,说明超买;跌破下轨,说明超卖。
中轨 = MA(20)
上轨 = 中轨 + 2 × σ
下轨 = 中轨 - 2 × σ
其中 σ 是过去20天收盘价的标准差
我记得有一次做螺纹钢策略,布林带收窄到极致,然后突然开口。这就是典型的“布林带收缩后的爆发”。很多CTA策略就是靠这个抓趋势启动的。
4.4 RSI(相对强弱指标)——判断超买超卖
RSI衡量的是过去N天内价格上涨幅度占总波动幅度的比例。取值范围0-100。
公式:
RSI = 100 - [100 / (1 + RS)]
RS = 平均上涨幅度 / 平均下跌幅度
通常,RSI > 70 视为超买,RSI < 30 视为超卖。
但这里有个坑:在强趋势行情中,RSI会长时间停留在超买或超卖区。你如果看到RSI>70就做空,可能会被趋势碾压。
我个人习惯:在震荡行情中用RSI做反转,在趋势行情中用RSI做确认。比如,RSI从超卖区回升到50以上,说明多头开始发力。
4.5 MACD(指数平滑异同移动平均线)——趋势与动量的结合
MACD由三部分组成:DIF线、DEA线、柱状图。
- DIF线:快线EMA(12) - 慢线EMA(26)
- DEA线:DIF的EMA(9)
- 柱状图:DIF - DEA
核心用法:
- 金叉/死叉:DIF上穿DEA为金叉(买入信号),下穿为死叉(卖出信号)
- 零轴:DIF在零轴上方,多头市场;下方,空头市场
- 背离:价格创新高,但MACD没创新高,顶背离(看跌)
我曾经用MACD背离做股指期货,效果出奇的好。但要注意,背离在单边行情中容易失效。你想想看,如果价格一直涨,MACD一直钝化,背离信号会反复出现,反复打脸。
4.6 知识体系结构图
下面这张图,帮你理清这五个指标的关系:
4.7 代码实现示例
下面用Python实现这五个指标。代码不长,但很实用。
import pandas as pd
import numpy as np
def calculate_ma(data, window=20):
"""计算移动平均线"""
return data['close'].rolling(window=window).mean()
def calculate_ema(data, window=20):
"""计算指数移动平均"""
return data['close'].ewm(span=window, adjust=False).mean()
def calculate_bollinger(data, window=20, num_std=2):
"""计算布林带"""
ma = calculate_ma(data, window)
std = data['close'].rolling(window=window).std()
upper = ma + num_std * std
lower = ma - num_std * std
return ma, upper, lower
def calculate_rsi(data, window=14):
"""计算RSI"""
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
def calculate_macd(data, fast=12, slow=26, signal=9):
"""计算MACD"""
ema_fast = calculate_ema(data, fast)
ema_slow = calculate_ema(data, slow)
dif = ema_fast - ema_slow
dea = dif.ewm(span=signal, adjust=False).mean()
histogram = dif - dea
return dif, dea, histogram
好了,这五个指标就讲完了。记住,指标是工具,不是圣杯。真正赚钱的策略,靠的是对市场的理解,而不是指标的花哨程度。
公众号:蓝海资料掘金营,微信deep3321