本文在 Hikyuu 里实现 RSI 均值回归,并把它丢进「全 A」看反应。
目标是让你几分钟内跑通「改一个参数、看一类标的」这条路径,不是证明这组参数能赚钱。
策略描述
RSI 是相对强弱指标,用一段时间内上涨与下跌幅度的对比,把价格的短期强弱压成 0 到 100 之间的一个数。读数低,说明这段时间跌幅更集中;读数高,说明涨势更集中。均值回归的思路就从这里来:不去追已经走出来的趋势,而是在价格短期被打过头时接一手,等强弱回到常态再退出。
不过「超卖」并不等于「见底」,跌势里 RSI 可以一直趴在低位。所以这类规则通常还要加一道趋势过滤,只在中长期方向没坏的时候接短线回撤。本文这套系统正是这么搭的。
上升趋势中的短期超卖买入:收盘价 > n 日均线且 RSI 低于超卖阈值时买入,RSI 高于超买阈值时平仓。
参数上,n 是趋势过滤均线周期,rsi_n 是 RSI 周期,buy_th 是 RSI 超卖买入阈值,sell_th 是 RSI 超买卖出阈值。
落到 Hikyuu 里,这套规则由下面几个部件拼成,参数沿用部件默认值。
| 部件 | 名称 |
|---|---|
| 信号指示器 SG | SG_Add = 买入RSI超卖 + 卖出RSI超买 |
| 资金管理 MM | MM_Nothing |
| 止损 ST | 未设置 |
| 止盈 TP | 未设置 |
| 盈利目标 PG | 未设置 |
| 移滑价差 SP | 未设置 |
信号由两个子信号相加合成(SG_Add):买入RSI超卖(SG_OneSide 买入侧)------收盘价站上 n 日均线、且 RSI 低于 buy_th 时给出买入;卖出RSI超买(SG_OneSide 卖出侧)------RSI 高于 sell_th 时给出平仓。两个子信号都按 K 线收盘价触发,组合后开启买卖交替,统一给出买卖。每笔买多少由 MM 决定;没有挂止损止盈,一条信号会一直持有到反向信号出现。
这两个子部件在 hub 里的实现如下:
python
# hikyuu_hub/part/sg/买入RSI超卖/part.py
def part(n: int = 70, rsi_n: int = 2, buy_th: float = 10.0):
cond = (CLOSE() > MA(CLOSE(), n)) & (RSI(CLOSE(), rsi_n) < buy_th)
ret = SG_OneSide(cond, True)
ret.name = "买入RSI超卖"
return ret
python
# hikyuu_hub/part/sg/卖出RSI超买/part.py
def part(rsi_n: int = 2, sell_th: float = 90.0):
cond = RSI(CLOSE(), rsi_n) > sell_th
ret = SG_OneSide(cond, False)
ret.name = "卖出RSI超买"
return ret
从图看信号
把部件挂到一只标的上,先看信号长什么样。
python
from hikyuu.interactive import *
start_date = Datetime(20200101)
query = Query(start_date)
stk = sm['sh603608']
k = stk.get_kdata(query)
my_sys = get_part("dev.sys.RSI均值回归")
my_sys.tm = crtTM(start_date, init_cash=100000, cost_func=TC_FixedA())
my_sys.run(k)
my_sys.sg.plot() # 信号点

图中三角为买卖点。RSI均值回归在天创股份上的信号密度是每年约 7.7 次------先把「频繁进出」还是「长持」这件事看清楚,再谈绩效。
单标的回测
python
my_sys.performance()

天创股份(SH603608)上:累计 -42.0%、年化 -8.2%、最大回撤 64.4%、交易 52 次。
这里只讲怎么读:单标的系统的评价对象是这条规则自己的期望,不是它比谁强。空仓就是它的对手盘,所以看的是净值本身有没有正斜率、回撤能不能被承受,而不是相对某个指数多涨了几个点。
看下「全 A」的绩效
先说明口径:单标的系统评价的是时序决策自身的期望------它没有基准,空仓就是对手。所以这里不看「相对买入持有」,看的是每支标的自己的净值结果。
python
keys = ["Account CAGR %", "Total Closed Trades",
"Win Rate %", "Avg Win / Avg Loss Ratio", "Profit Factor"]
df = analysis_sys_list(stks, query, my_sys, keys=keys)
df[keys].describe()

