抱团行情是A股市场最折磨普通投资者的阶段之一:指数不涨,核心资产一直涨;指数反弹,强势股反而补跌。很多朋友在这种行情里追高被套、换股踏空,问题不在心态,而在选股逻辑还停留在“找低估值”“等补涨”的旧框架里。我自己的应对方式很朴素——只跟踪强势股,用RPS这个量化指标把“强中更强”的股票筛出来,再跟着它的每日变动找上车点。这套方法我写进了自己的量化分析工具QTYX里,最近升级到V3.4.1,把“每日选股+上车点跟踪”完整打通了。
这篇文章我就把QTYX-V3.4.1的选股逻辑、RPS计算原理、每日变动的跟踪方法、以及实际操作中的经验教训完整拆开来讲。无论你是刚接触量化选股的新手,还是已经在手动复盘强势股的进阶玩家,这篇文章都会给你一套可以直接落地的方法。
1. 抱团行情下,为什么“选强势股”比“选便宜股”更靠谱
1.1 抱团行情的本质是资金偏好高度一致
先搞清楚一个问题:什么叫抱团行情。很多人以为就是“机构买一起买的那几只票”,其实抱团行情更准确的描述是——市场资金的风险偏好高度收敛,只愿意给少数能够持续超预期的方向定价。换句话说,不是低价股或者估值低的股票被抛弃,而是资金根本不在乎“便宜”,只在乎“确定性”和“动量”。
这种环境下,传统的逆向思维会比较吃亏。你看到一只股票跌了很多、市盈率很低、分红率还不错,于是买入埋伏等修复。但在抱团行情中,资金持续从这类股票流出,流进景气度和市场共识度最高的板块,低估值股票甚至可能在一整轮行情中完全不被资金注意。这不是说低估值策略失效,而是在特定阶段,动量因子、景气度因子对收益的解释力远远大于估值因子。我统计过自己在过去两年的模拟组合:单纯按低市盈率筛选的模拟组合,年化收益大约只在个位数;而按RPS动量强度筛选的组合,即便摩擦成本计提之后,年化仍有显著超额。这个对比在我自己的某次复盘笔记里写得很清楚:阶段性的赚钱可能并不需要频繁换股,只需要站在资金聚集的方向,别掉队。
1.2 强势股不是追高,而是跟踪“已经证明自己”的股票
很多新手听到“买强势股”会本能抗拒,觉得就是在追涨。这里要区分两件事:追高是“在股价没有形成强趋势时,因为情绪冲动在短线高位买入”;强势股策略是“在股价已经用相对强度证明了自己之后,等一个良性的回调或者平台突破再介入”。两者看起来行为相似,但背后的依据完全不同。
RPS正是用来量化“已经证明自己”的。RPS的英文全称是Relative Price Strength,中文通常叫相对价格强度。它衡量的是某只股票过去一段时间的涨幅在全部可比股票中的相对排名位置。比如某只股票过去120天的涨幅排名在全市场前5%,那么它的RPS120就是95。这个数字不是绝对涨幅,而是排名百分位。这个设计非常聪明:它过滤掉了大盘整体涨跌的影响,只看个股在整个市场环境中的相对强弱。即使大盘横盘整理,只要一只股票能持续跑赢其他股票,它就能维持高RPS。
用生活化的类比来解释:RPS不是看一个人绝对考了多少分,而是看他在整个年级的排名。大盘涨50%但个股只涨30%,在绝对收益视角下是赚了钱,但在相对排名视角下,它可能连前50%都进不了,根本算不上“强势”。反过来说,大盘跌20%但个股只跌5%,它的排名反而可能非常靠前。所以,RPS专门回答一个问题:谁在当下被资金最持续地认可。
1.3 为什么要用RPS每日变动来跟踪上车点
RPS不是静态指标,它每天都在变。一只股票的RPS从90掉到60,说明它的相对强度正在衰退;另一只从70升到92,说明它正在被资金逐步关注。很多做趋势跟踪的人只会在每个周末看一次RPS排名,这样会漏掉一个关键信息——RPS拐点往往领先于价格拐点。
我理解的上车点本质上是一个“强度确认”的动作。当一只股票从过去不被关注(RPS在60以下徘徊),逐步爬升到RPS80以上,通常意味着资金已经持续介入了10到30个交易日。在这个爬升过程中,“每天观察RPS变动”会让你捕捉到那个由弱转强的关键路口。如果你只在周末看一次,你可能错过了周一至周五里的某根关键突破阳线;如果你每天都记录RPS,你就能在它第一次进入“强势阈值区间”时,结合其他技术条件判断是否介入。
QTYX-V3.4.1的核心改动就在这里:把RPS计算从手动复盘变成了每日自动跟踪,并且在同一张页面里串联“选股结果、RPS曲线、上车候选点”三个环节。
2. RPS指标的核心计算与参数选型,手把手拆解
2.1 计算逻辑与伪代码:一点不玄乎
RPS的计算其实非常简单,不需要复杂的机器学习模型。以最常见的RPS120为例,步骤如下:
- 取全市场A股股票过去120个交易日的涨幅。注意这里要用复权后的价格,否则除权除息会造成计算错误。
- 将每只股票的涨幅按数值从高到低排名。
- 计算该股票涨幅排名所处位置的百分位,即:
RPS = (1 - 排名名次 / 参与计算股票总数) * 100。
举个例子:参与计算的股票总数为4000只,某股票120日涨幅排在第200名,那么它的RPS就是(1 - 200/4000) * 100 = 95。这意味着它的过去120天涨幅领先全市场95%的股票。如果一只股票排在4000名中的第20名,RPS就是约99.5,属于顶级强势。
写成Python代码的话,核心逻辑大概长这样:
import pandas as pd def calc_rps(price_df, window=120): # price_df: DataFrame, index为日期, 每列一只股票, 值为复权收盘价 returns = price_df.pct_change(window) * 100 # 过去window日的涨幅 rank_df = returns.rank(axis=1, ascending=False, pct=True) # 按行排名并转为百分位 rps_df = (1 - rank_df) * 100 return rps_df这段代码看着简单,但有三个细节必须注意,否则结果会失真:
第一,复权处理。直接用不复权价格计算长周期涨幅,分红的股票会被误判为弱势股,尤其是高股息品种。第二,新上市股票过滤。上市不满120天的次新股,不应该参与排名,否则会干扰全市场的百分位分布。第三,停牌股处理。长期停牌复牌后容易出现极端涨幅,最好在计算时剔除停牌超过一定时间的股票,避免排名失真。
2.2 RPS50、RPS120、RPS250选哪个更合适
不同的时间窗口反映不同级别的动量。RPS50代表中短期动量,适合捕捉一到两个月内的市场热点;RPS120代表中期动量,是欧奈尔体系中最重要的一个;RPS250代表长期动量,用来判断一只股票是否处于大牛趋势。
我的习惯是把三者结合成一个多维度的确认机制,而不是单看某一个。比如,RPS250大于90说明长期趋势没有被破坏,RPS120大于90说明中期依然保持强势,RPS50大于80说明短期正在加速。如果三个条件全部满足,这个股票的强势状态就具备了从长到短的一致性。反过来,如果RPS250很高但RPS50已经跌破70,往往意味着长期强势股正在进行中期休整,这反而是关注回调低吸的好时机。
这里有一张我自己常用的组合判断表:
| 组合情况 | 含义 | 操作倾向 |
|---|---|---|
| RPS250>90 且 RPS120>90 | 长中期双强 | 核心观察池,等回调买点 |
| RPS250>90 且 RPS120<70 | 长期强、中期弱 | 调整途中,不急着接飞刀 |
| RPS120>90 但 RPS250<60 | 中期新强势,长期尚未确认 | 首次进入观察池,验证持续性 |
| RPS50连续5日上升且接近90 | 短期资金加速流入 | 结合K线形态寻找启动点 |
2.3 凭什么是87分位这个经典阈值
欧奈尔在《笑傲股市》里给出的经典标准是RPS不低于87,也就是过去一年涨幅排名全市场前13%。这个数值在美股市场验证了很多年,但在A股使用的时候,我建议根据市场环境做适配。
A股散户占比高,情绪波动大,强势股的持续性通常比美股短,所以纯粹用87分位会漏掉一些刚刚启动的中小市值股票。我自己在QTYX里把阈值做成参数,默认为87,但允许在80到90之间调节。在熊市末期,我会调低到80,尽量覆盖更多从底部放量启动的股票;在牛市主升段,我反而会调高到90,只做最强的那一批。
需要注意的是,阈值越低,噪音越多。RPS在80附近时,很多股票可能只是反弹,未必是反转。所以阈值的作用是缩小观察范围,真正的买入决策永远需要叠加其他确认条件。
3. QTYX-V3.4.1的今日选股与每日RPS变动跟踪全流程
3.1 功能模块解析:从数据到建议的管线设计
QTYX-V3.4.1的“今日选股”模块不是简单扔给你一份股票名单,而是一条完整的数据处理管线,大致分为四层:
第一层是数据采集层。程序在每日收盘后自动下载全市场股票的日线数据,包含开高低收、成交量、复权因子等。数据源可以选择本地离线数据接口或者公开行情服务,具体根据你网络环境选择可达的方案。为了避免盘中数据不完整导致计算偏差,默认只使用收盘后的日线数据。
第二层是RPS计算层。系统会分别计算RPS50、RPS120、RPS250,同时会计算一个“RPS综合得分”,也就是三个RPS的加权合成值。权重我在V3.4.1里做了可配置调整,默认是50-120-250按0.2、0.5、0.3来配。为什么120给最高权重?因为中期动量最贴近一个完整主升浪的持续时间尺度,过短容易失真,过长则止损成本太高。
第三层是强势股筛选规则层。在RPS基础上,叠加如下条件:收盘价站在20日均线和50日均线之上;当日成交量大于5日均量的1.2倍;上市时间超过150个交易日;剔除ST类、剔除最近一个财报期亏损的品种。
第四层是输出层。系统会生成每天的选股结果列表,并按“RPS综合得分”降序排列。同时,系统记录每只候选股过去20天的RPS变动轨迹,输出“连续5日上升”“创出近期新高”“高位回落”三类状态标签。这个设计让你一眼看出哪些股票正处于强度爬升阶段。
3.2 每日RPS变动如何转化为可执行的上车点
“上车点”是本版本的核心升级点。我把它设计成三个递进的信号等级,而不是一个简单的“买入”建议:
黄色信号(关注信号):RPS120首次进入80到90区间,同时RPS50大于RPS120,说明中短期动量正在向上追赶。这个时候股票进入观察池,不用急着买,但要开始准备自己的候选逻辑。
橙色信号(确认信号):RPS120站稳90以上,RPS50保持上升趋势,并且股价创出近40日新高。这说明中期趋势已经形成,价格突破得到RPS确认,可以考虑分批试探。
红色信号(加仓信号):红色信号不是让你无脑加仓,而是提示“趋势加速段可能开启”。它要求RPS综合得分连续5天上升,同时股价在10日均线上方,并且当日涨幅大于3%。满足这三个条件时,趋势处于最强的加速段,但同时也意味着风险累积,仓位控制要更谨慎。
代码里判断连续上升的逻辑大概是:
def check_streak(rps_series, days=5): diff = rps_series.diff() return (diff.iloc[-days:] > 0).all()以上信号只是用于研究和复盘,不构成任何投资建议。实盘中我一般只用它来决定“关注谁”,而不是“买多少”,仓位管理单独依靠风险预算模型。
3.3 实操复盘:一次从关注到上车的完整过程记录
为了更直观地说明这个工具怎么用,我用一次模拟复盘来走一遍流程。假设某只科技类个股(这里叫它X公司)在一个横盘区间里震荡了将近一年,RPS120一直在50到65之间徘徊,基本不算强势股。大约在某个阶段,X公司连续三天放量上涨,RPS50从68跳到85,四天后RPS120也开始抬头,系统在第8天给出黄色关注信号。
这个时候我做两件事:第一,查看X公司的基本面报表,确认最近一个季度营收和净利润有没有出现环比改善;第二,把它的周线图调出来,看看当前价格距离前期平台颈线还有多远。第三天,X公司在一个放量长阳里突破平台,RPS120升到93,系统给出橙色确认信号。按照我自己的模拟规则,这个位置是首次试探点。
随后股价缩量回踩五日线,RPS50短暂回落到82,但RPS120仍保持在90以上。这个回调不破关键均线的动作,让系统在回踩结束重新放量那一天的盘后提示“红色加速信号”。那一段才是模拟组合里最舒服的持仓阶段。整个过程中我没有依赖任何情绪判断,只是每天收盘后看一次RPS的变动方向和它对应的状态标签。
4. 实操中的常见问题与避坑经验实录
4.1 数据清洗不合理,RPS第一名是垃圾数据
我在开发QTYX早期版本时踩过一个很典型的坑:某一天计算出来的RPS第一名竟然是一只长期停牌后复牌的股票,单日涨幅500%,直接把排名全部打乱。如果没处理这种情况,整个选股列表都会被污染。
现在我在数据清洗层做了三条硬性约束:第一条,计算窗口内停牌超过20%交易日的股票直接剔除;第二条,上市不足计算窗口的股票不参与排名;第三条,单日涨幅超过50%的极端数据用前收盘价重新校验,确认是真实行情而非数据错误。这三条看着简单,但能避免80%的脏数据问题。包括复权因子偶尔漂移的问题,我也在代码里加入了价格涨跌幅超限自动校验的机制,一旦涨幅超过阈值就调用复权接口二次比对。
4.2 RPS高位钝化,追进去就吃面
高RPS股票不是只涨不跌。最难受的情况是:你看好一只股票,RPS也确实是96的超强水平,但买入后就开始高位横盘甚至连续阴跌。这就是RPS高位钝化现象,核心原因是龙头股已经被广泛关注,预期被过度透支,后期只要增量资金放缓,就会进入累积派发阶段。
应对高位钝化我只有两个办法。第一,回到RPS变动曲线上找“初次突破”而非“长期高位”。长期站在95以上的股票,我默认它已经走到了行情的中后段;我更倾向于找那些过去20天内从80以下突破到90以上的股票,这种“新晋强势”的赔率往往更好。第二,在RPS高位股票上严格设置止损纪律。无论RPS多高,只要股价跌破20日均线且RPS50连续3天下滑,我就把模拟组合中的关注等级下调甚至剔除。
4.3 大盘系统性风险的干扰如何过滤
RPS是一个相对强度指标,它天然过滤了大盘方向的影响,但这同时也意味着当大盘发生系统性下跌时,几乎没有股票能保持高RPS,强行筛选会得出一个空集。这是正确的,不是BUG。
有一次我在模拟运行时遇到过连续三天选股为空的情况。当时我差点以为程序出错了,后来检查发现是大盘连续暴跌,强势股也扛不住。处理方式其实很简单:在系统里加了一个“大盘环境过滤器”,只有当指数20日均线向上、且市场上涨家数占比超过40%时,才启动每日选股输出;否则系统只输出“市场环境不适合追强”的提示。手动复盘的时候也一样,大盘单边下跌阶段不要强行选股,空仓本身就是一种策略。
4.4 QTYX流程里容易被忽略的细节
最后补充几个实操容易忽略的小地方:
第一,数据下载要尽量在每天收盘后延后半小时再做,过早下载容易拿到未完全定盘的尾盘数据,系统的RPS计算会因为最后一笔成交价波动而产生误差。第二,复权开关一定要保持在“前复权”,不复权计算长周期涨幅基本就是在给自己挖坑。第三,RPS每日变动日志建议至少保留90天,因为在复盘某一笔交易到底是做对了还是做错了的时候,只有RPS轨迹能真实还原当时的强度变化过程。第四,别的工具导出的Excel你在启动前最好确认列名一致性,我遇到过表头从“收盘价”变成“close”导致代码直接报错的情况。
5. 从今日选股到完整量化决策,工具化只是第一步
QTYX-V3.4.1把“今日选股”和“RPS每日变动”做成了一条流水线,这确实解决了我很大的复盘工作量。以前至少需要两小时才能完成的功课,现在收盘后十几分钟就能拿到一份结构化的观察列表和状态标签。但这不代表万事大吉,工具的价值上限取决于使用者的交易纪律。
我在用这套系统过程中最大的体会是:RPS帮你找到的是“值得关注的股票”,它不会替你回答“什么价位买多少”。如果只看RPS就重仓,那是把选股工具当成了交易圣杯,迟早会栽在止损执行上。更成熟的用法是把RPS当成一道高强度过滤器,过滤之后再叠加基本面审查、回撤空间评估和仓位预算,整套流程才是完整的。
今天这篇内容如果非要给你一个直接的记忆锚点,那就是:强势股不是猜出来的,是比出来的;RPS不是让你追高,而是告诉你谁在持续变强。把这个观念刻进脑子,再配合QTYX这类工具去跟踪每日变动,你会在抱团行情里活得比大部分人都舒服。这次升级之后,我后续大概率还会加入板块联动强度的RPS排名,因为个股的强势和板块的强势往往是互相印证的。这个方向我觉得值得继续深挖,也希望这套方法能成为你建立自己选股框架的一个起点。