3、技术指标计算:移动平均线、RSI、MACD的计算与信号生成逻辑
技术指标这东西,说白了就是给价格数据做「数学加工」。我刚开始做量化时,总觉得指标越多越好,后来被市场狠狠教育过——指标不在多,在于你懂它怎么算、怎么用。今天咱们就聊三个最经典的:移动平均线、RSI、MACD。
3.1 移动平均线(MA)——最朴素的趋势跟踪器
移动平均线,就是把过去N天的收盘价加起来除以N。听起来简单吧?但它的变种可不少。
3.1.1 简单移动平均线(SMA)
公式长这样:
SMA = (P₁ + P₂ + ... + Pₙ) / N
其中P是收盘价,N是周期。我个人习惯用20日SMA做中期趋势判断。嗯,这里要注意:SMA对每个数据点一视同仁,所以它反应会慢半拍。
3.1.2 指数移动平均线(EMA)
EMA就不一样了,它给近期的价格更高权重。公式稍微复杂点:
EMA_today = (Price_today × α) + (EMA_yesterday × (1 - α))
α = 2 / (N + 1)
举个例子,N=10时,α=2/11≈0.1818。也就是说,今天的价格占18%的权重,昨天的EMA占82%。
核心区别:SMA平滑但滞后,EMA灵敏但容易假信号。我一般用EMA做短线,SMA做长线。
3.1.3 信号生成逻辑
移动平均线的信号逻辑其实就两种:
- 金叉:短期MA上穿长期MA → 买入信号
- 死叉:短期MA下穿长期MA → 卖出信号
我曾经在实盘里只用MA金叉死叉做策略,结果震荡市里被来回打脸。后来加了过滤条件——只在大趋势明确时用,效果好了很多。
3.2 RSI——超买超卖的「体温计」
RSI(相对强弱指标)衡量的是价格变动的速度和幅度。说白了,就是看最近一段时间里,涨的天数多还是跌的天数多。
3.2.1 计算公式
RSI = 100 - [100 / (1 + RS)]
RS = 平均上涨幅度 / 平均下跌幅度
标准周期是14天。计算步骤:
- 计算每天的价格变动(涨了多少或跌了多少)
- 分别计算14天内上涨幅度的平均值和下跌幅度的平均值
- 用上面的公式算出RSI
小技巧:RSI的初始值通常用简单平均,后续用平滑平均。我习惯用Wilder的原始算法,它更接近「动量」的本质。
3.2.2 信号生成逻辑
RSI的经典用法:
- RSI > 70:超买,可能回调 → 卖出信号
- RSI < 30:超卖,可能反弹 → 买入信号
- 背离:价格创新高但RSI没创新高 → 趋势可能反转
我记得有一次做股指期货,RSI到了80以上还在涨,我按捺不住做空了。结果呢?连续三天被拉爆。后来我明白了——强趋势里RSI可以长时间在超买区,不能单靠这个指标做反向交易。
3.3 MACD——趋势与动量的结合体
MACD(指数平滑异同移动平均线)是我个人最喜欢的指标。它把趋势和动量结合在了一起。
3.3.1 三个组成部分
| 组件 | 计算方式 | 默认参数 |
|---|---|---|
| DIF线 | 快线EMA - 慢线EMA | 12日EMA - 26日EMA |
| DEA线 | DIF的EMA | 9日EMA |
| MACD柱 | (DIF - DEA) × 2 | — |
你想想看,DIF线代表短期和长期趋势的差值,DEA线是它的平滑版本,MACD柱就是两者的差距。这个设计很巧妙。
3.3.2 信号生成逻辑
MACD有三种经典信号:
- 金叉/死叉:DIF上穿/下穿DEA
- 零轴穿越:DIF上穿/下穿零轴(代表趋势转变)
- 背离:价格与MACD方向不一致
避坑指南:我曾经在震荡市里用MACD金叉做多,结果连续三次被假信号坑。后来加了个条件——MACD柱由负转正且连续放大两日,才确认信号有效。
3.4 实战代码示例
下面是我常用的Python实现,用pandas和numpy:
import pandas as pd
import numpy as np
def calculate_ma(df, period=20, ma_type='sma'):
"""计算移动平均线"""
if ma_type == 'sma':
return df['close'].rolling(window=period).mean()
elif ma_type == 'ema':
return df['close'].ewm(span=period, adjust=False).mean()
def calculate_rsi(df, period=14):
"""计算RSI"""
delta = df['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
rs = gain / loss
return 100 - (100 / (1 + rs))
def calculate_macd(df, fast=12, slow=26, signal=9):
"""计算MACD"""
ema_fast = df['close'].ewm(span=fast, adjust=False).mean()
ema_slow = df['close'].ewm(span=slow, adjust=False).mean()
dif = ema_fast - ema_slow
dea = dif.ewm(span=signal, adjust=False).mean()
macd_bar = (dif - dea) * 2
return dif, dea, macd_bar
个人建议:实盘时别直接用默认参数。不同品种、不同周期,参数要调。我习惯先用历史数据回测,找到最优参数组合再上实盘。
3.5 信号生成的核心逻辑
这三个指标可以单独用,也可以组合用。我常用的组合策略:
- 趋势确认:MA多头排列(短期在长期之上)
- 入场时机:MACD金叉 + RSI从超卖区回升
- 出场条件:MACD死叉 或 RSI进入超买区
为什么会这样组合?因为单一指标容易出假信号,多个指标共振时胜率会高很多。但要注意,指标太多也会导致信号稀少,错过行情。
3.6 本章知识体系
下面这张图展示了三个指标的关系和信号生成逻辑:
嗯,以上就是三个核心技术指标的计算和信号生成逻辑。我个人觉得,理解指标背后的数学原理比记住公式更重要。你只有知道它怎么算的,才知道它什么时候会失效。
最后说一句:技术指标是工具,不是圣杯。我见过太多人沉迷于优化参数、寻找「完美指标」,结果忽略了最根本的东西——风险管理和资金管理。记住,再好的信号系统,没有风控也是白搭。
公众号:蓝海资料掘金营,微信deep3321