每支标的独立跑一遍,年化中位数 -1.6% ,25~75 分位 -5.9% ~ +3.5% ,为正的标的占 41.4%。
交易序列统计(各标的中位数):
| 指标 | 中位 | 参考门槛 |
|---|---|---|
| Profit Factor | 0.93 | ≥ 1.3 |
| 胜率 | 58.3% | --- |
| 盈亏比(均盈/均亏) | 0.67 | 与胜率相乘决定期望 |
| 交易笔数 | 45 | ≥ 30 才具统计意义 |
按单标的系统自己的口径,这套规则不具备正期望:Profit Factor 中位数 0.93(低于 1.3 的合格线),年化中位 -1.6%,为正的标的只占 41.4%。胜率再高也没用------赢的次数多、单次赚得少,输的次数少、单次亏得多,乘起来仍然归零。
均值回归的形状是「高胜率、低盈亏比」:赢的次数多但单次赚得少,输的次数少但单次亏得多。这种形态下,胜率看着漂亮,真正决定生死的是盈亏比与成本------盈亏比 0.67 配上 58% 胜率,乘起来刚好归零。
参考:同期该池买入持有的年化收益中位数为 -0.6%。单标的系统不以它为基准,这里只提供量级参照。
样本外:把同一套规则丢到没看过的时段
上面的数字都来自同一段历史。真正要问的不是「样本内赚不赚」,而是「换一段没看过的行情还算不算」------这里把区间切成两段:样本内 2020-01-01 ~ 2024-10-15,样本外 2024-10-15 ~ 2026-11-06,规则一个字没改,只换数据。

| 口径 | 年化中位 | 为正占比 | Profit Factor 中位 |
|---|---|---|---|
| 样本内(2020-01-01 ~ 2024-10-15) | -1.45% | 42.6% | 0.91 |
| 样本外(2024-10-15 ~ 2026-11-06) | -2.34% | 42.0% | 0.88 |
样本内已被判不成立(年化中位 -1.5%、PF 未过门槛),样本外 -2.3% 继续为负------两段结论一致,说明样本内那点正值没有统计分量,不是「换一段行情就好了」的问题。
样本外只有 2.0 年、2899 支标的,单一时段本身就可能是运气;更严谨的做法是滚动切多段(walk-forward),这里给的是成本最低的第一次检验。
成本口径:同一套规则,零成本 vs 实盘费率
上面所有数字都是扣费之后的结果。但扣费扣掉多少,比结果本身更值得看------同一套信号,只改费率假设就能改变结论的方向。

| 口径 | 年化中位 | 为正占比 |
|---|---|---|
| 零成本 | +1.31% | 57.1% |
| 实盘费率 | -1.57% | 41.4% |
| 差额 | 2.88pp | --- |
零成本下年化中位 +1.3%,扣费后变成 -1.6%------利润被成本吃干净,这套规则挣的钱还不够付过路费。降低换手或拿到更低佣金,是唯一可能把它拉回正期望的方向。
单标的累计成本中位约 18,600 元,平均每笔 413 元。对照代码就一句:把 cost_func 换成 TC_Zero() 再跑一遍,其余不动。
python
my_sys.tm = crtTM(start_date, init_cash=100000, cost_func=TC_Zero())
df_zero = analysis_sys_list(stks, query, my_sys, keys=["Account CAGR %"])
口径说明:2020-01-01 至 最新;标的池为「全 A」中 2020-01-01 前上市且当前存续的 2899 支;默认成交时点(次日开盘);成本用 TC_FixedA()(佣金万 18.0、最低 5 元;印花税 0.5‰ 卖出单边;过户费 0.01‰);未计滑点,如需计入请挂 SP_FixedPercent(0.001);策略与基准两侧均使用不复权收盘,除权会让持有收益偏低,要更严谨两侧同时换成复权价。
回到开头那个问题
这套规则在 Hikyuu 里怎么搭、怎么跑、怎么看结果,上面几步已经走完;它到底有没有用,数字也给了答案------扣掉成本之后,它不赚。
两件事要分开:框架解决「能不能验证」,规则解决「值不值得做」。前者可以复用,后者每换一套规则都要重答一遍,而答案只能由你自己的数据跑出来。
本文所有数字都来自上面几段代码。换一个部件、换一个标的池,同样的步骤就能得到你的结论。
文中用到的部件实现已发布至 hikyuu_hub,可自行查阅:https://github.com/fasiondog/hikyuu_hub
本文仅用于量化策略研究和学习交流,不构成任何投资建议。投资有风险,投资者应根据自身情况独立判断并承担相应风险
Hikyuu Quant Framework 基于C++/Python 的开源量化交易研究框架 ,为量化交易爱好者和专业人员提供高性能底层架构支持。项目地址: