3. 技术指标因子(上):移动平均线(MA)、指数平滑异同移动平均线(MACD)、相对强弱指标(RSI)
各位同学,欢迎来到多因子择时模型的第三讲。今天咱们聊聊技术指标因子,而且是其中最经典、最基础的三兄弟:MA、MACD 和 RSI。
说实话,技术指标这玩意儿,市场上争议很大。有人觉得是玄学,有人奉为圭臬。我个人看法是——工具没有好坏,关键看你怎么用。在量化模型里,它们就是一组特征,跟市盈率、换手率没什么本质区别。
好,咱们直接进入正题。
3.1 移动平均线(MA)
移动平均线,简称均线。它是最简单的趋势跟踪指标。说白了,就是把过去 N 天的收盘价做个平均。
计算公式:
MA(N) = (P₁ + P₂ + ... + Pₙ) / N
其中 P 是收盘价,N 是周期。
我在项目中遇到过一个问题:很多人觉得均线周期越长越可靠。其实不一定。长周期均线确实平滑,但滞后性也大。你想想看,等 60 日均线拐头,行情可能已经走了一半。
常见的均线组合:
| 周期 | 用途 |
|---|---|
| 5日、10日 | 短线交易参考 |
| 20日、30日 | 中线趋势判断 |
| 60日、120日 | 长线趋势、牛熊分界线 |
Python 实现:
import pandas as pd
def calculate_ma(data, window=20):
"""
计算移动平均线
data: DataFrame,至少包含 'close' 列
window: 均线周期
"""
data[f'MA_{window}'] = data['close'].rolling(window=window).mean()
return data
3.2 指数平滑异同移动平均线(MACD)
MACD 是均线的升级版。它由三部分组成:快线(DIF)、慢线(DEA)和柱状线(MACD 柱)。
计算步骤:
- 计算 12 日 EMA(指数移动平均)和 26 日 EMA
- DIF = 12日EMA - 26日EMA
- DEA = DIF 的 9 日 EMA
- MACD 柱 = (DIF - DEA) × 2
嗯,这里要注意。EMA 和 MA 不一样。EMA 给近期数据更高的权重,反应更快。我刚开始做量化时,直接用 MA 算 MACD,结果信号总是慢半拍。后来才发现,MACD 的发明者指定要用 EMA。
Python 实现:
def calculate_macd(data, fast=12, slow=26, signal=9):
"""
计算 MACD 指标
"""
# 计算快慢 EMA
data['EMA_fast'] = data['close'].ewm(span=fast, adjust=False).mean()
data['EMA_slow'] = data['close'].ewm(span=slow, adjust=False).mean()
# DIF 线
data['DIF'] = data['EMA_fast'] - data['EMA_slow']
# DEA 线
data['DEA'] = data['DIF'].ewm(span=signal, adjust=False).mean()
# MACD 柱
data['MACD_bar'] = 2 * (data['DIF'] - data['DEA'])
return data
3.3 相对强弱指标(RSI)
RSI 是衡量价格涨跌动能的指标。它把一段时间内的涨幅和跌幅做对比,数值在 0 到 100 之间。
计算公式:
RSI(N) = 100 - [100 / (1 + RS)]
其中 RS = 平均上涨幅度 / 平均下跌幅度
说白了,RSI 告诉你:过去 N 天里,涨得有多猛,跌得有多狠。
常见阈值:
| RSI 值 | 含义 |
|---|---|
| 70 以上 | 超买,可能回调 |
| 30 以下 | 超卖,可能反弹 |
| 50 附近 | 多空平衡 |
Python 实现:
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
data['RSI'] = 100 - (100 / (1 + rs))
return data
3.4 三个因子的组合使用
单独用任何一个指标,效果都有限。我习惯把它们组合起来,构建一个综合信号。
一个简单的多因子信号示例:
def multi_factor_signal(data):
"""
综合 MA、MACD、RSI 的信号
"""
# MA 信号:价格在 20 日均线上方
data['MA_signal'] = (data['close'] > data['MA_20']).astype(int)
# MACD 信号:DIF 在 DEA 上方
data['MACD_signal'] = (data['DIF'] > data['DEA']).astype(int)
# RSI 信号:RSI 大于 50
data['RSI_signal'] = (data['RSI'] > 50).astype(int)
# 综合得分
data['composite_score'] = (data['MA_signal'] +
data['MACD_signal'] +
data['RSI_signal'])
# 当综合得分 >= 2 时,产生买入信号
data['buy_signal'] = (data['composite_score'] >= 2).astype(int)
return data
你想想看,三个指标同时看多,胜率是不是高很多?当然,这只是一个最简单的例子。实际项目中,我会给每个指标分配不同的权重,还会加入止损逻辑。
3.5 本章知识体系
下面这张图,帮你理清今天讲的核心内容:
今天的内容就到这里。这三个指标是技术分析的基础,也是多因子择时模型里最常用的特征。下一节,我们会继续聊其他技术指标,以及如何把它们真正用到模型里去。
记住:指标是死的,策略是活的。多思考、多回测,才能找到适合自己风格的组合。