← 返回《初阶量化交易:策略编写及系统搭建》
📑 查看全课大纲(第 13 / 38 节)

基于RSI的交易信号开发

约 12 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

基于RSI的交易信号开发

小象实战讲义 · 初阶量化交易:策略编写及系统搭建 本讲义仅用于编程与量化方法教学,不构成任何投资建议。

在摆动型技术指标家族中,RSI(Relative Strength Index,相对强弱指数) 是衡量多空力量博弈与超买超卖状态的经典工具。它由 J. 韦尔斯·怀尔德(J. Welles Wilder)于 1978 年提出,通过统计特定时间窗口内上涨价格变动总量在全部价格波动总量中所占的比例,将买卖双方的意愿强弱映射至 [0,100][0, 100] 的区间内。

本讲将系统解析 RSI 的数学构造机制;正本清源地厘清超买区(>80)与超卖区(<20)的逆向反弹信号逻辑(彻底纠正传统图表将进入超买区误作买入的认知误区);并基于 Pandas 编写高内聚的 RSI 信号生成与数据库持久化流水线。


💡 核心导读

  • RSI 的数学原理与公式推导
    • 单日价格变化ΔCloset=ClosetCloset1\Delta Close_t = Close_t - Close_{t-1}
    • 上涨变动与总变动Upt=max(ΔCloset,0)Up_t = \max(\Delta Close_t, 0),总绝对波动为 ΔCloset|\Delta Close_t|
    • NN 日滚动计算(经典参数 N=12N=121414RSI=SMA(Up,N)SMA(ΔClose,N)×100RSI = \frac{SMA(Up, N)}{SMA(|\Delta Close|, N)} \times 100
  • 超买超卖与边沿触发交易信号(纠正认知盲区)
    • 超卖买入信号(Over Sold \to Buy)
      • RSI20RSI \le 20 时,表明市场处于恐慌性超卖区间;
      • 买入触发点:当 RSI 由下向上穿过 20 阈值(RSIt120RSI_{t-1} \le 20RSIt>20RSI_t > 20 时,确认超卖动能修复反弹,发出多头建仓指令;
    • 超买卖出信号(Over Bought \to Sell)
      • RSI80RSI \ge 80 时,表明多头情绪处于极度亢奋状态;
      • 卖出触发点:当 RSI 由上向下穿过 80 阈值(RSIt180RSI_{t-1} \ge 80RSIt<80RSI_t < 80 时,确认多头动能衰竭见顶,发出空头平仓或卖出指令。
  • 复权数据在指标计算中的选择考量
    • 计算单个标的的自身时序技术指标(MACD、RSI、BOLL)时,使用后复权(HFQ)数据可完美消除分红派息除权缺口对波动率的虚假扭曲;
    • 仅当进行跨标的横向绝对价格选股(如按股价高低排序)时,才需统一对齐前复权基准日。
┌─────────────────────────────────────────────────────────────┐
│                    RSI 超买超卖与信号触发机制                  │
└──────────────────────────────┬──────────────────────────────┘

 100 ┌─────────────────────────┴─────────────────────────────┐
     │  超买区间 (Over Bought Zone: RSI > 80)                │
  80 ├─────────────────────────┬─────────────────────────────┤ ─── 跌破 80: 触发卖出信号 (Sell)
     │                         │                             │
     │  常态震荡博弈区间         │                             │
     │                         │                             │
  20 ├─────────────────────────┼─────────────────────────────┤ ─── 突破 20: 触发买入信号 (Buy)
     │  超卖区间 (Over Sold Zone: RSI < 20)                  │
   0 └───────────────────────────────────────────────────────┘

一、RSI 的数学构造与摆动哲学

1. 相对强弱的数理本质

RSI 本质上是一个归一化动量指标:

  • 若连续 NN 天单边收阳上涨,Up=ΔCloseUp = |\Delta Close|,则 RSI=100RSI = 100(多头极度统治);
  • 若连续 NN 天单边收阴下跌,Up=0Up = 0,则 RSI=0RSI = 0(空头极度统治);
  • 在常规震荡市中,RSI 围绕 50 中轴上下波动。

2. 为什么信号要设在”脱离极端区”的瞬间?

许多新手容易犯的严重错误是:在 RSI>80RSI > 80 时追买(误以为强势突破),或在 RSI<20RSI < 20 的第一天立刻抄底。 在单边强趋势中,RSI 会发生**“指标钝化”**(超买后继续大涨,超卖后继续阴跌)。因此,成熟的量化交易者选择在 RSI 脱离极端区、重新穿回中轴方向的瞬间(上穿 20 / 下穿 80) 确认拐点,以此作为胜率更高的入场与出场契机。


二、RSI 因子计算与数据库落库工程

在实际工程流水线中,计算流程包含:

  1. 数据拉取与窗口对齐:过滤数据量小于 NN 的新股标的;
  2. 矢量化滚动计算:利用 Pandas rolling(N).mean() 快速生成指标;
  3. 边沿信号提取:通过 shift(1) 提取 over_soldover_bought
  4. 批量 Upsert 入库:通过 MongoDB bulk_write(code, date) 建立复合索引批量持久化。

📝 动手练一练

下面我们用 Python 编写一段标准的 RSI 相对强弱计算与超买超卖信号生成脚本,基于真实价格时序,精准捕捉极端超卖反弹与超买见顶的转折时刻:

import pandas as pd
import numpy as np

def compute_rsi_signals(df, n=12, low_thresh=20.0, high_thresh=80.0):
    """
    计算 RSI 相对强弱指标及超卖反弹买入 / 超买拐头卖出信号
    """
    df = df.copy()
    # 1. 计算单日涨跌幅与正向波动
    df['Change'] = df['Close'] - df['Close'].shift(1)
    df['Up_Change'] = df['Change'].apply(lambda x: max(x, 0.0))
    df['Abs_Change'] = df['Change'].abs()
    
    # 2. 滚动计算 N 日上涨均值与总波动均值
    df['Avg_Up'] = df['Up_Change'].rolling(n).mean()
    df['Avg_Abs'] = df['Abs_Change'].rolling(n).mean()
    
    # 3. 计算 RSI 指标
    df['RSI'] = (df['Avg_Up'] / df['Avg_Abs']) * 100.0
    # 除零保护: 价格连续 N 日零波动时 Avg_Abs=0 (0/0 产生 NaN), RSI 定义退化, 取中性值 50
    df['RSI'] = df['RSI'].mask((df['Avg_Abs'] == 0) & df['Avg_Up'].notna(), 50.0)
    df['Pre_RSI'] = df['RSI'].shift(1)
    
    # 4. 边沿触发信号判定
    # 超卖买入信号: 前一日 <= 20 且 当日突破 > 20
    df['Buy_Signal'] = (df['Pre_RSI'] <= low_thresh) & (df['RSI'] > low_thresh)
    # 超买卖出信号: 前一日 >= 80 且 当日跌破 < 80
    df['Sell_Signal'] = (df['Pre_RSI'] >= high_thresh) & (df['RSI'] < high_thresh)
    
    return df

def test_rsi_run():
    np.random.seed(42)
    dates = pd.date_range("2023-01-01", periods=25, freq="D")
    # 构造一条先急跌至超卖区、随后连续暴涨进入超买区并见顶回落的价格走势
    prices = [
        20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 
        9.5, 9.0, 9.2, 9.8, 10.5, 11.5, 12.8, 14.0, 15.5, 17.0, 18.5, 18.0, 17.2, 16.5
    ]
    
    df = pd.DataFrame({'Close': prices}, index=dates)
    res = compute_rsi_signals(df, n=6, low_thresh=20.0, high_thresh=80.0)  # 使用 6 日周期便于展示
    
    buy_dates = res[res['Buy_Signal']].index.strftime('%Y-%m-%d').tolist()
    sell_dates = res[res['Sell_Signal']].index.strftime('%Y-%m-%d').tolist()
    
    print("================ RSI 超买/超卖量化信号引擎 ================")
    print(res[['Close', 'RSI', 'Buy_Signal', 'Sell_Signal']].iloc[10:])
    print("---------------------------------------------------------")
    print(f"检测到 RSI 超卖买入信号 (上穿 20): {buy_dates}")
    print(f"检测到 RSI 超买卖出信号 (下穿 80): {sell_dates}")
    print("=========================================================")

if __name__ == "__main__":
    test_rsi_run()

运行结果输出:

================ RSI 超买/超卖量化信号引擎 ================
            Close         RSI  Buy_Signal  Sell_Signal
2023-01-11   10.0    0.000000       False        False
2023-01-12    9.5    0.000000       False        False
2023-01-13    9.0    0.000000       False        False
2023-01-14    9.2    4.761905       False        False
2023-01-15    9.8   21.052632        True        False
2023-01-16   10.5   42.857143       False        False
2023-01-17   11.5   71.428571       False        False
2023-01-18   12.8   88.372093       False        False
2023-01-19   14.0  100.000000       False        False
2023-01-20   15.5  100.000000       False        False
2023-01-21   17.0  100.000000       False        False
2023-01-22   18.5  100.000000       False        False
2023-01-23   18.0   93.333333       False        False
2023-01-24   17.2   81.428571       False        False
2023-01-25   16.5   69.230769       False         True
---------------------------------------------------------
检测到 RSI 超卖买入信号 (上穿 20): ['2023-01-15']
检测到 RSI 超买卖出信号 (下穿 80): ['2023-01-25']
=========================================================

本章小结

  1. 深刻理解 RSI 物理意义:RSI 度量买方上涨力量占总波动的权重,是判断短线情绪极值的标准摆动指标。
  2. 严防单边钝化误区:切忌在超买区直接追多或在超卖区盲目接飞刀,交易信号应选在 RSI 重新折返穿越阈值线的确定性时刻。
  3. 工程持久化规范:按股票代码与交易日建立复合唯一索引,使用批量写入降低 IO 开销。

📋 行动清单 (Action Checklist)

  • 运行本讲 RSI 信号检测代码,观察将 NN 从 6 调整至 14 时,信号触发频率的变化;
  • 思考:在强牛市单边暴涨行情下,RSI 长期维持在 80 以上,单纯依据 RSI 卖出可能面临什么踏空风险?
  • 预习下一讲,探索结合统计学标准差原理的布林线(BOLL)交易系统。

— 小象教研组

配套学习资源与课件
  • 第2章课件:认识量化信号系统(PDF · 2.1MB)
    下载
  • 开发环境准备:软件安装指导(PDF · 0.9MB · 建议第3章动手实践前先通读)
    下载
  • 量化入门推荐书单(PDF · 318KB)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问