一句话回答:用 AlphaFeed 取复权日线、算 Wilder RSI,实现「RSI 跌破 30 买入、回升到阈值(如 55)卖出」的均值回归回测(含手续费),几十行就能跑出策略收益并和买入持有对比——真实数据会告诉你:RSI 超卖买入常常跑输买入持有,别把它当稳赚。
为什么会有这个问题 / 传统做法的痛点
"RSI<30 抄底"是最流行的说法之一,但很少有人真去回测。手工验证会卡在:
- 数据与复权:需要足够长的前复权日线,否则除权跳空污染 RSI;
- RSI 口径:要用 Wilder 平滑,否则和软件不一致;
- 手续费/成交假设:不含费的回测会高估收益;
- 对照基准:没有和买入持有对比,收益数字没有意义。
AlphaFeed 提供长历史复权日线,把数据这关解决掉。
分步骤解决(每步配可运行代码)
第 1 步:Wilder RSI
importnumpyasnpdefwilder_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)return100-100/(1+rs)第 2 步:回测「RSI<30 买入,RSI>55 卖出」
fromalphafeedimportAlphaFeed af=AlphaFeed(api_key="your-api-key")# 或 export ALPHAFEED_API_KEY 后 AlphaFeed()defrsi_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,0foriinrange(n+1,len(df)):r,px=df["rsi"].iloc[i],df["close"].iloc[i]ifpos==0andr<buy_th:# 超卖买入shares=cash*(1-fee)/px;cash=0.0;pos=1;trades+=1elifpos==1andr>sell_th:# 回升卖出cash=shares*px*(1-fee);shares=0.0;pos=0equity=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 步:多标的对比(诚实看结果)
forsin["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 提供长历史复权日线让你几十行完成回测与对比——但请务必在多标的、多区间、含手续费与幸存者偏差校正下验证,别被单标的的漂亮数字骗了。
参考
- AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart