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
我的小技巧:计算 MA 时,记得处理前 N 天的 NaN 值。我一般会直接用 fillna 填充,或者干脆丢弃前 N 行。

3.2 指数平滑异同移动平均线(MACD)

MACD 是均线的升级版。它由三部分组成:快线(DIF)、慢线(DEA)和柱状线(MACD 柱)。

计算步骤

  1. 计算 12 日 EMA(指数移动平均)和 26 日 EMA
  2. DIF = 12日EMA - 26日EMA
  3. DEA = DIF 的 9 日 EMA
  4. 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
核心用法:DIF 上穿 DEA 是金叉(买入信号),下穿是死叉(卖出信号)。但别死板,金叉在震荡市里经常被反复打脸。

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
避坑指南:我曾经在回测中发现,RSI 在单边行情里会持续处于超买或超卖区域。这时候盲目反向操作,会亏得很惨。记住:RSI 更适合震荡市,趋势市里要结合其他指标一起用。

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 本章知识体系

下面这张图,帮你理清今天讲的核心内容:

技术指标因子(上)知识体系 技术指标因子 移动平均线 (MA) MACD 相对强弱指标 (RSI) 简单移动平均 金叉死叉 DIF/DEA MACD柱 超买超卖 背离信号 组合使用 → 多因子综合信号 提升信号稳定性,降低单一指标风险

今天的内容就到这里。这三个指标是技术分析的基础,也是多因子择时模型里最常用的特征。下一节,我们会继续聊其他技术指标,以及如何把它们真正用到模型里去。

记住:指标是死的,策略是活的。多思考、多回测,才能找到适合自己风格的组合。

专注资料整理