结论先行:RPS 是拼出来的,软件不自带
在通达信里输入「RPS」,默认什么都不会出现。这个指标要靠三步拼装:先用一个公式算出每只股票的区间涨幅,再用扩展数据把全市场(或自定义板块)的涨幅横向排名、归一化成零到一千,最后用一个显示公式把排名值除以十,画成零到一百的曲线,超过阈值的那一段染成红色。

三步缺一不可。只写显示公式,取不到数据;只做扩展数据,K 线图上什么都看不见;忘了每天刷新,看到的还是昨天的排名。下面按顺序拆开讲。
三步结构对照
| 步骤 | 做什么 | 关键设置 | 产出 |
|---|---|---|---|
| 一、涨幅公式 | 算个股区间涨跌幅 | 参数 N 对应周期 | 一个可被引用的技术指标 |
| 二、扩展数据 | 对板块内全部品种算该指标并排名 | 精确复权、生成横向排名、零到一千归一化 | 零到一千的排名值 |
| 三、显示公式 | 引用排名值并画线 | EXTDATA_USER 序号对应数据行 | 零到一百的 RPS 曲线 |
| 四、选股公式 | 批量筛出强势股 | 阈值判断 | 条件选股结果 |
第三、四步建立在第二步之上,序号对不上就会取到别的数据。这是新手最容易出错的地方。
第一步:建涨幅指标
打开公式管理器(快捷键 Ctrl+F),选技术指标公式,新建,名称随意,比如 EXTRS,画线方法选副图,参数区加一个参数 N,最小 1,最大 250,缺省 120。代码只有一行:
ZF:(C-REF(C,N))/REF(C,N);
含义是当前收盘价减去 N 日前的收盘价,再除以 N 日前的收盘价,得到区间涨跌幅。这个值本身有正有负,还不能叫 RPS,它只是排名的原料。
有人会把它写成百分比形式再乘一百,没必要。扩展数据只关心排序,量纲不影响名次。
第二步:扩展数据,把涨幅变成排名
在键盘上输入 .902,进入扩展数据管理器。选中第一行,点修改,逐项设置:
技术指标公式选刚建好的 EXTRS;计算参数填 120,对应半年;计算时段选本地所有数据;计算品种选自定义板块里的「上市一年以上」(没有就自己建一个,把新股排除掉);勾选精确复权;勾选生成横向排名数据;排名方法选零到一千归一化顺序。
设完第一行,用同样的办法设第二行,参数改成 250,对应一年。想要更短的周期,再加一行填 20。三组数据必须各占一行,不能挤在同一行里改参数,否则后设的会覆盖前设的。
「计算品种」这一项决定了排名的比较范围。选全市场,得到的是全 A 排名;选自定义板块,得到的是板块内排名。两者的数值不能混着看,一个 RPS 九十在全 A 里和在某个小板块里,含金量完全不同。
「精确复权」必须勾。除权除息的股票如果不复权,涨幅会被除权缺口拉出一个假跌,排名自然失真。
「零到一千归一化顺序」也必须选。选成自然顺序,得到的是名次本身(比如第三百名),除以十以后是三十,画出来的线完全没有意义。
第三步:显示公式,让线变红
再新建一个技术指标公式,名称比如「股价相对强度」,画线方法选副图。最简版本是这样:
U1:=EXTDATA_USER(1,0); RPS120:U1/10,LINETHICK2,COLORWHITE; U2:=EXTDATA_USER(2,0); RPS250:U2/10,LINETHICK2,COLORYELLOW;
EXTDATA_USER 的第一个参数是扩展数据的行号,第二行写 2,第三行写 3,必须与第二步的设置一一对应。第二个参数写 0 表示取当天的值。
除以十是因为扩展数据存的是零到一千的归一化排名,十除以十得一百,正好落在零到一百的常用刻度上。如果第二步选了零到一百的归一化,就不用再除,两个口径不能混用,混用会画出「RPS 等于九百多」这种明显不合理的线。
变红的两种写法
第一种是条件染色,只把超过阈值的那一段画成红色:
RPS120:U1/10,LINETHICK2,COLORWHITE; IF(RPS120>=90,RPS120,DRAWNULL),LINETHICK2,COLORRED;
DRAWNULL 的意思是「这里不画」,所以线在九十以下保持白色,一旦上穿九十就变红,跌破又恢复。这种写法的好处是拐点一目了然。
第二种是画参考线,在图上加几条水平虚线:
强势线90:90,COLORRED,DOTLINE; 中位线50:50,COLORGRAY,DOTLINE;
这种写法不改变曲线颜色,只给一个视觉标尺。两种可以同时用,也可以把整条线固定染成红色——那只是换个颜色常量,与「变红」的判断逻辑无关。
阈值取多少没有统一标准,八十、八十五、九十都有人用。欧奈尔原著里的相对强度用的是百分位排名,一年期为主,国内常见的做法是加一条一百二十日线做中期参考。
顺带配一个选股公式
显示公式只管看,想批量筛出来还得建条件选股公式。在公式管理器里选条件选股公式、其他类型、新建,代码一行就够:
EXTDATA_USER(1,0)>900;
这里写九百而不是九十,因为选股公式直接读扩展数据的原始值,没有经过显示公式里的除以十。写成九十,等于把门槛降到 9 分,全市场几乎都能选出来,这是很常见的低级错误。
要长短周期共振,就用 AND 连起来:
EXTDATA_USER(1,0)>900 AND EXTDATA_USER(2,0)>900;
建好之后走「条件选股」,选公式、选板块、执行,结果会列在选股结果窗口里。选股只是把候选缩到几十只,后面还得自己看形态和基本面。
为什么每天都要刷新
扩展数据是本地计算的结果,不会自动跟着行情更新。收盘后的固定顺序是:先在系统菜单里做盘后数据下载,补齐当日日线;再进 .902 点全部刷新;刷新完成后打开个股 K 线,副图才是当天的最新排名。
三步的顺序不能颠倒。先刷新后下载,算的是旧数据;下载了不刷新,图上还是昨天那条线。很多人说「RPS 不准」,一半以上是漏了这一步。
第一次搭建时还要注意历史数据长度。扩展数据要覆盖「本地所有数据」,如果本地只有一两年日线,算二百五十日排名时早期的值会缺失,表现为一串零或空白。先去盘后数据下载里把起始时间往前调,一次性补足。
参数与读法
二十日、一百二十日、二百五十日三条线,分别对应短、中、长三个观察窗口。常见读法是:短线快速上穿九十,说明近期资金关注度突然抬升;长线稳定在九十上方,说明这只票在过去一年里持续跑赢绝大多数标的;三条线同时站上九十,属于长短周期共振,趋势的稳定性相对更高。
读的时候要记住一件事:RPS 描述的是「过去一段时间的相对涨幅排名」,它不含任何对未来方向的判断。排名高只说明过去强,不说明接下来还会强;排名低也只说明过去弱,不代表一定反弹。把它当强度尺,不要当买卖信号。
常见问题
1. 刷新后 RPS 全是零或空白怎么办?
先查两处:本地日线数据是否足够长,扩展数据有没有勾「生成横向排名数据」。前者导致早期值缺失,后者导致整列没有结果。
2. 数值波动很大、明显不准是什么原因?
多数是没勾精确复权,除权除息把涨跌幅算歪了;其次是排名方法选成了自然顺序,或者计算品种选错,把不同板块混在一起排。
3. 换了电脑,指标全没了?
扩展数据存在本地,不随公式一起同步。换机器或重装软件后要重新设置 .902 的每一行,再重新刷新。公式本身可以导出备份。
4. 能不能不建扩展数据,直接写公式算排名?
不能。普通指标公式只能逐只股票计算,拿不到全市场的横向排序;横向排名必须借助扩展数据这个功能。
5. 选全 A 还是自定义板块?
看用途。做全市场强度排序选全 A;做行业内比较,把板块设成对应行业,得到的是行业内的相对强度。两者别混用,也不要拿不同板块的数值横向对比。
避坑:五个容易踩的坑
第一,行号错位。显示公式里写 EXTDATA_USER(1,0),扩展数据第一行却放的是二百五十日参数,画出来的线和预期对不上。
第二,口径混用。扩展数据用零到一千归一化,显示公式却按零到一百处理,或者反过来,数值会差十倍。
第三,板块里混进新股与退市股。新股上市初期涨幅极端,会把排名整体推高;建议单独建「上市一年以上」的板块作为计算品种。
第四,加入未来函数。有人为了让曲线好看,套用 ZIG、BACKSET 这类会引用未来数据的函数,回测漂亮,实盘全废。RPS 本身只需要历史涨幅,用不上这些。
第五,把它当交易依据。指标只描述历史强弱,仓位、止损、基本面判断都不在它的职责范围内。看到「RPS 九十以上就能买」这类说法,先想想它在震荡市里的表现。
最后提醒一句:所有参数都要自己动手设一遍,别指望复制一段源码就完事。源码只管画线,排名数据来自扩展数据,两者对不上,图上的线再漂亮也是错的。
