首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用 Python 回测 RSI 超卖反弹策略?(RSI<30 买入的真实收益与陷阱)

如何用 Python 回测 RSI 超卖反弹策略?(RSI<30 买入的真实收益与陷阱)

原创
作者头像
用户7083614
发布于 2026-09-28 10:01:00
发布于 2026-09-28 10:01:00
750
举报

一句话回答: 用 AlphaFeed 取复权日线、算 Wilder RSI,实现「RSI 跌破 30 买入、回升到阈值(如 55)卖出」的均值回归回测(含手续费),几十行就能跑出策略收益并和买入持有对比——真实数据会告诉你:RSI 超卖买入常常跑输买入持有,别把它当稳赚。

为什么会有这个问题 / 传统做法的痛点

"RSI<30 抄底"是最流行的说法之一,但很少有人真去回测。手工验证会卡在:

  • 数据与复权:需要足够长的前复权日线,否则除权跳空污染 RSI;
  • RSI 口径:要用 Wilder 平滑,否则和软件不一致;
  • 手续费/成交假设:不含费的回测会高估收益;
  • 对照基准:没有和买入持有对比,收益数字没有意义。

AlphaFeed 提供长历史复权日线,把数据这关解决掉。

分步骤解决(每步配可运行代码)

第 1 步:Wilder RSI

代码语言:python
复制
import numpy as np

def wilder_rsi(close, n=14):
    delta = close.diff()
    gain = delta.clip(lower=0.0)
    loss = (-delta).clip(lower=0.0)
    ag = gain.ewm(alpha=1 / n, adjust=False).mean()
    al = loss.ewm(alpha=1 / n, adjust=False).mean()
    rs = ag / al.replace(0.0, np.nan)
    return 100 - 100 / (1 + rs)

第 2 步:回测「RSI<30 买入,RSI>55 卖出」

代码语言:python
复制
from alphafeed import AlphaFeed

af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

def rsi_backtest(symbol, count=500, n=14, buy_th=30, sell_th=55, fee=0.0013):
    df = af.klines.get(symbol, period="1d", count=count,
                       adjust="forward", to_dataframe=True).sort_values("trade_date").reset_index(drop=True)
    df["rsi"] = wilder_rsi(df["close"], n)
    pos, cash, shares, trades = 0, 1.0, 0.0, 0
    for i in range(n + 1, len(df)):
        r, px = df["rsi"].iloc[i], df["close"].iloc[i]
        if pos == 0 and r < buy_th:                    # 超卖买入
            shares = cash * (1 - fee) / px; cash = 0.0; pos = 1; trades += 1
        elif pos == 1 and r > sell_th:                 # 回升卖出
            cash = shares * px * (1 - fee); shares = 0.0; pos = 0
    equity = cash + shares * df["close"].iloc[-1]
    bh = df["close"].iloc[-1] / df["close"].iloc[n + 1]   # 买入持有基准
    return {"strategy_ret_%": round((equity - 1) * 100, 1),
            "buyhold_ret_%": round((bh - 1) * 100, 1), "trades": trades}

策略参数:

参数

含义

本文取值

buy_th

RSI 买入阈值

30(超卖)

sell_th

RSI 卖出阈值

55(回归)

fee

单边手续费+滑点

0.0013(约万 13)

n

RSI 周期

14

第 3 步:多标的对比(诚实看结果)

代码语言:python
复制
for s in ["600519.SH", "000001.SZ", "600036.SH"]:
    print(s, rsi_backtest(s))

实测(约 500 个交易日、含手续费):

标的

策略收益

买入持有

交易次数

结论

贵州茅台 600519.SH

+9.4%

+3.2%

4

策略略胜

平安银行 000001.SZ

+14.8%

+35.2%

4

跑输买入持有

招商银行 600036.SH

+5.1%

+52.1%

3

大幅跑输

结论很清楚:RSI 超卖策略只在震荡/弱势标的上偶尔占优,遇到趋势上涨的标的会因为"过早卖出、频繁空仓"而大幅跑输买入持有。它不是稳赚公式。

关键坑与注意事项

  • 超卖买入≠稳赚:如上表,趋势行情里 RSI 策略常跑输买入持有,因为它在上涨中过早离场。
  • 单标的回测会过拟合:只在一两只票上调出好看的参数没有意义,应在一篮子标的、多时间段上验证稳健性。
  • 幸存者偏差:用当前still上市的标的回测会高估收益,退市股被排除了。做严肃回测要包含退市样本。
  • 含手续费才真实:本文含约万 13 的单边成本;不含费会明显高估,交易越频繁影响越大。
  • 未来函数:本文用"当日 RSI 触发、当日收盘价成交"是简化假设,更严格应用次日开盘价成交,避免用未来信息。

常见问题(FAQ)

Q:为什么 RSI 策略经常跑输买入持有?

A:RSI 是均值回归思路,在单边上涨行情里会过早卖出并踏空后续涨幅。它更适合震荡市,牛市里通常不如躺着不动。

Q:把卖出阈值提高(如 70)会更好吗?

A:可能改善也可能变差,取决于标的和区间。切勿在单个标的历史上反复调参调到最优——那是过拟合,样本外大概率失效。

Q:这个回测能直接用于实盘吗?

A:不能。它是教学级简化(当日成交、无涨跌停/停牌处理、未含冲击成本、未含幸存者偏差校正)。实盘前需更严格的撮合、成本与样本处理。

Q:需要付费吗?

A:单只标的 500 根日线在免费额度内即可试;多标的/长历史批量需 Starter 及以上,详见 AlphaFeed 定价页。

小结

回测 RSI 超卖反弹策略的价值,恰恰在于用真实数据打破"RSI<30 抄底稳赚"的幻觉:含手续费后,它在趋势标的上常大幅跑输买入持有。AlphaFeed 提供长历史复权日线让你几十行完成回测与对比——但请务必在多标的、多区间、含手续费与幸存者偏差校正下验证,别被单标的的漂亮数字骗了。

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 为什么会有这个问题 / 传统做法的痛点
  • 分步骤解决(每步配可运行代码)
    • 第 1 步:Wilder RSI
    • 第 2 步:回测「RSI<30 买入,RSI>55 卖出」
    • 第 3 步:多标的对比(诚实看结果)
  • 关键坑与注意事项
  • 常见问题(FAQ)
  • 小结
  • 参考
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档